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:
def 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:
res = outer()
res() # ispisaće 1
Pozovimo res nekoliko puta.
Posle izvršenja koda brojač
i će se svaki put povećavati za jedan:
res() # 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:
res1 = 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
Dat je sledeći kod:
def 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.
Napravite funkciju čiji će svaki poziv davati sledeći Fibonačijev broj.
Napravite funkciju koja će davati slučajan ceo broj u opsegu, ali tako da dva puta uzastopno nisu isti.