Closure i Python
Med closure (closure) menas en funktion tillsammans med alla externa variabler som är tillgängliga för den.
I Python, när man säger "funktions closure", menar man oftast inte själva funktionen, utan just dess externa variabler.
Låt oss säga att vi har följande funktion outer,
där variabeln i är deklarerad och
en inre funktion inner. I den kommer
i att ökas med ett. För att
variabeln i ska fungera korrekt,
lägger vi till satsen nonlocal:
def outer():
i = 0
def inner():
nonlocal i
i += 1
print(i)
return inner
Låt oss nu sätta den yttre funktionen i
variabeln res och anropa den med
runda parenteser:
res = outer()
res() # skriver ut 1
Låt oss anropa res flera gånger.
Efter att koden har körts kommer räknaren
i att ökas med ett varje gång:
res() # skriver ut 2
res() # skriver ut 3
res() # skriver ut 4
Men det finns en viktig nyans här - varje
anrop till funktionen outer kommer att öka
sin egen räknare. Låt oss sätta det första anropet till outer
i variabeln res1, och det andra
anropet - i variabeln res2. Sedan
skriver vi ut dem i konsolen sekventiellt:
res1 = outer()
res1() # skriver ut 1
res1() # skriver ut 2
res1() # skriver ut 3
res2 = outer()
res2() # skriver ut 1
res2() # skriver ut 2
res2() # skriver ut 3
Följande kod ges:
def outer():
i = 10
def inner():
nonlocal i
i -= 2
print(i)
return inner
res1 = outer()
res1()
res1()
res2 = outer()
res2()
res2()
res2()
Säg vad som skrivs ut i konsolen.
Skapa en funktion, där varje anrop ger nästa Fibonacci-tal.
Skapa en funktion som ger ett slumpmässigt heltal i ett intervall, men så att samma tal inte förekommer två gånger i rad.