¿Qué son las expresiones lambda en Python?

Autor: | Última modificación: 15 de diciembre de 2022 | Tiempo de Lectura: 3 minutos
Temas en este post: , ,

Valores y nombres

En Python, cuando creamos una variable, en el fondo lo que estamos haciendo es darle un nombre a un valor. Por ejemplo, al valor 42 le podemos dar el nombre answer.

answer = 42

Podemos hacer lo mismo con cualquier otro tipo de valor, no solo números: listas, cadenas, diccionarios, etc.

Sabiendo esto, ¿qué significa la sintaxis habitual para definir una función?

def addOne(n):
	return n + 1

Estamos creando una función definida por el cuerpo de la función (n + 1) y le damos el nombre addOne. 

Es decir, es lo mismo de antes, pero usando una función como valor (en vez de un número). Esto es perfectamente válido en Python, ya que las funciones también son valores (cosas a las que se les puede dar un nombre para reutilizarlas después).

Al valor a pelo (n + 1) se le llama función anónima; por razones obvias, no tiene nombre (hasta que se lo demos). 

De la misma forma que resulta cómodo manejar valores sin un nombre, también lo es poder manejar funciones sin nombre. En Python, sobre todo cuando empiezas, no estás acostumbrado a ello y puede parecer raro, pero es exactamente lo mismo.

[1,2,3,4] 	# lista anónima
54		# número anónimo
(‘Hola’, 3.14)	# tupla anónima

Funciones Anónimas

Las expresiones lambda son una forma de definir funciones sin nombre. La plantilla es la siguiente:

lambda <params>: <cuerpo de la función sin return>

Una limitación de las expresiones lambda en Python es que solo pueden tener una línea. Por lo tanto, solo pueden usarse para cosas muy sencillas. En otros lenguajes esa limitación no existe, es una manía de Python. Además, no hace falta la palabra clave return, se devolverá el valor de expresión en sí.

Veamos un ejemplo, a ver si te das cuenta de algo interesante:

addOne = lambda n : n + 1

Si te fijas, esto es exactamente lo mismo que la anterior definición de addOne:

  1. Creamos una función que suma 1 a su único parámetro.
  2. Le damos un nombre.

Las dos declaraciones hacen lo mismo.

¿Para qué se usan las expresiones lambda?

Pues para cosas muy sencillas que no se vayan a reutilizar mucho. Un ejemplo típico es para cuando usas una función que recibe entre sus parámetros a otra función. El parámetro suele ser una expresión lambda.

a = [(1, 2), (4, 1), (9, 10), (13, -3)]
a.sort(key=lambda x: x[1])

print(a)
# Output: [(13, -3), (4, 1), (1, 2), (9, 10)]

¿Por qué lambda?

Mira que es un nombre raro. ¿De dónde sale eso de lambda? ¿Algún perturbado de la historia antigua y de los espartanos?

¿Qué son las expresiones lambda en Python? 1
Los soldados espartanos llevaban todos un escudo con la letra lambda mayúscula (Λ) inscrito. Era por el nombre de su tierra (Esparta era solo la capital): Lacedemonia.

¿De dónde porras sacaron esto los informáticos? Además, es un nombre común para las funciones anónimas en cualquier lenguaje: Python, C++, Haskell, etc.
Viene de una rama de las matemáticas llamada cálculo lambda, que fue creada por Alonzo Church (sí, con z), uno de los Grandes Dioses de la informática (la Trinidad serían Church, Von Neuman y Turing). Se trata de la base matemática que subyace debajo de todos los lenguajes funcionales y es una especie de jiu-jitsu de las funciones matemáticas.

¿Qué son las expresiones lambda en Python? 2
Alonso Church dando clase en Stanford.

En su obra, Church utiliza una representación un poco distinta de las funciones. En el cole, usábamos algo así para representar una función:

f(x) = x + 1

Esta nomenclatura, la más común, la inventó Isaac Newton. Alonso Church usaba una diferente, con una lambda minúscula (λ):

λx. x + 1

De ahí viene lo de expresiones lambda

Ahora bien, ¿por qué Church eligió la letra griega lambda? Ni idea. 

¡Hasta ahí llego yo!  ¯\_(ツ)_/¯