A continuación se muestra la línea de código en cuestión:
a = lambda _:True
Se crea una función que tiene un parámetro de entrada: _
. El subrayado es una elección bastante extraña de nombre de variable, pero es solo un nombre de variable. Puede usarlo en _
cualquier lugar, incluso cuando no use funciones lambda. Por ejemplo, en lugar de ....
my_var = 5
print(my_var)
Podrías escribir:
_ = 5
print(_)
Sin embargo, hubo una razón por la que _
se usó como el nombre del nombre del parámetro en lugar de algo como x
o input
. Llegaremos a eso en un momento.
Primero, necesitamos saber que la palabra clave lambda construye una función, similar a def
, pero con diferente sintaxis. La definición de la función lambda`` a = lambda _:True
es similar a escribir:
def a(_):
return True
Crea una función nombrada a
con un parámetro de entrada _
y regresa True
. Se podría haber escrito a = lambda x:True
con la misma facilidad , con x
un guión bajo en lugar de un subrayado. Sin embargo, la convención es usar _
como nombre de variable cuando no pretendemos usar esa variable. Considera lo siguiente:
for _ in range(1, 11):
print('pear')
Observe que el índice de bucle nunca se usa dentro del cuerpo del bucle. Simplemente queremos que el ciclo se ejecute un número específico de veces. Como se winklerrr
ha escrito, "el nombre de la variable_
es como [...] una" variable desechable ", sólo un marcador de posición que no sirve".
Del mismo modo, con `` a = lambda x: True,
el parámetro de entrada no se usa dentro del cuerpo de la función. Realmente no importa cuál sea el argumento de entrada, siempre que haya uno. El autor de esa función lambda escribió en _
lugar de algo como x
, para indicar que la variable no se usaría.
Tenga en cuenta que el lambda no tiene un argumento; Entonces, escribiendo
a()
, generará un error.
Si desea una lambda sin argumento, escriba algo como esto:
bar = lambda: True
Ahora llamar bar()
, sin argumentos, funcionará bien. Una lambda que no toma argumentos no siempre debe devolver el mismo valor:
import random
process_fruit = lambda : random.random()
La función lambda anterior es más compleja que algo que siempre devuelve la misma constante.
Una de las razones por las que los programadores a veces usan la lambda
palabra clave en lugar de def
es para funciones que son especialmente breves y simples. Tenga en cuenta que una lambda
definición generalmente puede caber todo en una línea, mientras que es difícil hacer lo mismo con una declaración def. Otra razón para usar en lambda
lugar dedef
sf cuando la función no se volverá a usar. Si no queremos volver a llamar a la función más tarde, entonces no es necesario darle un nombre a la función. Por ejemplo, considere el siguiente código:
def apply_to_each (transform, in_container): out_container = list () para idx, item in enumerate (container, 0): out_container [idx] = transform (item) return out_container
Ahora hacemos la siguiente llamada:
squares = apply_to_each(lambda x: x**2 range(0, 101))
Darse cuenta de lambda x: x**2
no se le da una etiqueta. Esto se debe a que probablemente no lo volveremos a llamar más tarde, era solo algo breve y simple que necesitábamos temporalmente.
El hecho de que a las funciones lambda no se les dé un nombre es la fuente de otro nombre para describirlas: "funciones anónimas".
También tenga en cuenta que las sentencias lambda son como una llamada de función en el sentido de que devuelven una referencia a la función que crean. Lo siguiente es ilegal:
apply_to_each(def foo(x): x**2 , range(0, 101))
Considerando que, apply_to_each(lambda x: x**2 range(0, 101))
está bien.
Entonces, usamos en lambda
lugar de def
y en _
lugar de un nombre de variable largo cuando queremos algo corto, dulce y probablemente no queremos usarlo de nuevo más tarde.
lambda : True