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:
def 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:
res = outer()
res() # vypíše 1
Zavolejme res několikrát.
Po provedení kódu se čítač
i pokaždé zvýší o jednu:
res() # 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:
res1 = 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
Je dán následující kód:
def 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.
Vytvořte funkci, jejíž každé volání bude vracet další Fibonacciho číslo.
Vytvořte funkci, která bude vracet náhodné celé číslo v intervalu, ale tak, aby se dvakrát po sobě neobjevilo stejné.