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:

pythondef 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:

pythonres = 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:

pythonres() # 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:

pythonres1 = 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
Задание 1

Gegeben ist der folgende Code:

pythondef 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.

Задание 2

Erstellen Sie eine Funktion, deren jeder Aufruf die nächste Fibonacci-Zahl aufruft.

Задание 3

Erstellen Sie eine Funktion, die eine zufällige ganze Zahl in einem Intervall ausgibt, aber so, dass nicht zweimal hintereinander dieselbe Zahl erscheint.