Unten ist die fragliche Codezeile:
a = lambda _:True
Es wird eine Funktion mit einem Eingabeparameter erstellt : _
. Unterstrich ist eine ziemlich seltsame Wahl des Variablennamens, aber es ist nur ein Variablenname. Sie können _
überall verwenden, auch wenn Sie keine Lambda-Funktionen verwenden. Zum Beispiel anstelle von ....
my_var = 5
print(my_var)
Sie könnten schreiben:
_ = 5
print(_)
Es gab jedoch einen Grund, _
der als Name des Parameternamens anstelle von so etwas wie x
oder verwendet wurde input
. Wir werden gleich darauf zurückkommen.
Zunächst müssen wir wissen, dass das Lambda-Schlüsselwort eine Funktion erstellt, die der def
Syntax ähnelt , jedoch eine andere hat. Die Definition der Lambda-Funktion a = lambda _:True
ähnelt dem Schreiben:
def a(_):
return True
Es erstellt eine Funktion a
mit einem Eingabeparameter _
und gibt diese zurück True
. Man hätte genauso leicht schreiben können a = lambda x:True
, mit einem x
anstelle eines Unterstrichs. Die Konvention besteht jedoch darin, _
als Variablenname zu verwenden, wenn wir diese Variable nicht verwenden möchten. Folgendes berücksichtigen:
for _ in range(1, 11):
print('pear')
Beachten Sie, dass der Schleifenindex niemals innerhalb des Schleifenkörpers verwendet wird. Wir möchten einfach, dass die Schleife eine bestimmte Anzahl von Malen ausgeführt wird. Wie winklerrr
geschrieben, "ist der Variablenname _
[...] wie eine" Wegwerfvariable ", nur ein Platzhalter, der keinen Nutzen hat."
Ebenso mit `` a = lambda x: Stimmt
der Eingangsparameter nicht innerhalb des Körpers der Funktion verwendet wird. Es spielt keine Rolle, was das Eingabeargument ist, solange es eines gibt. Der Autor dieser Lambda-Funktion schrieb _
anstelle von so etwas x
, um anzuzeigen, dass die Variable nicht verwendet werden würde.
Beachten Sie, dass das Lambda ist ein Argument hat; Also schreiben
a()
wird einen Fehler auslösen.
Wenn Sie ein Lambda ohne Argument wollen, schreiben Sie so etwas:
bar = lambda: True
Jetzt bar()
funktioniert das Anrufen ohne Argumente einwandfrei. Ein Lambda, das keine Argumente akzeptiert, muss nicht immer denselben Wert zurückgeben:
import random
process_fruit = lambda : random.random()
Die obige Lambda-Funktion ist komplexer als nur etwas, das immer dieselbe Konstante zurückgibt.
Ein Grund, warum Programmierer uns manchmal das lambda
Schlüsselwort anstelle geben, def
sind Funktionen, die besonders kurz und einfach sind. Beachten Sie, dass eine lambda
Definition normalerweise alle in eine Zeile passen kann, während es schwierig ist, dasselbe mit einer def-Anweisung zu tun. Ein weiterer Grund für die Verwendung lambda
anstelle von def
sf, wenn die Funktion nicht erneut verwendet wird. Wenn wir die Funktion später nicht erneut aufrufen möchten, müssen Sie der Funktion keinen Namen geben. Betrachten Sie beispielsweise den folgenden Code:
def apply_to_each (transform, in_container): out_container = list () für idx, item in enumerate (container, 0): out_container [idx] = transform (item) return out_container
Jetzt machen wir folgenden Anruf:
squares = apply_to_each(lambda x: x**2 range(0, 101))
Beachten Sie, dass lambda x: x**2
kein Etikett angegeben ist. Dies liegt daran, dass wir es wahrscheinlich später nicht mehr anrufen werden. Es war nur etwas Kurzes und Einfaches, das wir vorübergehend brauchten.
Die Tatsache, dass Lambda-Funktionen keinen Namen erhalten müssen, ist die Quelle eines anderen Namens, um sie zu beschreiben: "anonyme Funktionen".
Beachten Sie auch, dass Lambda-Anweisungen insofern wie ein Funktionsaufruf sind, als sie einen Verweis auf die von ihnen erstellte Funktion zurückgeben. Folgendes ist illegal:
apply_to_each(def foo(x): x**2 , range(0, 101))
Während apply_to_each(lambda x: x**2 range(0, 101))
ist in Ordnung.
Wir verwenden also lambda
anstelle def
und _
anstelle eines langen Variablennamens, wenn wir etwas Kurzes, Süßes möchten und es wahrscheinlich später nicht mehr verwenden möchten.
lambda : True