Menu

Lambda en Python: funciones anónimas, sort key y map/filter

Qué es lambda, para qué sirve y el puñado de sitios donde realmente se gana su sitio — más cuándo recurrir a una función con nombre en su lugar.

Una función a la que no te molestas en poner nombre

La mayoría de funciones en Python se definen con def, tienen nombre y viven en un archivo donde se pueden reutilizar. Una lambda es una alternativa más pequeña y sin nombre — útil en el puñado de casos donde definir una función completa sería más ceremonia que beneficio.

Aquí la tienes lado a lado:

main.py
Output
Click Run to see the output here.

Dos funciones, ambas haciendo exactamente lo mismo. La versión lambda cabe en una línea porque básicamente es su trabajo: una función desechable para un momento desechable.

Sintaxis

lambda <params>: <expression>

  • <params> es la misma lista de parámetros que usaría un def — soporta defaults, *args, **kwargs.
  • <expression> es una sola expresión cuyo valor se convierte en el valor de retorno.

Ejemplos:

main.py
Output
Click Run to see the output here.

Sin palabra clave return. El valor de la expresión se devuelve implícitamente.

La única limitación

Una lambda solo puede contener una única expresión. No puedes meter sentencias en ella:

main.py
Output
Click Run to see the output here.

Pero puedes usar la expresión ternaria:

main.py
Output
Click Run to see the output here.

Si necesitas más de una expresión, esa es tu señal para pasarte a def.

Dónde se ganan su sueldo las lambdas

Una lambda asignada a una variable es casi siempre peor que un def con nombre:

main.py
Output
Click Run to see the output here.

Eso es estrictamente peor que def double(x): return x * 2 — la misma legibilidad, más la versión lambda da a los debuggers el nombre poco útil <lambda> en los stack traces.

Las lambdas brillan en exactamente un sitio: como argumentos inline para funciones de orden superior.

Claves de ordenación personalizadas

El caso clásico:

main.py
Output
Click Run to see the output here.

El argumento key de sorted quiere una función que tome un elemento y devuelva el valor por el que ordenar. Una lambda de una línea encaja perfectamente — y usar un def completo se sentiría pesado para algo tan pequeño.

Puedes ordenar por varios campos usando una tupla:

main.py
Output
Click Run to see the output here.

min, max, filter, map

Historia similar — todos aceptan un argumento función opcional:

main.py
Output
Click Run to see the output here.

Para map y filter, una list comprehension suele ser todavía más clara:

main.py
Output
Click Run to see the output here.

La mayoría de Pythonistas recurren a las comprehensions sobre map/filter por esta razón. lambda sigue siendo un encaje natural para sorted, min y max donde no hay atajo con comprehension.

Lambdas y el módulo operator

Cuando tu lambda es solo "coge una clave" o "coge un atributo", el módulo operator de Python tiene alternativas más rápidas y claras:

main.py
Output
Click Run to see the output here.

No es una gran victoria, pero en código que ya importa operator se lee un poco más declarativamente.

Cuándo volver a def

Si alguna de estas es verdadera, escribe un def:

  1. La lógica no cabe limpiamente en una sola expresión.
  2. Quieres nombrar la función porque el nombre ayudaría a la legibilidad.
  3. Usarías la misma lógica en más de un sitio.
  4. La función necesita una docstring (las lambdas no pueden llevar una).

Recuerda: Python no se puntúa por número de líneas. Una función con nombre de tres líneas casi siempre se lee mejor que una lambda de una línea cuando la lógica es no trivial.

Siguiente: decoradores

Las lambdas pasan funciones como valores. Los decoradores llevan la misma idea un paso más allá: te dejan envolver cualquier función con comportamiento reusable — logging, timing, caché, auth — usando un solo @ en la línea de arriba. Esa es la siguiente página.

Preguntas frecuentes

¿Qué es una lambda en Python?

Una lambda es una función corta y anónima que puedes escribir en una sola línea. lambda x: x * 2 es equivalente a def double(x): return x * 2, salvo por no tener nombre. Es más útil cuando necesitas una función diminuta como argumento para otra función.

¿Cuándo debería usar lambda en vez de def?

Usa lambda para funciones de una sola vez y una sola expresión que pases directamente a algo como sorted, max o filter. Para cualquier cosa con un cuerpo más largo que una sola expresión — o para cualquier cosa a la que darías nombre — usa def. Las funciones con nombre son casi siempre más claras.

¿Cuáles son los límites de lambda?

Una lambda solo puede contener una única expresión, no sentencias. Sin asignaciones, sin bloques if (aunque puedes usar el ternario a if cond else b), sin lógica multilínea. Si te estás peleando con esos límites, pásate a def.

Aprende a programar con Coddy

COMENZAR