Închideri în Python
Prin închidere (closure) se înțelege o funcție împreună cu toate variabilele externe la care are acces.
În Python, cel mai adesea, spunând "închiderea unei funcții", se referă nu la funcția în sine, ci mai degrabă la variabilele ei externe.
Să presupunem că avem următoarea funcție outer,
în care este declarată variabila i și
o funcție internă inner. În aceasta, la
i va fi adăugată o unitate. Pentru ca
variabila i să funcționeze corect,
adăugăm instrucțiunea nonlocal:
def outer():
i = 0
def inner():
nonlocal i
i += 1
print(i)
return inner
Acum să punem funcția externă în
variabila res și să o apelăm cu
paranteze rotunde:
res = outer()
res() # va afișa 1
Să apelăm res de mai multe ori.
După executarea codului, de fiecare dată
contorul i va crește cu o unitate:
res() # va afișa 2
res() # va afișa 3
res() # va afișa 4
Cu toate acestea, există o nuanță importantă aici - fiecare
apel al funcției outer va incrementa
propriul său contor. Să notăm primul apel outer
în variabila res1, iar al doilea
apel - în variabila res2. Apoi
să le afișăm secvențial în consolă:
res1 = outer()
res1() # va afișa 1
res1() # va afișa 2
res1() # va afișa 3
res2 = outer()
res2() # va afișa 1
res2() # va afișa 2
res2() # va afișa 3
Este dat următorul cod:
def outer():
i = 10
def inner():
nonlocal i
i -= 2
print(i)
return inner
res1 = outer()
res1()
res1()
res2 = outer()
res2()
res2()
res2()
Spuneți ce va fi afișat în consolă.
Creați o funcție, fiecare apel al căreia va returna următorul număr Fibonacci.
Creați o funcție care va genera un număr întreg aleatoriu într-un interval, dar astfel încât să nu fie același de două ori la rând.