Closures i Python
Med closure (closure) forstås en funktion sammen med alle de eksterne variable, der er tilgængelige for den.
I Python, når man siger "funktionsclosure", mener man som oftest ikke selve funktionen, men netop dens eksterne variable.
Lad os sige, at vi har følgende funktion outer,
hvor variablen i er erklæret og
en indre funktion inner. I den vil
i blive øget med en. For at
variablen i skal fungere korrekt,
tilføjer vi instruktionen nonlocal til den:
def outer():
i = 0
def inner():
nonlocal i
i += 1
print(i)
return inner
Lad os nu putte den ydre funktion i
variablen res og kalde den med
parenteser:
res = outer()
res() # udskriver 1
Lad os kalde res flere gange.
Efter udførelse af koden hver gang vil tælleren
i blive øget med en:
res() # udskriver 2
res() # udskriver 3
res() # udskriver 4
Men der er en vigtig nuance her - hvert
kald af funktionen outer vil øge
sin egen tæller. Lad os skrive det første kald af outer
i variablen res1, og det andet
kald - i variablen res2. Derefter
udskriver vi dem sekventielt i konsollen:
res1 = outer()
res1() # udskriver 1
res1() # udskriver 2
res1() # udskriver 3
res2 = outer()
res2() # udskriver 1
res2() # udskriver 2
res2() # udskriver 3
Følgende kode er givet:
def outer():
i = 10
def inner():
nonlocal i
i -= 2
print(i)
return inner
res1 = outer()
res1()
res1()
res2 = outer()
res2()
res2()
res2()
Sig, hvad der udskrives i konsollen.
Lav en funktion, hvor hvert kald vil returnere det næste Fibonacci-tal.
Lav en funktion, der returnerer et tilfældigt heltal i et interval, men således at der ikke forekommer to ens tal i træk.