it-swarm.com.de

Verständnis von Lambda in python und Verwendung zur Übergabe mehrerer Argumente

Nachdem ich alles gelesen habe, was ich auf Lambda finden kann, verstehe ich immer noch nicht, wie ich es dazu bringen soll, das zu tun, was ich will.

Jeder benutzt das Beispiel:

lambda x, y : x + y

Warum müssen Sie x und y vor dem : Angeben? Wie kann man auch dafür sorgen, dass mehrere Argumente zurückgegeben werden?

beispielsweise:

self.buttonAdd_1 = Button(self, text='+', command=lambda : self.calculate(self.buttonOut_1.grid_info(), 1))

Das funktioniert gut. Der folgende Code funktioniert jedoch nicht:

self.entry_1.bind("<Return>", lambda : self.calculate(self.buttonOut_1.grid_info(), 1))

Es ergibt den Fehler:

TypeError: () akzeptiert keine Argumente (1 angegeben)

74
Talisin

Warum müssen Sie sowohl 'x' als auch 'y' vor dem ':' angeben?

Weil ein Lambda (begrifflich) die gleiche Funktion ist, die nur inline geschrieben wird. Ihr Beispiel ist äquivalent zu

def f(x, y) : return x + y

nur ohne es an einen Namen wie f zu binden.

Wie kann man auch dafür sorgen, dass mehrere Argumente zurückgegeben werden?

Genauso wie bei einer Funktion. Vorzugsweise geben Sie ein Tupel zurück:

lambda x, y: (x+y, x-y)

Oder eine Liste oder eine Klasse oder was auch immer.

Die Sache mit self.entry_1.bind sollte von Demosthenex beantwortet werden.

111
phg

Ich glaube, Bind versucht immer, einen Ereignisparameter zu senden. Versuchen:

self.entry_1.bind("<Return>", lambda event: self.calculate(self.buttonOut_1.grid_info(), 1))

Sie akzeptieren den Parameter und verwenden ihn nie.

10
Demosthenex

Warum müssen Sie x und y vor dem : Angeben?

Da es sich um eine Funktionsdefinition handelt, muss bekannt sein, welche Parameter die Funktion akzeptiert und in welcher Reihenfolge. Es kann nicht nur den Ausdruck betrachten und die Variablennamen darin verwenden, da für einige dieser Namen möglicherweise vorhandene lokale oder globale Variablenwerte verwendet werden sollen, und selbst wenn dies der Fall wäre, würde es nicht wissen, in welcher Reihenfolge sollte erwarten, sie zu bekommen.

Ihre Fehlermeldung bedeutet, dass Tk Ihr Lambda mit einem Argument aufruft, während Ihr Lambda so geschrieben ist, dass es keine Argumente akzeptiert. Wenn Sie das Argument nicht benötigen, akzeptieren Sie es einfach und verwenden Sie es nicht. ( Demosthenex hat den Code , ich hätte es gepostet, wurde aber geschlagen.)

5
kindall

Warum müssen Sie sowohl 'x' als auch 'y' vor dem ':' angeben?

Sie könnten in einigen Situationen (wenn Sie nur ein Argument haben) das x und y nicht vor ":" setzen.

>>> flist = []
>>> for i in range(3):
...     flist.append(lambda : i)

aber das i im lambda wird namentlich gebunden sein, also,

>>> flist[0]()
2
>>> flist[2]()
2
>>>

anders als das, was Sie vielleicht wollen.

3