Chiusure in Python
Per chiusura (closure) si intende una funzione insieme a tutte le variabili esterne ad essa accessibili.
In Python, spesso, quando si dice "chiusura di una funzione", ci si riferisce non alla funzione stessa, ma proprio alle sue variabili esterne.
Supponiamo di avere la seguente funzione outer,
in cui è dichiarata una variabile i e
una funzione interna inner. In essa
a i verrà aggiunto uno. Affinché
la variabile i funzioni correttamente,
aggiungiamo ad essa l'istruzione nonlocal:
def outer():
i = 0
def inner():
nonlocal i
i += 1
print(i)
return inner
Ora mettiamo la funzione esterna in
una variabile res e chiamiamola con
le parentesi tonde:
res = outer()
res() # stamperà 1
Chiamiamo res più volte.
Dopo l'esecuzione del codice ogni volta il contatore
i aumenterà di uno:
res() # stamperà 2
res() # stamperà 3
res() # stamperà 4
Tuttavia c'è una sfumatura importante qui - ogni
chiamata della funzione outer aumenterà
il proprio contatore. Mettiamo la prima chiamata di outer
in una variabile res1, e la seconda
chiamata - in una variabile res2. Poi
stampiamole in sequenza nella console:
res1 = outer()
res1() # stamperà 1
res1() # stamperà 2
res1() # stamperà 3
res2 = outer()
res2() # stamperà 1
res2() # stamperà 2
res2() # stamperà 3
È dato il seguente codice:
def outer():
i = 10
def inner():
nonlocal i
i -= 2
print(i)
return inner
res1 = outer()
res1()
res1()
res2 = outer()
res2()
res2()
res2()
Dite cosa verrà stampato nella console.
Create una funzione, ogni chiamata della quale restituirà il numero di Fibonacci successivo.
Create una funzione che restituirà un numero intero casuale in un intervallo, ma in modo che non sia lo stesso due volte di seguito.