Uzávěry v Pythonu

Pod pojmem uzávěr (closure) se rozumí funkce spolu se všemi vnějšími proměnnými, které jsou jí přístupné.

V Pythonu nejčastěji, když se řekne "uzávěr funkce", nemyslí se tím samotná funkce, ale právě její vnější proměnné.

Předpokládejme, že máme následující funkci outer, ve které je deklarována proměnná i a vnitřní funkce inner. V ní se k i přičte jedna. Aby proměnná i fungovala správně, přidáme k ní příkaz nonlocal:

pythondef outer():
  i = 0
  def inner():
    nonlocal i
    i += 1
    print(i)
  
  return inner

Nyní vložme vnější funkci do proměnné res a zavolejme ji s kulatými závorkami:

pythonres = outer()
res() # vypíše 1

Zavolejme res několikrát. Po provedení kódu se čítač i pokaždé zvýší o jednu:

pythonres() # vypíše 2
res() # vypíše 3
res() # vypíše 4

Je zde však důležitá nuance - každé volání funkce outer zvýší svůj vlastní čítač. Zapišme první volání outer do proměnné res1 a druhé volání - do proměnné res2. Poté je postupně vypišme do konzole:

pythonres1 = outer()
res1() # vypíše 1
res1() # vypíše 2
res1() # vypíše 3

res2 = outer()
res2() # vypíše 1
res2() # vypíše 2
res2() # vypíše 3
Задание 1

Je dán následující kód:

pythondef outer():
  i = 10

  def inner():
    nonlocal i
    i -= 2
    print(i)
  return inner
  
res1 = outer()
res1()
res1()

res2 = outer()
res2()
res2()
res2()

Řekněte, co se vypíše do konzole.

Задание 2

Vytvořte funkci, jejíž každé volání bude vracet další Fibonacciho číslo.

Задание 3

Vytvořte funkci, která bude vracet náhodné celé číslo v intervalu, ale tak, aby se dvakrát po sobě neobjevilo stejné.