Las funciones lambda son funciones anónimas y breves creadas con la palabra clave lambda. Se utilizan cuando una operación pequeña debe pasarse como argumento, especialmente para ordenar, transformar o filtrar datos. Son útiles, pero no deben sustituir a todas las funciones creadas con def.
Sintaxis básica
Una lambda recibe parámetros, contiene una sola expresión y devuelve automáticamente el resultado:
doble = lambda numero: numero * 2
print(doble(5))La forma equivalente con def sería:
def doble(numero):
return numero * 2Para revisar parámetros y resultados, consulta la guía de funciones en Python y el artículo sobre return.
Ordenar con una clave personalizada
Uno de los usos más claros aparece con sorted:
usuarios = [
{"nombre": "Ana", "edad": 31},
{"nombre": "Luis", "edad": 24},
{"nombre": "Marta", "edad": 28},
]
ordenados = sorted(
usuarios,
key=lambda usuario: usuario["edad"]
)La lambda extrae la edad de cada diccionario. Al ser una operación local y sencilla, mantiene el código compacto.
Ordenar por varios criterios
La clave puede devolver una tupla:
productos = [
("Teclado", 50),
("Ratón", 20),
("Monitor", 200),
]
ordenados = sorted(
productos,
key=lambda producto: (producto[1], producto[0])
)Python ordena primero por precio y después por nombre.
Usar lambda con map
map aplica una función a cada elemento:
numeros = [1, 2, 3, 4]
cuadrados = list(map(lambda n: n ** 2, numeros))En muchos casos, una comprensión de lista resulta más legible:
cuadrados = [n ** 2 for n in numeros]Elige la forma que exprese mejor la intención. No uses lambda solo por reducir líneas.
Usar lambda con filter
filter conserva elementos para los que la función devuelve un valor verdadero:
numeros = [1, 2, 3, 4, 5, 6]
pares = list(filter(lambda n: n % 2 == 0, numeros))También puede escribirse como [n for n in numeros if n % 2 == 0]. Las comprensiones suelen ser más familiares para lectores de Python.
Lambdas con varios parámetros
Una lambda puede recibir varios argumentos:
calcular_total = lambda precio, cantidad: precio * cantidad
print(calcular_total(12.5, 4))También admite valores predeterminados, aunque una firma compleja suele indicar que conviene usar def.
Closures y captura de variables
Las lambdas pueden usar variables del entorno:
def crear_multiplicador(factor):
return lambda numero: numero * factor
por_tres = crear_multiplicador(3)
print(por_tres(10))Este patrón crea una closure. Debes tener cuidado al generar lambdas dentro de bucles, porque la variable puede evaluarse más tarde. Una solución es capturar el valor como argumento predeterminado.
Lambda y *args
La sintaxis admite argumentos flexibles, pero la legibilidad empeora rápidamente. La guía de *args y **kwargs explica cuándo estas firmas son apropiadas. Si una lambda necesita validación, múltiples pasos o manejo de errores, crea una función con nombre.
Limitaciones
El cuerpo solo puede contener una expresión. No puede incluir sentencias como try, while, for tradicional o varias asignaciones. Las expresiones condicionales sí son posibles:
estado = lambda edad: "adulto" if edad >= 18 else "menor"Una condición sencilla puede ser aceptable. Las condiciones anidadas suelen ser difíciles de leer.
Depuración y documentación
Las lambdas tienen un nombre genérico en trazas y no admiten una docstring convencional como una función con def. Por eso no son ideales para lógica importante. Una función con nombre facilita pruebas, perfilado y mensajes de error. Para investigar rendimiento, revisa cProfile en Python.
Type hints
No existe una sintaxis directa para anotar los parámetros dentro de una lambda. Puedes anotar la variable con Callable:
from collections.abc import Callable
operacion: Callable[[int, int], int] = (
lambda a, b: a + b
)La guía de type hints explica Callable y otras anotaciones.
Cuándo usar lambda
Úsala cuando la operación sea breve, local y evidente: una clave de ordenación, una transformación pequeña o un callback simple. Usa def cuando necesites reutilización, documentación, varias expresiones, validación, anotaciones detalladas o pruebas independientes.
La referencia oficial de expresiones lambda define su sintaxis, y el tutorial oficial presenta ejemplos básicos. El mejor código no es el más corto, sino el que permite comprender rápidamente la intención.
Captura tardía dentro de bucles
Este ejemplo sorprende a muchos desarrolladores:
funciones = []
for i in range(3):
funciones.append(lambda: i)
print([funcion() for funcion in funciones])Las tres funciones consultan el valor final de i. Para capturar cada valor en el momento de creación, usa un argumento predeterminado: lambda i=i: i. Comprender esta evaluación tardía evita errores en callbacks y tareas programadas.
Lambda como argumento de callback
Interfaces gráficas y bibliotecas de eventos suelen recibir una función que se ejecutará más tarde. Una lambda puede adaptar argumentos de manera breve:
def procesar(nombre):
print(f"Procesando {nombre}")
callback = lambda: procesar("informe.csv")
callback()Si el callback crece, dale un nombre con def. Los nombres comunican intención y producen trazas de error más útiles.
Legibilidad antes que concisión
Una lambda de una línea puede contener condicionales, llamadas y accesos anidados, pero que sea posible no significa que sea recomendable. En revisiones de código, pregunta si un lector puede entenderla sin detenerse. Si la respuesta es no, una función con nombre, variables intermedias y una docstring será una mejor inversión.






