18 · Funciones lambda
Funciones anónimas de una línea para sorted, map, filter y df.apply — y cuándo una def con nombre es la mejor opción.
`lambda params: expresión` crea una función sin nombre en el momento — perfecta para una función clave de uso único pasada a `sorted()`, `map()` o `filter()` donde un `def` completo sería más ceremonia que código.
Sin esto:
Sin lambdas, cada función clave inline para ordenar o filtrar requiere un `def` nombrado tres líneas antes de la llamada — fragmentando la lógica a lo largo del archivo y dificultando leer la intención de ordenamiento de un vistazo.
lambda parámetros: expresión es azúcar sintáctica para una función simple que consiste en una única expresión — sin def, sin return, sin cuerpo. El resultado de la expresión se devuelve automáticamente. Las lambdas son más útiles como funciones clave inline para sorted(), min(), max(), map(), filter() y df.apply() de Pandas. Deben mantenerse cortas: si necesitas más de una expresión, o quieres reutilizar la función, nómbrala con def.
Python (in browser)
`key=lambda x: x[1]` le dice a `sorted` cómo extraer la clave de comparación de cada elemento — el orden es por esa clave, no por la tupla completa. Una línea, se lee como prosa.
Python runs entirely in your browser via Pyodide (~6 MB on first Run, cached after).
Python (in browser)
Cuando una lambda necesitaría un comentario para entenderse, escribe un `def` en su lugar. El nombre de la función se convierte en documentación gratuita — y aparece en los tracebacks con un nombre legible en lugar de `<lambda>`.
Python runs entirely in your browser via Pyodide (~6 MB on first Run, cached after).
PEP 8 y la regla `E731` de ruff prohíben asignar una lambda a un nombre — usa `def` en su lugar. Las lambdas pertenecen al uso inline, no como variables con nombre.
¿A qué evalúa `(lambda x: x * 2)(5)`?
- `lambda params: expr` — función anónima de expresión única. Ideal como `key=` inline para `sorted()`, `min()`, `max()`, `map()`, `filter()` o `df.apply()`.
- Cuando la lógica necesita un comentario, necesita reutilizarse o es más larga que una expresión — escribe un `def`. Las funciones con nombre tienen docstrings, tracebacks legibles y sin advertencias del linter.
- Nunca asignes una lambda a un nombre (`fn = lambda x: ...`). ruff/flake8 lo marcan como E731 — la forma `def` siempre es mejor.
Ordenar checkpoints por pérdida de validación: `sorted(history, key=lambda h: h['val_loss'])`. Crear un scorer personalizado en scikit-learn: `make_scorer(lambda y, yp: -mse(y, yp))`. Transformaciones de columnas de Pandas de un solo uso: `df['score_pct'] = df['score'].apply(lambda x: round(x * 100, 1))`. Estas lambdas inline mantienen el pipeline circundante legible sin contaminar el espacio de nombres del módulo.
Si lo quitas: Sin lambdas, cada clave de ordenamiento inline o transformación de un solo uso requiere una función con nombre definida en otro lugar del archivo. En notebooks exploratorios, este fraccionamiento de la intención entre celdas hace el código más difícil de seguir y revisar.