Uzávěry v Pythone
Pod uzávierkou (closure) sa rozumie funkcia spolu so všetkými vonkajšími premennými, ktoré sú jej prístupné.
V Pythone sa najčastejšie, keď sa hovorí "uzávierka funkcie", nemyslí táto funkcia sama, ale práve jej vonkajšie premenné.
Nech máme nasledujúcu funkciu outer,
v ktorej je deklarovaná premenná i a
vnútorná funkcia inner. V nej sa k
i bude pričítať jednotka. Aby
premenná i korektne fungovala,
pridáme k nej inštrukciu nonlocal:
def outer():
i = 0
def inner():
nonlocal i
i += 1
print(i)
return inner
Teraz dajme vonkajšiu funkciu do
premennej res a zavolajme ju s
okrúhlymi zátvorkami:
res = outer()
res() # vypíše 1
Dajme niekoľkokrát zavolať res.
Po vykonaní kódu sa zakaždým počítadlo
i zvýši o jednotku:
res() # vypíše 2
res() # vypíše 3
res() # vypíše 4
Avšak je tu dôležitá nuansa - každé
volanie funkcie outer bude zvyšovať
svoje počítadlo. Dajme prvé volanie outer
zapísať do premennej res1, a druhé
volanie - do premennej res2. Potom
postupne vypíšme ich do konzoly:
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
Daný je nasledujúci 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()
Povedzte, čo sa vypíše do konzoly.
Urobte funkciu, ktorej každé volanie bude vypisovať nasledujúce Fibonacciho číslo.
Urobte funkciu, ktorá bude vypisovať náhodné celé číslo v intervale, ale tak, aby sa dva krát po sebe neopakovalo to isté.