Zaprtja v Pythonu

Z zaprtjem (closure) razumemo funkcijo skupaj z vsemi zunanjimi spremenljivkami, ki so ji dostopne.

V Pythonu običajno, ko rečejo "zaprtje funkcije", ne mislijo na samo funkcijo, ampak ravno na njene zunanje spremenljivke.

Recimo, da imamo naslednjo funkcijo outer, v kateri je deklarirana spremenljivka i in notranja funkcija inner. V njej se bo k i prištevala ena. Da bi spremenljivka i pravilno delovala, dodamo k njej stavek nonlocal:

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

Zdaj pa dajmo zunanjo funkcijo v spremenljivko res in jo pokličimo z okroglimi oklepaji:

pythonres = outer()
res() # izpiše 1

Pokličimo res večkrat. Po izvedbi koda bo števec i vsakič narasel za ena:

pythonres() # izpiše 2
res() # izpiše 3
res() # izpiše 4

Vendar pa je tu pomemben odtenek - vsak klic funkcije outer bo povečal svoj števec. Naj bo prvi klic outer zapisan v spremenljivko res1, drugi klic pa v spremenljivko res2. Nato zaporedoma izpišimo njihove vrednosti v konzolo:

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

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

Podana je naslednja koda:

pythondef outer():
  i = 10

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

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

Povejte, kaj se bo izpisalo v konzolo.

Задание 2

Naredite funkcijo, katere vsak klic bo vrnil naslednje Fibonaccijevo število.

Задание 3

Naredite funkcijo, ki bo vračala naključno celo število v danem intervalu, vendar tako, da zaporedoma ne bo dveh enakih.