Seite 1 von 1

Frage zu lambda

Verfasst: Montag 15. Oktober 2012, 08:25
von Steffo
Hallo,
bin noch neu was Python angeht.
Ich versuche in der zweiten Zeile den Wert i der Variable numb zuzuweisen. Anschließend soll eine Funktion mit dem Parameter numb aufgerufen werden:

Code: Alles auswählen

for i in range(8):
        portButton = Tkinter.Button(self.frame, text="Port" + str(i), fg="black", command=lambda: numb = i; self.resetPort(numb))
        portButton.grid(row=4, column=i, sticky=Tkinter.W)
Leider erhalte ich folgende Fehlermeldung:
Expected:)
Undefined variable: numb
Was mache ich falsch?

Danke im Voraus!

L. G.
Steffo

Re: Frage zu lambda

Verfasst: Montag 15. Oktober 2012, 08:31
von BlackJack
@Steffo: Die Syntax von ``lambda`` sieht anders aus. Die Argumentliste kommt zwischen ``lambda`` und dem ``:`` und ein ``;`` kann in einem einfachen Ausdruck überhaupt nicht vorkommen.

Re: Frage zu lambda

Verfasst: Montag 15. Oktober 2012, 08:49
von Steffo
Das mit der Argumentliste ist mir schon klar. Das Problem hierbei ist, dass die lambda-Funktion erst nach der Schleifen-Iteration aufgerufen wird und mir der jeweilige aktuelle Wert von "i" nicht mehr zur Verfügung steht, weswegen ich "i" irgendwie zwischenspeichern muss.
Wenn ich beispielsweise folgendes schreibe, wird der letzte Wert, nämlich 7, gespeichert:

Code: Alles auswählen

command=lambda: self.resetPort(i)
L. G.
Steffo

Re: Frage zu lambda

Verfasst: Montag 15. Oktober 2012, 09:09
von EyDu
functools.partial ist dein Freund:

Code: Alles auswählen

command=functools.partial(self.resetPort, i)

Re: Frage zu lambda

Verfasst: Montag 15. Oktober 2012, 09:21
von Steffo
EyDu hat geschrieben:functools.partial ist dein Freund:

Code: Alles auswählen

command=functools.partial(self.resetPort, i)
Nein, du bist mein Freund! :)
Danke!!! :D

L. G.
Steffo

Re: Frage zu lambda

Verfasst: Montag 15. Oktober 2012, 11:13
von BlackJack
@Steffo: Nochmal: Die Argumentliste kommt zwischen das ``lambda`` und den ``:``. Das binden von ``numb`` einfach weg zu lassen, löst natürlich das Problem nicht.

Oh, und falls das Absicht war, dass ``numb = i`` in den „Körper” der Lambda-Funktion sollte — das löst das Problem natürlich auch nicht, denn dann würde eben noch `numb` der Wert zugewiesen den `i` nach dem letzten Schleifendurchlauf hatte.

Und schlag mal `numb` im Englisch-Wörterbuch nach. Abkürzungen sollte man vermeiden. Die hier ist vollkommen willkürlich und verwirrt zusätzlich weil ein ”sinnvolles” Wort dabei heraus kommt. Und das alles nur um insgesamt vier Zeichen zu sparen.

Re: Frage zu lambda

Verfasst: Montag 15. Oktober 2012, 11:27
von EyDu
@BlackJack: Ich glaube, du hast die Intention von Steffos Code falsch verstanden. Zumindest, scheint functools.partial genau das zu machen, was er benötigt hat. Das ``numb=i`` war meiner Meinung nach nur ein verzweifelter Versuch (oder ein Andeutung für uns), dass der Wert von i irgendwie beim Funktionsaufruf verwendet werden soll. Dass ``lambda numb=i: func(numb)`` eine mögliche Alternative zu partila ist, ist Steffo wahrscheinlich nicht klar gewesen. Für uns sieht das ganze dann natürlich nach einem falschen Aufruf von lambda aus.

Re: Frage zu lambda

Verfasst: Montag 15. Oktober 2012, 12:18
von Steffo
Ey Du hast Recht! Danke! :D

L. G.
Steffo

Re: Frage zu lambda

Verfasst: Montag 15. Oktober 2012, 17:09
von cofi
Der Vollstaendigkeit halber: Mit `lambda` geht das auch.

Code: Alles auswählen

...
portButton = Tkinter.Button(self.frame, text="Port" + str(i), fg="black", command=lambda number=i: self.resetPort(number))
....
Aber bitte `functools.partial` benutzen.

Re: Frage zu lambda

Verfasst: Montag 15. Oktober 2012, 17:14
von Hyperion
BlackJack hat geschrieben: Und schlag mal `numb` im Englisch-Wörterbuch nach.
Toll, jetzt habe ich nen Ohrwurm: "I become so numb..." :mrgreen:

Re: Frage zu lambda

Verfasst: Dienstag 16. Oktober 2012, 07:07
von Steffo
cofi hat geschrieben:Der Vollstaendigkeit halber: Mit `lambda` geht das auch.
Hat schon "EyDu" gesagt. :)
Aber bitte `functools.partial` benutzen.
Wieso?

L. G.
Steffo

Re: Frage zu lambda

Verfasst: Dienstag 16. Oktober 2012, 07:38
von BlackJack
@Steffo: Weil es verständlicher ist. Wer nicht weiss was es macht, kann einfach `functools.partial()` in der Dokumentation nachschlagen. Warum das mit Default-Argumenten funktioniert ist nicht so offensichtlich und wenn man es nicht weiss, auch nicht so einfach in der Dokumentation zu finden, weil man dann ja gar nicht genau weiss *wonach* man eigentlich sucht.

Re: Frage zu lambda

Verfasst: Dienstag 16. Oktober 2012, 07:59
von Steffo
OK, das ist ein Argument. :)
Danke! :)

L. G.
Steffo