Closures in Python
Unter Closure (closure) versteht man eine Funktion zusammen mit allen externen Variablen, die für sie zugänglich sind.
In Python meint man, wenn man von "Closure einer Funktion" spricht, meist nicht die Funktion selbst, sondern genau ihre externen Variablen.
Nehmen wir an, wir haben die folgende Funktion outer,
in der die Variable i und
eine innere Funktion inner deklariert ist. In ihr wird
zu i eins addiert. Damit
die Variable i korrekt funktioniert,
fügen wir die Anweisung nonlocal hinzu:
def outer():
i = 0
def inner():
nonlocal i
i += 1
print(i)
return inner
Lassen Sie uns nun die äußere Funktion in
die Variable res setzen und sie mit
runden Klammern aufrufen:
res = outer()
res() # gibt 1 aus
Lassen Sie uns res mehrmals aufrufen.
Nach der Ausführung des Codes wird der Zähler
i jedes Mal um eins erhöht:
res() # gibt 2 aus
res() # gibt 3 aus
res() # gibt 4 aus
Allerdings gibt es hier eine wichtige Nuance - jeder
Aufruf der Funktion outer wird seinen
eigenen Zähler erhöhen. Lassen Sie uns den ersten Aufruf von outer
in die Variable res1 schreiben und den zweiten
Aufruf - in die Variable res2. Dann
geben wir sie nacheinander in der Konsole aus:
res1 = outer()
res1() # gibt 1 aus
res1() # gibt 2 aus
res1() # gibt 3 aus
res2 = outer()
res2() # gibt 1 aus
res2() # gibt 2 aus
res2() # gibt 3 aus
Gegeben ist der folgende Code:
def outer():
i = 10
def inner():
nonlocal i
i -= 2
print(i)
return inner
res1 = outer()
res1()
res1()
res2 = outer()
res2()
res2()
res2()
Sagen Sie, was in der Konsole ausgegeben wird.
Erstellen Sie eine Funktion, deren jeder Aufruf die nächste Fibonacci-Zahl aufruft.
Erstellen Sie eine Funktion, die eine zufällige ganze Zahl in einem Intervall ausgibt, aber so, dass nicht zweimal hintereinander dieselbe Zahl erscheint.