22. Funciones de orden superior - manuelmarinduque/Apuntes_Python_3 GitHub Wiki
Una función lambda es una pequeña función que simplifica la sintaxis de una función convencional sencilla, no compuesta de condicionales, bucles y demás (p.e una función que realice una operación matemática). Por lo tanto, toda función lambda puede expresarse como una convencional (pero no viceversa). También se llaman funciones anónimas porque no se declaran de manera estándar utilizando la instrucción def,
nombre_funcion = lambda arg1, arg2,..., argn:expresión
# Llamado a la función:
nombre_funcion(arg1, arg2,..., argn)
Estas funciones pueden tomar cualquier número de argumentos y retornar sólo un resultado definido por una expresión. A través de nombre_funcion se llama a la función lambda, pasando sus argumentos.
Esta función verifica que los elementos de una estructura iterable cumplen una condición sencilla, retornando una lista con los resultados. En otras palabras, la función filter construye una lista con aquellos elementos en los cuales funcion(iterable[i]) retorna True.
nombre_lista = filter(funcion, iterable))
En una función convencional la condición se define en su interior, retornando True:
def numero_par(num):
if num % 2 == 0:
return True
numeros=[17,24,7,39,8,51,92]
lista_pares = filter(numero_par, numeros)
print(list(lista_pares))
En una función lambda la condición se define en su expresión, el return True es implícito:
numeros=[17,24,7,39,8,51,92]
print(list(filter(lambda numero_par:numero_par%2==0, numeros)))
Muy útil a la hora de filtrar una lista de objetos.
class Empleado:
def __init__(self, nombre, cargo, salario):
self.nombre=nombre
self.cargo=cargo
self.salario=salario
def __str__(self):
return "{} que trabaja como {} tiene un salario de {} $".format(self.nombre, self.cargo, self.salario)
listaEmpleados=[
Empleado("Juan", "Director", 750000),
Empleado("Ana", "Presedente", 85000),
Empleado("Antonio", "Administrativo", 750000),
Empleado("Sara", "Secretaria", 25000),
Empleado("Mario", "Botones", 21000),
]
salario_altos=filter(lambda empleado:empleado.salario>50000, listaEmpleados)
for i in salarios_altos:
print(i)
Aplica una función a cada elemento de una estructura iterable, retornando un objeto iterable con los resultados por lo que debe ser casteado a una lista. Su sintaxis es similar a filter().
Con la función map() se puede realizar decisiones complejas y aplicarlas a una estructura iterable:
Del ejemplo anterior, otorgar a cada empleado con salario menor o igual 50 mil una comisión del 3%:
def calculo_comision(empleado):
if empleado.salario<=50000:
empleado.salario = empleado.salario*1.03
return empleado
empleadosComision = list(map(calculo_comision, listaEmpleados))
for i in empleadosComision:
print(i)