lambda-Ausdrücke zur Bestimmung des Zeitpunktes in Python
Das Warten illustriert die schrittweise Abarbeitung
- Protokoll
from time import sleep
print( 1 ); sleep( 1 ); print( 2 )
Wir wollen »sleep( 1 )« mit »Warten« abkürzen.
- Protokoll
from time import sleep
Warten = sleep( 1 )
print( 1 ); Warten; print( 2 )
Der obige Versuch verhält sich aber nicht wie gewünscht. Statt dessen geht aber folgendes.
- Protokoll
from time import sleep
Warten = lambda: sleep( 1 )
print( 1 ); Warten(); print( 2 )
Durch das »lambda« wurde der Eintritt der Änderung (des Wartens) von der Definition zum Aufruf verschoben.
Dies liegt daran, daß der Wert des lambda-Ausdrucks »lambda: sleep( 1 )« den Aufruf »sleep( 1 )« enthält, aber dieser Aufruf noch nicht ausgewertet wurde. Erst beim Aufruf des lambda-Ausdrucks mit »Warten()« wird »sleep( 1 )« dann ausgewertet. »Warten()« kann auch mehrfach ausgewertet werden; bei jeder Auswertung wird »sleep( 1 )« dann erneut ausgewertet.
Inkarnation und Aktivierung ⃗
lambda-Ausdrücke erlauben es uns, die Inkarnation einer Funktion (Verbindung mit einem Argumentwert) von der nachfolgenden Aktivierung (Ausführung) zu trennen.
- Ausführung
p2 = lambda: print( 2 )
Die Funktion «p2» repräsentiert nun eine Inkarnation (d.h. Verbindung) der Funktion ›print‹ mit dem Argumentwert «2». Da diese aber noch nicht aktiviert wurde, wurde bisher noch nichts ausgegeben. Durch einen Aufruf von «p2» können wir die Inkarnation aktivieren (auch wiederholt).
- Auswertung
p2()
2
- Auswertung
p2()
2
Wenn »print( 2 )« ausgewertet wird, erfolgt beides direkt hintereinander: Die Funktion ›print‹ wird mit dem Argumentwert «2» inkarniert und die Inkarnation wird aktiviert.
Wir nennen eine Inkarnation wie »p2« auch eine lambda-Inkarnation.
Verschachtelte lambda-Ausdrücke *
Wir können auch eine Funktion «erzeuge_Warten» schreiben, die einen lambda-Wert ergibt, der einen Wert enthält, der erst beim Aufruf von «erzeuge_Warten» festgelegt wird.
- Protokoll
from time import sleep
erzeuge_Warten = lambda x: lambda: sleep( x )
Warten = erzeuge_Warten( 1 ) # lambda: sleep( 1 )
print( 1 ); Warten(); print( 2 )
»Warten = erzeuge_Warten( 1 )« bedeutet dasselbe wie »Warten = lambda: sleep( 1 )«, da »lambda: sleep( 1 )« der Wert von »erzeuge_Warten( 1 )« ist.