Python Language Funciones Lambda (Inline / Anónimo)


Ejemplo

La palabra clave lambda crea una función en línea que contiene una sola expresión. El valor de esta expresión es lo que la función devuelve cuando se invoca.

Considere la función:

def greeting():
    return "Hello"

el cual, cuando es llamado como:

print(greeting())

huellas dactilares:

Hello

Esto se puede escribir como una función lambda de la siguiente manera:

greet_me = lambda: "Hello"

Vea la nota al final de esta sección con respecto a la asignación de lambdas a las variables. En general, no lo hagas.

Esto crea una función en línea con el nombre greet_me que devuelve Hello . Tenga en cuenta que no escribe return cuando crea una función con lambda. El valor después de : se devuelve automáticamente.

Una vez asignada a una variable, se puede usar como una función regular:

print(greet_me())

huellas dactilares:

Hello

lambda s puede tomar argumentos, también:

strip_and_upper_case = lambda s: s.strip().upper()

strip_and_upper_case("  Hello   ")

devuelve la cadena:

HELLO

También pueden tomar un número arbitrario de argumentos / argumentos de palabras clave, como las funciones normales.

greeting = lambda x, *args, **kwargs: print(x, args, kwargs)
greeting('hello', 'world', world='world')

huellas dactilares:

hello ('world',) {'world': 'world'}

lambda se usan comúnmente para funciones cortas que son convenientes para definir en el punto donde se llaman (típicamente con sorted , filter y map ).

Por ejemplo, esta línea ordena una lista de cadenas que ignoran su caso e ignoran los espacios en blanco al principio y al final:

sorted( [" foo ", "    bAR", "BaZ    "], key=lambda s: s.strip().upper())
# Out:
# ['    bAR', 'BaZ    ', ' foo ']

Ordenar la lista simplemente ignorando espacios en blanco:

sorted( [" foo ", "    bAR", "BaZ    "], key=lambda s: s.strip())
# Out:
# ['BaZ    ', '    bAR', ' foo ']

Ejemplos con map :

sorted( map( lambda s: s.strip().upper(), [" foo ", "    bAR", "BaZ    "]))
# Out:
# ['BAR', 'BAZ', 'FOO']

sorted( map( lambda s: s.strip(), [" foo ", "    bAR", "BaZ    "]))
# Out:
# ['BaZ', 'bAR', 'foo']

Ejemplos con listas numéricas:

my_list = [3, -4, -2, 5, 1, 7]
sorted( my_list, key=lambda x: abs(x))
# Out:
# [1, -2, 3, -4, 5, 7]

list( filter( lambda x: x>0, my_list))
# Out:
# [3, 5, 1, 7]

list( map( lambda x: abs(x), my_list))
# Out:
[3, 4, 2, 5, 1, 7]

Uno puede llamar a otras funciones (con / sin argumentos) desde dentro de una función lambda.

def foo(msg):
    print(msg)

greet = lambda x = "hello world": foo(x)
greet()

huellas dactilares:

hello world

Esto es útil porque lambda puede contener solo una expresión y al usar una función subsidiaria se pueden ejecutar varias declaraciones.


NOTA

Tenga en cuenta que PEP-8 (la guía de estilo oficial de Python) no recomienda asignar lambdas a las variables (como hicimos en los dos primeros ejemplos):

Siempre use una instrucción def en lugar de una instrucción de asignación que vincule una expresión lambda directamente a un identificador.

Sí:

def f(x): return 2*x

No:

f = lambda x: 2*x

La primera forma significa que el nombre del objeto de función resultante es específicamente f lugar del genérico <lambda> . Esto es más útil para las trazas y representaciones de cadenas en general. El uso de la declaración de asignación elimina el único beneficio que puede ofrecer una expresión lambda sobre una declaración explícita de def (es decir, que se puede incrustar dentro de una expresión más grande).