Lamda

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
Brevista
User
Beiträge: 32
Registriert: Sonntag 2. Juli 2017, 00:48

hallo ich habe eine kurze Frage, was genau ist lamda? Z.B. hier:

Code: Alles auswählen

Beispiel.bind("<Button-1>", lambda event: Beispiel(event, "Beispiel"))
was führt es aus? und was gibt es an?
Sirius3
User
Beiträge: 17754
Registriert: Sonntag 21. Oktober 2012, 17:20

@Brevista: lambda ist eine einfache anonyme Funktion, die nur aus einem Ausdruck besteht.

Code: Alles auswählen

Beispiel.bind("<Button-1>", lambda event: Beispiel(event, "Beispiel"))
ist damit die Kurzform von

Code: Alles auswählen

def call_Beispiel(event):
    return Beispiel(event, "Beispiel")
Beispiel.bind("<Button-1>", call_Beispiel)
Python1906
User
Beiträge: 29
Registriert: Mittwoch 9. November 2016, 13:52

Hallo,

Der Lambda-Ausdruck wird bei Buttons und anderen GUIs (zumindest bei tkinter) verwendet, um Funktionen, welche Parameter enthalten und bei Klick ausgeführt werden, dem Objekt zuzuweisen.

Wenn man nämlich einem Button eine Funktion, ohne den Lambda-Ausdruck übergibt, welche zum Beispiel den Parameter param1 enthält, dann würde die Funktion sofort bei Programmstart ausgeführt werden (und weitere Male bei Klicks auf dem Button), da man bei der Funktion die Klammern setzen muss, da ja sonst keine Parameter zugewiesen werden können. Setzt du die Funktion mit den Parametern in einem Lambda-Ausdruck, wird sie nur dann ausgeführt, wenn der Button angeklickt wird, was ja bei einem Button so sein sollte.

Außerdem kann man mit ihm Funktionen kürzer schreiben:

Ohne Lambda:

Code: Alles auswählen

def f(b):
	return b*b
mit Lambda:

Code: Alles auswählen

f = lambda b:  b*b
Der Aufruf ist bei beiden derselbe:

Code: Alles auswählen

>>> f = lambda b: b**2
>>> f(2)
4
>>> f(6)
36
>>> 
BlackJack

@Python1906: Wenn man die Funktion aufruft statt sie zu übergeben wird sie nur einmal aufgerufen und nicht noch jedes mal wenn man auf den Button klick. Ginge ja auch gar nicht, denn man hat ja nicht die Funktion sondern deren Rückgabewert übergeben.

Zum kürzer schreiben von Funktionsdefinitionen ist es nicht gedacht, denn es macht keinen Sinn eine anonyme Funktion an einen Namen zu binden. Dann ist es ja keine anonyme Funktion mehr und man kann gleich mit ``def`` definieren. Das ist lesbarer und die Funktion kennt dann auch ihren Namen, was in Tracebacks zur Fehlersuche nützlicher ist als nur <lambda> dort zu lesen.
Antworten