Ist es möglich, Funktionen mit Argumenten an eine andere Funktion in Python zu übergeben?
Sagen Sie für etwas wie:
def perform(function):
return function()
Die zu übergebenden Funktionen haben jedoch Argumente wie:
action1()
action2(p)
action3(p,r)
def action1(arg1, arg2=None, arg3=None)
wie können Sie beispielsweise ein Argument übergeben, das Sie arg3 zuweisen möchten?perform
undaction1
,action2
auf verschiedene Dateien? @ S.LottDafür ist Lambda da:
quelle
Sie können die Teilfunktion von functools wie folgt verwenden.
Funktioniert auch mit Schlüsselwörtern
quelle
functools.partial
ist auch vielseitiger, wennperform
weitere Parameter an übergeben werden müssenf
. Zum Beispiel könnte man anrufenperform(partial(Action3, p))
undperform(f)
so etwas tunf("this is parameter r")
.Verwenden Sie functools.partial, keine Lambdas! Und ofc Perform ist eine nutzlose Funktion, Sie können Funktionen direkt weitergeben.
quelle
(Monate später) ein winziges reales Beispiel, bei dem Lambda nützlich ist, teilweise nicht:
Angenommen, Sie möchten verschiedene eindimensionale Querschnitte durch eine zweidimensionale Funktion, wie Scheiben durch eine Reihe von Hügeln.
quadf( x, f )
nimmt eine 1-df
und nennt es für verschiedenex
.Um es für vertikale Schnitte bei y = -1 0 1 und horizontale Schnitte bei x = -1 0 1 zu nennen,
Soweit ich weiß,
partial
kann ich das nicht -(Wie füge ich Tags numpy, partiell, lambda hinzu?)
quelle
Dies wird als Teilfunktion bezeichnet und es gibt mindestens drei Möglichkeiten, dies zu tun. Meine Lieblingsmethode ist die Verwendung von Lambda, da es die Abhängigkeit von zusätzlichen Paketen vermeidet und am wenigsten ausführlich ist. Angenommen, Sie haben eine Funktion
add(x, y)
und möchtenadd(3, y)
als Parameter an eine andere Funktion übergeben, sodass die andere Funktion den Wert für bestimmty
.Verwenden Sie Lambda
Erstellen Sie Ihren eigenen Wrapper
Hier müssen Sie eine Funktion erstellen, die die Teilfunktion zurückgibt. Dies ist offensichtlich viel ausführlicher.
Verwenden Sie teilweise von functools
Dies ist fast identisch mit dem
lambda
oben gezeigten. Warum brauchen wir das dann? Es gibt nur wenige Gründe . Kurz gesagt,partial
kann in einigen Fällen etwas schneller sein (siehe Implementierung ) und Sie können es für die frühe Bindung im Vergleich zur späten Bindung von Lambda verwenden.quelle
Hier ist eine Möglichkeit, dies mit einem Verschluss zu tun:
quelle