Lecciones del módulo (4/4)
Lambda y funciones de orden superior
Una lambda es una función anónima, definida en una sola línea. Sintaxis:
lambda parametri: espressioneEquivalente a def, pero más concisa y adecuada para funciones "desechables"
para pasar a otras funciones.
quadrato = lambda x: x ** 2
quadrato(5) # 25
# equivalent to:
def quadrato(x):
return x ** 2Diferencias frente a def
| Aspecto | def | lambda |
|---|---|---|
| nombre | obligatorio | anónimo |
| cuerpo | múltiples sentencias | una SOLA expresión |
| retorno | explícito | implícito (la expresión) |
| docstring | sí | no |
Sin return dentro de una lambda: el valor de la expresión ES el resultado.
Cuándo usar lambda
Casi siempre: como argumento key para funciones de ordenación o selección.
parole = ["banana", "kiwi", "mela", "fragola"]
sorted(parole, key=len)
# ['kiwi', 'mela', 'banana', 'fragola']key=len le dice a sorted: "para comparar dos elementos, usa su longitud". Para
criterios personalizados, usa lambda:
utenti = [
{"nome": "Ada", "eta": 36},
{"nome": "Linus", "eta": 54},
{"nome": "Grace", "eta": 85},
]
per_eta = sorted(utenti, key=lambda u: u["eta"])
# sorted by ascending ageOtros usos típicos: min(...), max(...), filter(...), map(...).
nums = [-3, 1, -4, 1, -5, 9]
max(nums, key=lambda n: abs(n)) # -5 (maximum by absolute value)Funciones de orden superior
Una función es de orden superior si acepta una función como argumento o
devuelve una. sorted, max, filter, map son de orden superior. Lambda
existe precisamente para facilitar las llamadas de orden superior.
Cuándo evitar las funciones lambda
Las funciones lambda son útiles para operaciones cortas y de un solo uso (como la ordenación rápida). Sin embargo, si te encuentras asignando una lambda a una variable (ej. double = lambda x: x * 2), generalmente se prefiere usar un bloque def estándar por razones de legibilidad y depuración (ya que las funciones definidas con def conservan sus nombres reales en los rastreos de errores).
Pruébalo tú
Dada la lista `words = ['banana', 'kiwi', 'mela', 'fragola']`, ordénala por longitud ascendente en `by_length`. Evalúa `by_length`.
Mostrar pista
key=len (o lambda p: len(p)).
Solución disponible después de 3 intentos
Ejercicio de repaso
Dada la lista de tuplas `points = [(1, 5), (3, 2), (2, 4)]`, ordénalas por el SEGUNDO elemento en orden ascendente y asígnalas a `by_y`. Evalúa `by_y`.
Mostrar pista
lambda p: p[1]
Solución disponible después de 3 intentos
Desafío adicional
Define una función `lambda` anónima que tome un número `x` y devuelva `True` si el número es par, y `False` en caso contrario. Asigna la lambda a la variable `is_even` y pruébala con `is_even(8)` como última línea.
Mostrar pista
Escribe is_even = lambda x: x % 2 == 0 y luego llama a is_even(8).
Solución disponible después de 3 intentos