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 xoder 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 defSyntax ähnelt , jedoch eine andere hat. Die Definition der Lambda-Funktion a = lambda _:Trueähnelt dem Schreiben:
def a(_):
return True
Es erstellt eine Funktion amit einem Eingabeparameter _und gibt diese zurück True. Man hätte genauso leicht schreiben können a = lambda x:True, mit einem xanstelle 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 winklerrrgeschrieben, "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 lambdaSchlüsselwort anstelle geben, def sind Funktionen, die besonders kurz und einfach sind. Beachten Sie, dass eine lambdaDefinition 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 lambdaanstelle von defsf, 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**2kein 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 lambdaanstelle defund _anstelle eines langen Variablennamens, wenn wir etwas Kurzes, Süßes möchten und es wahrscheinlich später nicht mehr verwenden möchten.
lambda : True