Closure u Pythonu

Pod closure-om (closure) podrazumevaju funkciju zajedno sa svim spoljnim promenljivim koje su joj dostupne.

U Pythonu, najčešće, kada kažu "closure funkcije", nemaju u vidu samu tu funkciju, već upravo njene spoljne promenljive.

Neka imamo sledeću funkciju outer, u kojoj je deklarisana promenljiva i i unutrašnja funkcija inner. U njoj će se i uvećati za jedan. Kako bi promenljiva i korektno radila, dodajemo joj instrukciju nonlocal:

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

Sada stavimo spoljnu funkciju u promenljivu res i pozovimo je sa zagradama:

pythonres = outer()
res() # ispisaće 1

Pozovimo res nekoliko puta. Posle izvršenja koda brojač i će se svaki put povećavati za jedan:

pythonres() # ispisaće 2
res() # ispisaće 3
res() # ispisaće 4

Međutim, ovde postoji važan detalj - svaki poziv funkcije outer će povećavati svoj brojač. Neka prvi poziv outer upišemo u promenljivu res1, a drugi poziv - u promenljivu res2. Zatim ispisujemo ih redom u konzolu:

pythonres1 = outer()
res1() # ispisaće 1
res1() # ispisaće 2
res1() # ispisaće 3

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

Dat je sledeći kod:

pythondef outer():
  i = 10

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

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

Recite šta će se ispisati u konzolu.

Задание 2

Napravite funkciju čiji će svaki poziv davati sledeći Fibonačijev broj.

Задание 3

Napravite funkciju koja će davati slučajan ceo broj u opsegu, ali tako da dva puta uzastopno nisu isti.