Expresiones Lambda en Python 3

Las expresiones lambda son formas de declarar una función corta y anónima, quiere decir que carecen de nombre. Este tipo de funciones no necesitan declararse con la palabra clave def pero se comportan igual.

Las funciones lambda suelen utilizarse para definir funciones pequeñas y concretas, permiten varios parámetros pero solo una expresión y no requieren de la instrucción return. Por eso, las funciones lambda no son las más adecuadas para aquellas que necesitan instrucciones de control de flujo.

Sintaxis de expresiones lambda

Este tipo de función tiene una sintaxis muy limpia y se lee en una sola línea. Veamos cuando aplicar cada una de ellas:

(lambda parámetros: expresión)
o
my_function = lambda parámetros: expresión

La diferencia entre asociarle un nombre y no hacerlo, dependerá de si vas a utilizarla una vez o varias. En el caso de que solo tengas que usarla una vez, basta con declarar la función en la misma línea y llamarla como en el primer ejemplo.

Comparemos la sintaxis de una función tradicional de una lambda, verás que el resultado es idéntico pero con menos líneas de código.

# Función tradicional
def suma(x, y):
    return x + y
print(suma(5, 6))

# Función lambda
suma = lambda x, y: x + y
print(suma(5, 6))
# Salida 1
11
# Salida 2
11

En el ejemplo vemos que hemos asociado un nombre a la función lambda llamada «suma» y es que en este punto de tu aprendizaje en Python, sabrás que a un objeto y en este caso anónimo, se le puede asociar un nombre siempre que no utilicemos las palabras reservadas por Python.

Si le pasamos a la función type() la palabra asociada suma, veras que devuelve el tipo de objeto.

# Nombre asociado a la función lambda
type(suma)

# Salida
function

Veamos en este ejemplo cómo invertir un string de forma sencilla y con una sola línea de código:

reverse = lambda s: s[::-1]
reverse('Lo que el viento se llevó') 
# Salida 
óvell es otneiv le euq oL

A pesar de sus limitaciones cabe decir que también puede devolver más de un valor.

En el siguiente ejemplo obtendremos 2 valores en una tupla, lo desmenuzaremos para que observes que los valores que obtenemos de una función lambda, son idénticos a la de una función tradicional, siempre que su uso, tal como explique al comienzo del artículo, no contenga controles de flujo.

val = lambda a, b: (a, b)
val(3, 4)
# Salida - Devuelve una tupla
(3, 4)

# Si la asociamos a (t)
t = val(3, 4)

# Devuelve la misma tupla
for i in t:
    print(t, type(t))

# Salida 2
(3, 45) <class 'tuple'>

Sin embargo, si le pasamos la función lambda val a type() nos devolverá una función.

Esto quiere decir que los valores que obtenemos de las funciones lambda podemos almacenarlos en listas, diccionarios o simplemente utilizarlas en otra función.

Condicionales dentro de la función

Este tipo de funciones permite declarar condicionales al igual que las funciones tradicionales, con la excepción de que lambda no utiliza la instrucción return.

# Función que evalúa si (a) esta en el rango de 5 a 10
val = lambda a: True if a >= 5 and a <= 10 else False
print(val(6))
print(val(11))
# Salida
True
False

Al asignarle a la función el parámetro (a), le sigue una expresión condicional también llamada operador ternario que evalúa que la condición sea True. En el caso de que no sea así, devuelve False.

Función map()

La función map() en Python se ejecuta en cada elemento de un iterable y devuelve el resultado aplicado en una lista con la función list().

Veámoslo en el siguiente ejemplo donde lo he aplicado para saber cuántos caracteres tiene cada palabra de la lista names:

names = ["Alejandro", "John Doe", "Mark", "Luisa"]
list(map(len, names))
# Salida
[9, 8, 4, 5]

Obtendríamos el mismo resultado almacenando en una lista los iterables devueltos utilizando un bucle for, de una forma mucho menos práctica, ya que con la función map() hemos utilizado una sola línea de código.

size = []
for i in names:
    size.append(len(i))
print(size)

# [9, 8, 4, 5]

Función filter()

La función filter() aplica un filtro a cada elemento de una lista y devuelve True, puede ser aplicada a cualquier otro tipo de función que no sea lambda.

Veamos cómo almacenamos en una lista todos los números pares de otra lista y sin hacer uso de la función filter.

numbers = [2, 4, 18, 15, 24, 33]
pairs = []

for i in numbers:
    if i % 2 == 0:
        pairs.append(i)
print(pairs)
# Salida
[2, 4, 18, 24]

Ahora lo haremos con solo una línea de código utilizando una función lambda:

list(filter(lambda i: i % 2 == 0, numbers))

# Salida
[2, 4, 18, 24]

Función reduce()

Esta función toma como argumento un conjunto de valores como pueden ser los elementos de una lista, y lo reduce a un único valor. Por ejemplo, si queremos obtener la suma de de todos los elementos de una lista.

Nota

Desde Python 3 la función reduce() está incluida en el módulo functools. Para utilizarla basta con importarla.

Como en ejemplos anteriores veamos como realizar el cálculo tradicionalmente sin hacer uso de esta función.

numbers = [2, 4, 18, 15, 24, 33]
total_sum = 0

for number in numbers:
    total_sum += number
print(total_sum)
# Salida
96

Ahora utilizando la función reduce() en una función lambda:

from functools import reduce
total_sum = reduce(lambda x, y: x + y, numbers)
print(total_sum)

# 96

Conclusión

En este artículo hemos podido ver las expresiones o funciones lambda, su sintaxis y su uso. Es cierto de que a pesar de ser en algunos aspectos bastante limitada, realizan funciones especificas dándonos un aspecto más agradable.

También hemos visto cómo funciones como filter, reduced y map, se complementan a la perfección con funciones lambda y muy utilizadas en Big Data.

¿Te ha parecido útil?