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:

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

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

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

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

Daný je nasledujúci 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()

Povedzte, čo sa vypíše do konzoly.

Задание 2

Urobte funkciu, ktorej každé volanie bude vypisovať nasledujúce Fibonacciho číslo.

Задание 3

Urobte funkciu, ktorá bude vypisovať náhodné celé číslo v intervale, ale tak, aby sa dva krát po sebe neopakovalo to isté.