Expresiones Lambda

Las expresiones lambda se usan idealmente cuando necesitamos hacer algo simple y estamos más interesados en hacer el trabajo rápidamente en lugar de nombrar formalmente la función. Las expresiones lambda también se conocen como funciones anónimas.

Las expresiones lambda en Python son una forma corta de declarar funciones pequeñas y anónimas (no es necesario proporcionar un nombre para las funciones lambda).

Las funciones Lambda se comportan como funciones normales declaradas con la palabra clave def. Resultan útiles cuando se desea definir una función pequeña de forma concisa. Pueden contener solo una expresión, por lo que no son las más adecuadas para funciones con instrucciones de flujo de control.

Sintaxis de una función Lambda

lambda argumentos: expresión

Las funciones Lambda pueden tener cualquier número de argumentos, pero solo una expresión.

Código de ejemplo:

# Función Lambda para calcular el cuadrado de un número
square = lambda x: x ** 2
print(square(3)) # Resultado: 9

# Funcion tradicional para calcular el cuadrado de un numero
def square1(num):
  return num ** 2
print(square(5)) # Resultado: 25

En el ejemplo de lambda anterior, lambda x: x ** 2 produce un objeto de función anónimo que se puede asociar con cualquier nombre. Entonces, asociamos el objeto de función con square. De ahora en adelante, podemos llamar al objeto square como cualquier función tradicional, por ejemplo, square(10)

Ejemplos de funciones lambda

Principiante

lambda_func = lambda x: x**2 # Funcion que recoge un número entero y devuelve su cuadrado
lambda_func(3) # Retorna 9

Intermedio

lambda_func = lambda x: True if x**2 >= 10 else False
lambda_func(3) # Retorna False
lambda_func(4) # Retorna True

Complejos

mi_dicc = {"A": 1, "B": 2, "C": 3}
sorted(mi_dicc, key=lambda x: my_dict[x]%3) # Retorna ['C', 'A', 'B']

Casos de uso

Supongamos que desea filtrar los números impares de una  lista. Podrías usar un bucle for:

mi_lista = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
filtrado = []

for num in mi_lista:
     if num % 2 != 0:
         filtrado.append(num)

print(filtrado)      # Python 2: impresión de filtrado
# [1, 3, 5, 7, 9]

O podría escribir esto en una línea con comprensión de listas (list-comprehensions). La compresión de listas ofrece una sintaxis más corta cuando deseas crear una nueva lista basada en los valores de una lista existente:

filtrado = [x for x in [1, 2, 3, 4, 5, 6, 7, 8, 9, 10] if x % 2 != 0]

Pero es posible que tengas la tentación de utilizar la función integrada filter. ¿Por qué? El primer ejemplo es demasiado detallado y la frase de una sola línea puede ser más difícil de entender. Pero filter ofrece lo mejor de ambas palabras. Además, las funciones integradas suelen ser más rápidas.

mi_lista = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

filtrado = filter(lambda x: x % 2 != 0, mi_lista)

list(filtrado)
# [1, 3, 5, 7, 9]

NOTA: en Python 3, las funciones integradas devuelven objetos generadores, por lo que se debe llamar la función list. La función list crea un objecto de lista.  En Python 2, por otro lado, devuelven una lista, tupla o  string.

¿Entonces qué ha ocurrido? Le dijiste a filter que tomara cada elemento en mi_lista y aplicara la expresión lambda. Los valores que devuelven False se filtran.

Más información:

Traducido del artículo Lambda Expressions in Python