Sulkeumat Pythonissa
Sulkeumalla (closure) tarkoitetaan funktiota yhdessä kaikkien sille saatavilla olevien ulkoisten muttujien kanssa.
Pythonissa useimmiten, puhuttaessa "funktion sulkeumasta", ei tarkoiteta itse funktiota, vaan nimenomaan sen ulkoisia muuttujia.
Olkoon meillä seuraava funktio outer,
jossa on määritelty muuttuja i ja
sisäinen funktio inner. Siinä
i:ään lisätään yksi. Jotta
muuttuja i toimisi oikein,
lisäämme sille nonlocal-käskyn:
def outer():
i = 0
def inner():
nonlocal i
i += 1
print(i)
return inner
Nyt laita ulompi funktio muuttujaan
res ja kutsu sitä pyöreillä
suluilla:
res = outer()
res() # tulostaa 1
Kutsutaan res:ää useita kertoja.
Koodin suorittamisen jälkeen laskuri
i kasvaa yhdellä joka kerta:
res() # tulostaa 2
res() # tulostaa 3
res() # tulostaa 4
Tässä on kuitenkin tärkeä vivahde - jokainen
funktion outer kutsu kasvattaa omaa
laskuriaan. Laitetaan ensimmäinen outer-kutsu
muuttujaan res1 ja toinen kutsu -
muuttujaan res2. Tulostetaan sitten
ne peräkkäin konsoliin:
res1 = outer()
res1() # tulostaa 1
res1() # tulostaa 2
res1() # tulostaa 3
res2 = outer()
res2() # tulostaa 1
res2() # tulostaa 2
res2() # tulostaa 3
Annettu on seuraava koodi:
def outer():
i = 10
def inner():
nonlocal i
i -= 2
print(i)
return inner
res1 = outer()
res1()
res1()
res2 = outer()
res2()
res2()
res2()
Mitä konsoliin tulostuu?
Tee funktio, jonka jokainen kutsu palauttaa seuraavan Fibonaccin luvun.
Tee funktio, joka antaa satunnaisen kokonaisluvun väliltä, mutta siten, että samaa lukua ei esiinny kaksi kertaa peräkkäin.