Was macht der folgende Code?
a = lambda _:True
Nach dem, was ich in der interaktiven Eingabeaufforderung gelesen und getestet habe, scheint es eine Funktion zu sein, die immer zurückkehrt True
.
Verstehe ich das richtig? Ich hoffe zu verstehen, warum auch ein Unterstrich ( _
) verwendet wurde.
lambda : True
_
anstelle vonx
odera
oder was auch immer. Wenn jemand wissen möchte, wie man eine Lambda-Funktion schreibt, die keine Argumente akzeptiert; So geht's: Definieren Sie es so :my_lambda = lambda : 255
. Nennen Sie es so:x = my_lambda()
Sie können durch einen255
beliebigen Rückgabewert ersetzen .Antworten:
Das
_
ist der Variablenname. Versuch es. (Dieser Variablenname ist normalerweise ein Name für eine ignorierte Variable. Sozusagen ein Platzhalter.)Python:
>>> l = lambda _: True >>> l() <lambda>() missing 1 required positional argument: '_' >>> l("foo") True
Dieses Lambda erfordert also ein Argument . Wenn Sie ein Lambda ohne Argument wünschen , das immer zurückgibt
True
, gehen Sie folgendermaßen vor:>>> m = lambda: True >>> m() True
quelle
Python 3.6.2
under getestetMac OS 10.12
und es funktioniert._
häufig verwendet wird, wenn die Variable selbst nicht wirklich benötigt wird. Es ist wie eine "Wegwerfvariable", nur ein Platzhalter, der keinen Nutzen hat.Unterstrich ist eine Python-Konvention zum Benennen einer nicht verwendeten Variablen (z. B. statische Analysewerkzeuge melden sie nicht als nicht verwendete Variable). In Ihrem Fall wird das Lambda-Argument nicht verwendet, aber das erstellte Objekt ist eine Einzelargumentfunktion, die immer zurückgibt
True
. Ihr Lambda ist also etwas analog zur Konstantenfunktion in der Mathematik.quelle
Ja, es ist eine Funktion (oder Lambda), die True zurückgibt. Der Unterstrich , der normalerweise ein Platzhalter für eine ignorierte Variable ist, ist in diesem Fall nicht erforderlich.
Ein Beispiel für einen Anwendungsfall für eine solche Funktion (die fast nichts bewirkt):
dd = collections.defaultdict(lambda: True)
Bei Verwendung als Argument für ein Standarddikt können Sie
True
einen allgemeinen Standardwert verwenden.quelle
Lambda bedeutet eine Funktion. Die obige Aussage ist dasselbe wie das Schreiben
def f(_): return True
Für Lambda muss eine Variable vorhanden sein. Also übergeben Sie ihm eine Variable namens
_
(Ähnlich könnten Sie übergebenx
,y
..)quelle
Der Unterstrich
_
ist ein gültiger Bezeichner und wird hier als Variablenname verwendet. Es wird immerTrue
für das an die Funktion übergebene Argument zurückgegeben.>>>a('123') True
quelle
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 wiex
oder verwendet wurdeinput
. 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-Funktiona = lambda _:True
ähnelt dem Schreiben:def a(_): return True
Es erstellt eine Funktion
a
mit einem Eingabeparameter_
und gibt diese zurückTrue
. Man hätte genauso leicht schreiben könnena = lambda x:True
, mit einemx
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 etwasx
, 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 einelambda
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 Verwendunglambda
anstelle vondef
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
anstelledef
und_
anstelle eines langen Variablennamens, wenn wir etwas Kurzes, Süßes möchten und es wahrscheinlich später nicht mehr verwenden möchten.quelle