Funciones Lambda en Python

¿Qué son las funciones Lambda?


En Python, las funciones son objetos: pueden asignarse a variables, pueden devolverse desde otras funciones, almacenarse en listas o dictados y pasarse como parámetros para otras funciones. Consideremos, por ejemplo, el map() función incorporada. Su sintaxis es map(function, iterable) y se utiliza para aplicar cómodamente function a cada elemento de iterable.

map() en realidad devuelve un iterator objeto. En la práctica, expresamos el resultado como un list, tuple, set, dict, etc, lo que sea más conveniente.

Suponga que quiere elevar al cuadrado todos los términos de una lista usando el map() función. Para ello, definiremos un square() función y utilizarlo como parámetro para map():

my_list = [1,2,3,4,5]
def square(x):
    return x**2

my_modified_list = list(map(square, my_list))
print(my_modified_list)
[1, 4, 9, 16, 25]


Sin embargo, si el único uso de nuestro square() función es crear esta lista, es más limpio usar un lambda función:

my_list = [1,2,3,4,5]
my_modified_list = list(map(lambda x: x**2, my_list))
print(my_modified_list)
[1, 4, 9, 16, 25]

En Python lambda son funciones anónimas que toman su nombre y sintaxis de Alonzo Church's Cálculo lambda. Su sintaxis es:

lambda x_1,..., x_n : expression(x_1, ..., x_n)

Esto crea una función anónima que recibe como entrada las variables x_1, ..., x_n y devuelve el evaluado expression(x_1, ..., x_n).

El objetivo de la publicidad de lambda funciones se utilizará como parámetro para funciones que aceptan funciones como parámetro, como hicimos con map() arriba. Python le permite asignar un lambda función a una variable, pero la Guía de estilo PEP 8 desaconseja. Si desea asignar una función simple a una variable, es mejor hacerlo como una definición de una línea. Esto garantiza que el objeto resultante tenga el nombre correcto, lo que mejora la legibilidad del rastreo:

anonymous_square = lambda x : x**2def named_square(x): return x**2print(anonymous_square.__name__)
print(named_square.__name__)


a = anonymous_square
b = named_square
print(a.__name__)
print(b.__name__)

¿Por qué utilizar las funciones de Lambda?

Después del último párrafo, es posible que se pregunte por qué querría usar un lambda función. Después de todo, cualquier cosa que se pueda hacer con un lambda La función se puede hacer con una función con nombre.

La respuesta a esto es que lambda la función propósito es vivir dentro de expresiones más grandes que representan un cálculo. Una forma de pensar en esto es por analogía con variables y valores. Considere el siguiente código:

x = 2

La variable x es un marcador de posición (o un nombre) para el número entero 2. Por ejemplo, llamando print(x) y print(2) da exactamente la misma salida. En el caso de las funciones:

def square(x): return x**2

La función square() es un marcador de posición para el cálculo de elevar al cuadrado un número. Este cálculo se puede escribir sin nombre como lambda x: x**2.

Siguiendo esta digresión filosófica, veamos algunos ejemplos de aplicaciones para lambda funciones.

Uso de Lambda con la función sorted()

El proyecto sorted() la función ordena un iterable. Acepta una función como su key argumento, y el resultado de la función aplicada a cada elemento del iterable se usa para ordenar los elementos.

Esto se adapta perfectamente a un lambda función: configurando el key parámetro con un lambda función, podemos ordenar por cualquier tipo de atributo de los elementos. Por ejemplo, podemos ordenar una lista de nombres por apellido:

name_list = ['Grace Hopper', 'Ada Lovelace', 'Emmy Noether', 'Marie Curie']
​
sorted_by_surname = sorted(name_list, key = lambda x: x.split()[1])
​
print(sorted_by_surname)
['Marie Curie', 'Grace Hopper', 'Ada Lovelace', 'Emmy Noether']

Uso de Lambda con la función 'filter ()'

El proyecto filter() función tiene la siguiente sintaxis: filter(function, iterable) y genera los elementos de iterable que evalúan function(element) como cierto (es similar a un WHERE cláusula en SQL). Nosotros podemos usar lambda funciona como parámetros para filter() para seleccionar elementos de un iterable.

Considere el siguiente ejemplo:

num_list = list(range(0,100))
​
multiples_of_15= filter(lambda x: (x % 3 == 0) and (x % 5 == 0), num_list)
​
print(list(multiples_of_15))
[0, 15, 30, 45, 60, 75, 90]

filter() aplica el lambda función lambda x: (x % 3 == 0) and (x % 5 == 0) a cada elemento de range(0,100)y devuelve un filter objeto. Accedemos a los elementos echándolos como list.

Uso de Lambda con la función map()


Nuestro último ejemplo es algo que hemos visto en la introducción: el map() función. los map() sintaxis de la función es: map(function, iterable)y map() se aplica function a cada elemento de iterable, devolviendo un map objeto al que se puede acceder mediante la conversión a un list.

Hemos visto cómo se puede aplicar esto a las listas, pero podría aplicarse a los dictados usando el dict.items() método:

my_data = {'Mary':1, 'Alice':2, 'Bob':0}
map_obj = map(lambda x: f'{x[0]} had {x[1]} little lamb', my_data.items())
print(', '.join((map_obj)))
Mary had 1 little lamb, Alice had 2 little lamb, Bob had 0 little lamb

o a una cadena:

my_string = 'abcdefg'
''.join(map(lambda x: chr(ord(x)+2),my_string))
'cdefghi'

Consulte nuestra guía práctica y práctica para aprender Git, con las mejores prácticas, los estándares aceptados por la industria y la hoja de trucos incluida. Deja de buscar en Google los comandos de Git y, de hecho, aprenden ella!

Podemos utilizar map() funcionar de manera ingeniosa: un ejemplo es aplicar muchas funciones a la misma entrada.

Por ejemplo, suponga que está creando una API que recibe una cadena de texto y desea aplicarle una lista de funciones.

Cada función extrae alguna característica del texto. Las características que queremos extraer son el número de palabras, la segunda palabra y la cuarta letra de la cuarta palabra:

def number_of_words(text):
  return len(text.split())
​
def second_word(text):
  return text.split()[1]
​
def fourth_letter_of_fourth_word(text):
  return text.split()[3][3]
​
function_list = [number_of_words, second_word, fourth_letter_of_fourth_word]
​
my_text = 'Mary had a little lamb'
map_obj = map(lambda f: f(my_text), function_list)
​
feature_list = list(map_obj)
​
print(feature_list)
[5, 'had', 't']

Conclusión


En esta guía, hemos explorado la funcionalidad de lambda funciones en Python. hemos visto eso lambda Las funciones son funciones anónimas que se utilizan como un parámetro de función en línea para otras funciones. Hemos visto algunos casos de uso, así como cuándo no usarlos.

Al programar, es importante tener en cuenta la cita de Donald Knuth: "Los programas están destinados a ser leídos por humanos y solo de manera incidental para que las computadoras los ejecuten". Teniendo esto en cuenta, lambda Las funciones son una herramienta útil para simplificar nuestro código, pero deben usarse con prudencia.

Sello de tiempo:

Mas de Abuso de pila