Lukking i Python
Med lukking (closure) mener man en funksjon sammen med alle de eksterne variablene som er tilgjengelige for den.
I Python, når man sier "funksjonslukking", mener man som oftest ikke selve funksjonen, men nettopp dens eksterne variabler.
La oss si at vi har følgende funksjon outer,
der variabelen i er deklarert og
en indre funksjon inner. I den vil
i bli økt med én. For at
variabelen i skal fungere korrekt,
legger vi til setningen nonlocal:
def outer():
i = 0
def inner():
nonlocal i
i += 1
print(i)
return inner
La oss nå legge den ytre funksjonen i
variabelen res og kalle den med
parenteser:
res = outer()
res() # skriver ut 1
La oss kalle res flere ganger.
Etter kjøring av koden vil telleren
i økes med én hver gang:
res() # skriver ut 2
res() # skriver ut 3
res() # skriver ut 4
Det er imidlertid en viktig nyanse her - hvert
kall til funksjonen outer vil øke
sin egen teller. La oss skrive det første kallet til outer
i variabelen res1, og det andre
kallet - i variabelen res2. Deretter
skriver vi dem sekvensielt til konsollen:
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ølgende kode er gitt:
def outer():
i = 10
def inner():
nonlocal i
i -= 2
print(i)
return inner
res1 = outer()
res1()
res1()
res2 = outer()
res2()
res2()
res2()
Si hva som skrives ut i konsollen.
Lag en funksjon hvor hvert kall vil gi det neste Fibonacci-tallet.
Lag en funksjon som gir et tilfeldig heltall i et intervall, men slik at det ikke er det samme to ganger på rad.