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