Closures in Python
Onder sluiting (closure) verstaat men een functie samen met alle externe variabelen die voor haar toegankelijk zijn.
In Python bedoelt men, wanneer men "sluiting van een functie" zegt, vaker niet de functie zelf, maar juist haar externe variabelen.
Stel we hebben de volgende functie outer,
waarin variabele i is gedeclareerd en
een innerlijke functie inner. Hierin wordt
aan i één opgeteld. Om ervoor te zorgen
dat variabele i correct werkt,
voegen we er de instructie nonlocal aan toe:
def outer():
i = 0
def inner():
nonlocal i
i += 1
print(i)
return inner
Laten we nu de externe functie in
variabele res zetten en haar aanroepen met
ronde haken:
res = outer()
res() # geeft 1 weer
Laten we res meerdere keren aanroepen.
Na uitvoering van de code zal de teller
i elke keer met één toenemen:
res() # geeft 2 weer
res() # geeft 3 weer
res() # geeft 4 weer
Er is hier echter een belangrijk nuance - elke
aanroep van de functie outer zal haar
eigen teller verhogen. Laten we de eerste aanroep van outer
in variabele res1 zetten, en de tweede
aanroep - in variabele res2. Vervolgens
geven we ze sequentieel weer in de console:
res1 = outer()
res1() # geeft 1 weer
res1() # geeft 2 weer
res1() # geeft 3 weer
res2 = outer()
res2() # geeft 1 weer
res2() # geeft 2 weer
res2() # geeft 3 weer
De volgende code is gegeven:
def outer():
i = 10
def inner():
nonlocal i
i -= 2
print(i)
return inner
res1 = outer()
res1()
res1()
res2 = outer()
res2()
res2()
res2()
Zeg, wat er in de console wordt weergegeven.
Maak een functie, waarvan elke aanroep het volgende Fibonacci-getal oplevert.
Maak een functie die een willekeurig geheel getal in een interval geeft, maar zodanig dat er niet twee keer achter elkaar dezelfde zijn.