Di seguito è riportata la riga di codice in questione:
a = lambda _:True
Si crea una funzione con un parametro di input: _
. Il carattere di sottolineatura è una scelta piuttosto strana del nome di variabile, ma è solo un nome di variabile. Puoi usarlo _
ovunque, anche quando non usi le funzioni lambda. Ad esempio, invece di ....
my_var = 5
print(my_var)
Potresti scrivere:
_ = 5
print(_)
Tuttavia, c'era un motivo che è _
stato utilizzato come nome del nome del parametro invece di qualcosa come x
o input
. Ci arriveremo tra un momento.
Innanzitutto, dobbiamo sapere che la parola chiave lambda costruisce una funzione, simile a def
, ma con una sintassi diversa. La definizione della funzione lambda,, a = lambda _:True
è simile alla scrittura:
def a(_):
return True
Crea una funzione denominata a
con un parametro di input _
e restituisce True
. Si potrebbe scrivere altrettanto facilmente a = lambda x:True
, con un carattere x
di sottolineatura invece di. Tuttavia, la convenzione è quella di utilizzare _
come nome di variabile quando non si intende utilizzare quella variabile. Considera quanto segue:
for _ in range(1, 11):
print('pear')
Si noti che l'indice del ciclo non viene mai utilizzato all'interno del corpo del ciclo. Vogliamo semplicemente che il ciclo venga eseguito un numero di volte specificato. Come winklerrr
ha scritto, "il nome della variabile _
è [...] come una" variabile usa e getta ", solo un segnaposto che non serve."
Allo stesso modo, con `` a = lambda x: True
il parametro di input non viene utilizzato all'interno del corpo della funzione. Non importa quale sia l'argomento di input, purché ce ne sia uno. L'autore di quella funzione lambda ha scritto _
invece di qualcosa di simile x
, per indicare che la variabile non sarebbe stata utilizzata.
Si noti che il lambda non ha un argomento; Quindi, scrivere
a()
, genererà un errore.
Se vuoi un lambda senza argomenti scrivi qualcosa del genere:
bar = lambda: True
Ora la chiamata bar()
, senza argomenti, funzionerà perfettamente. Un lambda che non accetta argomenti non deve sempre restituire lo stesso valore:
import random
process_fruit = lambda : random.random()
La funzione lambda sopra è più complessa di un qualcosa che restituisce sempre la stessa costante.
Uno dei motivi per cui i programmatori a volte usano la lambda
parola chiave invece di def
è per le funzioni che sono particolarmente brevi e semplici. Notare che una lambda
definizione di solito può stare tutta su una riga, mentre è difficile fare lo stesso con un'istruzione def. Un altro motivo per utilizzare al lambda
posto di def
sf quando la funzione non verrà utilizzata di nuovo. Se non vogliamo richiamare la funzione in un secondo momento, non è necessario assegnare un nome alla funzione. Si consideri ad esempio il codice seguente:
def apply_to_each (transform, in_container): out_container = list () for idx, item in enumerate (container, 0): out_container [idx] = transform (item) return out_container
Ora facciamo la seguente chiamata:
squares = apply_to_each(lambda x: x**2 range(0, 101))
Si noti che lambda x: x**2
non viene assegnata un'etichetta. Questo perché probabilmente non lo richiameremo più tardi, era solo qualcosa di breve e semplice di cui avevamo bisogno temporaneamente.
Il fatto che non sia necessario dare un nome alle funzioni lambda è la fonte di un altro nome per descriverle: "funzioni anonime".
Si noti inoltre che le istruzioni lambda sono come una chiamata di funzione in quanto restituiscono un riferimento alla funzione che creano. Quanto segue è illegale:
apply_to_each(def foo(x): x**2 , range(0, 101))
Considerando che apply_to_each(lambda x: x**2 range(0, 101))
va bene.
Quindi, usiamo al lambda
posto di def
e _
invece di un nome lungo di variabile quando vogliamo qualcosa di breve, dolce e probabilmente non lo vogliamo usare di nuovo in seguito.
lambda : True