Objetivo: mostrar que las funciones son objetos e ilustrar su uso como argumentos de otras funciones.
Lo hemos dicho ya en alguna que otra ocasión: en Python todo son objetos. Incluso una función es un objeto.
Obsérvalo:
>>> def saluda(nombre):
print('Hola', nombre)
>>> saluda('Javier')
Hola Javier
>>> type(saluda)
<class 'function'>
>>> print(saluda)
<function saluda at 0x02500078>
Esta circunstancia nos permite ciertos usos que pueden parecer estrambóticos a simple vista. Si una función es un objeto, tiene derecho a que se le trate como tal, bajo riesgo de protestar por agravio comparativo.
Entre otras cosas, tiene derecho a que se use su nombre en asignaciones:
>>> bienvenida = saluda
De modo que ya podemos realizar invocaciones como:
>>> bienvenida('Pedro')
Hola Pedro
Ambos nombres, saluda y bienvenida, referencian al mismo objeto función:
>>> id(bienvenida)
38797432
>>> id(saluda)
38797432
El nombre de una función también puede ser pasado como argumento de otra función.
Vamos a ilustrarlo con un ejemplo muy sencillo. Imagínate que tenemos dos funciones de tarificación diferentes por un mismo servicio. A los clientes normales les aplicaremos un rasero, pero a los más pudientes les daremos una pequeña clavada y su factura será mayor.
def tarifar(horas):
importe = horas * 20 # Cobramos 20 euros la hora
return importe
def tarifarplus(horas):
importe = horas * 60 # Cobramos 60 euros la hora
return importe
La función tarifar()
toma como argumento el número de horas trabajadas y devuelve el importe correspondiente a una tasa de 20 euros la hora. La función tarifarplus()
tiene como diferencia el pequeño detalle de que el precio por hora es mayor.
Observa ahora la definición de esta otra función:
def facturar(funcion_tarificacion, horas):
return funcion_tarificacion(horas)
Como argumentos le pasaremos, además de las horas empleadas, el nombre de la función con la que realizaremos la facturación, función que será empleada para devolver el importe final.
Veamos un ejemplo de invocación de la función facturar()
en un intérprete interactivo:
Si tienes poco dinero:
>>> facturar(tarifar, 5)
100
Pero, si te sobra la pasta, te mereces pagar más:
>>> facturar(tarifarplus, 5)
300
Justicia social.
Javier Montero Gabarró
El texto de este artículo se encuentra sometido a una licencia Creative Commons del tipo CC-BY-NC-ND (reconocimiento, no comercial, sin obra derivada, 3.0 unported)
El Club del Autodidacta
Consulta el índice completo de artículos relacionados con Python.