Funciones lambda

Hay escenarios en los que queremos definir funciones muy sencillas y no necesitamos ni siquiera darles un nombre. La palabra reservada lambda nos permite este tipo de definiciones. La estructura general de estas funciones es la siguiente:

f = lambda x:codigo

Algunos comentarios al respecto:

  • La función creada no tiene nombre. En este caso estamos asignando la función lambda a una variable f a través de la cual la invocaremos, pero ni siquiera es siempre necesario hacer esto. Veremos en breve un ejemplo.
  • Tras la palabra reservada lambda añadimos el argumento (o argumentos) de entrada -podemos tener más de uno-.
  • A continuación de los argumentos deberemos añadir el carácter ":".
  • Tras el carácter ":" deberemos escribir el código de la función, que deberá estar formada por una única expresión.

Un ejemplo sencillo de función lambda: Supongamos que queremos calcular el cuadrado de un número. Podríamos crear una función para esto:

def square(n):
    return n ** 2

 

print(square(2))
print(square(5))

4
25

Pero también podríamos definir una función lambda, y asignarla a una variable, llamémosla square también:

square = lambda n: n ** 2

 

print(square(2))
print(square(5))

4
25

Tanto si definimos la función con def como si la definimos con lambda la definición de la función es realmente simple. Te estarás preguntando entonces qué utilidad tiene la función lambda: el hecho es que hay escenarios en los que no es físicamente posible definir una función "normal" o, simplemente, no es conveniente su uso. Por ejemplo, veamos la función integrada filter que no vimos en la sección correspondiente (si recuerdas, ya comentamos que irían saliendo otras funciones integradas). Esta función acepta dos argumentos de entrada: una función y un iterable. Y devuelve los elementos del iterable para los que la función devuelva True. Es decir, la estructura de la función es:

resultado = filter(función, iterable)

Y la pregunta que debemos hacernos es ¿cómo metemos una función en la posición de un argumento? La respuesta ya la conocemos: con una función lambda. Veamos un ejemplo: Partimos de una lista de números enteros, positivos y negativos, y queremos extraer solo los positivos:

resultado = filter(lambda n: n > 0, [-2, 3, 0, -1, 4])
list(resultado)

Como vemos, la función lambda definida acepta un único argumento de entrada, n, y devuelve el resultado de evaluar la expresión n > 0. Es decir, si n es mayor que cero la función devuelve el booleano True. Y si no lo es, devuelve False. Para la lista de números [-2, 3, 0, -1, 4] los resultados devueltos van a ser [False, True, False, False, True], y la función filter va a devolver, tal y como se ha comentado, los elementos para los que la función devuelva True: el segundo elemento (2) y el último (4). En el ejemplo se ha convertido a lista el resultado devuelto por la función filter pues, como ya sabemos que ocurre en ocasiones, dicho resultado es una estructura de datos no visible directamente.

Comentábamos al principio de este bloque que una función lambda ni siquiera tiene que ser asignada a una variable. Y esto es así porque podemos usar la función lambda directamente:

(lambda n: n ** 2)(5)

25