lambda-Ausdrücke und Bindungen in Python
Durch eine Bindungsanweisung können wir einen Namen an den Wert eines lambda-Ausdrucks binden und später verwenden.
Parameterlose Funktionen
Eine Funktion, die «9» ergibt: ›lambda:9‹.
- Protokoll
f = lambda:9
f()
9
Die Bindung eines lambda-Wertes an einen Namen nennen wir auch eine lambda-Bindung.
Ein Name, der an den Wert von »random()« gebunden wird, hat immer dieselbe Zahl als Wert.
- Protokoll
from random import random
x = random()
f
0.423278698273923
f
0.423278698273923
«lambda:random()» ist hingegen eine Funktion, die bei jedem Aufruf eine neue Zufallszahl ergeben kann.
- Protokoll
from random import random
f = lambda:random()
f()
0.92879023921387852
f()
0.47824578120972094
Dies zeigt, daß die Funktion «lambda:random()» praktisch den Ausdruck »random()« enthält (und nicht nur dessen Wert).
Man kann auch sagen, daß »lambda« die Auswertung des »random()« verzögert, so daß dies nicht schon bei der Ausführung der Anweisung »f = lambda:random()«, sondern erst beim Aufruf der Funktion »f« ausgewertet wird.
Statt »f = lambda:random()« könnte man meist auch kürzer einfach »f = random« schreiben. Oben wurde die längere Schreibweise »f = lambda:random()« nur verwendet, um damit »lambda« vorzuführen.
Eine Funktion, die das Zehnfache einer random-Zufallszahl ergibt:
- Protokoll
from random import random
r10 = lambda: 10 * random()
r10()
3.34982759827982
r10()
8.23528952829382
Speichern der EVA-Programme ⃗
Wenn versucht wird, ein Programm, wie »3 * input()«, zu speichern, so speichert man möglicherweise lediglich das Ergebnis des Programms.
- Protokoll
f = 3 * input()
eingabe
f
eingabeeingabeeingabe
Durch »lambda:« wird die sofortige Ausführung des Programms verhindert, so daß dieses dann an einen Namen gebunden werden kann. Erst bei der Auswertung eines Aufrufs des Programms, wird »3 * input()« dann ausgewertet.
- Protokoll
f = lambda: 3 * input()
f()
eingabe
eingabeeingabeeingabe
f()
abc
abcabcabc
Bezüge auf Namen aus dem Modul ⃗
In einem lambda-Ausdruck kann ein gewöhnlicher Bezeichner als Ausdruck verwendet werden, auch wenn er bei der Auswertung des lambda-Ausdrucks noch gar keinen Wert hat. Er muß aber bei der Auswertung eines Aufrufs der lambda-Funktion einen Wert haben.
- Protokoll (übersetzt)
f =( lambda: x )
x = 2
f()
2
x = 3
f()
3
del x
f()
Namensfehler: Der Name 'x' ist nicht definiert.
Übungsfragen ⃖
? Übungsfrage ⃖
Welche Ausgabe ergibt sich nach der folgenden Eingabe?
- Konsoleneingabe
f = lambda: 3
f()
Übungsaufgaben ⃖
/ Übungsaufgabe ⃖
Schreiben Sie eine Bindungsanweisung, so daß danach der Aufruf »g()« den int-Wert «7» als Wert hat.
- Test (sollte ›True‹ ergeben)
g() == 7
/ Übungsaufgabe
Schreiben Sie eine Bindungsanweisung, so daß danach der Aufruf »h()« die Zeichenfolge »abc« als Wert hat.