Seite 1 von 1
Verdtändnisproblem lambda
Verfasst: Samstag 27. August 2022, 12:58
von kitebuggy
Hallo
Habe in einem Lehrbuch (Beginning PyQT) ein Verständnisproblem mit einer lambda Funktion:
Code: Alles auswählen
self.blue_act.triggered.connect(lambda:self.changeBackground(self.blue_act.text()))]
(Codeschnipsel Listing 8.2)
Was macht die lambda funktion oder kann mir jemand diese Funktion ohne lambda dahinschreiben?
Wie lautet der Slot mit dem das Signal verbunden wird?
Danke
Re: Verdtändnisproblem lambda
Verfasst: Samstag 27. August 2022, 13:30
von __deets__
Das lambda ist eine Funktion, und die stellt auch den Slot dar. Und ohne lambda muss man eine funktion definieren, wahlweise direkt davor als closure, der das self mit sich bringt, oder als (Bound) Method, oder als freistehende Funktion mit partial.
Die Dokumentation au lambda mal gelesen?
Re: Verdtändnisproblem lambda
Verfasst: Sonntag 28. August 2022, 14:13
von kitebuggy
Warum muss man denn das lambda beutzen und nicht gleich self.blue_act.triggered.connect(self.changeBackground(self.blue_act.text())) benutzen? Es soll doch zu dieser Funktion gesprungen werden. Oder kann ich an dieser Stelle keine Parameter mit angeben?
Ich bin Anfänger. Bitte ausführlich erklären.
Danke
Re: Verdtändnisproblem lambda
Verfasst: Sonntag 28. August 2022, 14:17
von __deets__
Weil das dann einfach direkt ausgeführt wird, und der Rückgabewert (vermutlich None) zum Callback/Slot wird. Was ja Quatsch ist.
Es gibt keine Magie in Python, wo ein Ausdruck, der irgendwo steht & eine Methode/Funktion/Wasauchimmer aufruft, plötzlich durch ein Wunder NICHT aufgerufen wird. Entsprechend muss man dafür sorgen, dass das nicht passiert. Ein Lambda ist ein simpler Weg. functools.partial ein anderer, oder eben die genannten anderen Möglichkeiten.
Re: Verdtändnisproblem lambda
Verfasst: Sonntag 28. August 2022, 17:34
von Dennis89
Hallo,
ich versuche der Erklärung von __deets__ noch ein Beispiel und die entsprechenden Links beizufügen.
kitebuggy hat geschrieben: Sonntag 28. August 2022, 14:13
Es soll doch zu dieser Funktion gesprungen werden.
[...]Bitte ausführlich erklären.
Aber erst wenn ein Ereignis eintritt und nicht wenn der Python-Interpreter beim Programmstart darüber stolpert.
Wenn du ein Klammerpaar hinter eine Funktion schreibst, dann wird die gleich ausgeführt.
Vielleicht erkennst du das an folgendem Beispiel:
Code: Alles auswählen
def do_something():
return 'Funktion ausgeführt'
def main():
print(do_something())
print(do_something)
if __name__ == '__main__':
main()
Du willst ja dass deine Funktion erst ausgeführt wird, wenn ein Ereignis eingetreten ist, also darfst du kein Klammerpaar schreiben. Du kannst aber auch nicht einfach so deine Parameter ohne Klammer hinter die Funktion schreiben, da wären wir wieder bei dem fehlenden Wunder, das __deets__ beschrieben hat. Damit du die Parameter übergeben kannst und die Funktion nicht sofort aufgerufen wird brauchst du
'lambda' oder url="
https://docs.python.org/3/library/funct ... ls.partial"]'partial'[/url].
Grüße
Dennis
Gelöst: Verständnisproblem lambda
Verfasst: Sonntag 28. August 2022, 21:16
von kitebuggy
Ah, jetzt habe ich verstanden. Ein kleiner, aber feiner Unterschied.
Vielen Dank euch beiden für die Erklärung