Sulendid Pythonis
Sulendiga (closure) mõistetakse funktsiooni koos kõigi talle kättesaadavate väliste muutujatega.
Pythonis mõeldakse enamasti "funktsiooni sulendi" all mitte funktsiooni ennast, vaid just tema välimisi muutujaid.
Olgu meil järgmine funktsioon outer,
kuses on deklareeritud muutuja i ja
sise funktsioon inner. Selles lisatakse
i-le üks. Et
muutuja i töötaks korrektselt,
lisame sellele käsu nonlocal:
def outer():
i = 0
def inner():
nonlocal i
i += 1
print(i)
return inner
Nüüd paneme välimise funktsiooni
muutujasse res ja kutsume selle välja
ümara sulgudega:
res = outer()
res() # väljastab 1
Kutsume res mitu korda välja.
Pärast koodi täitmist suurendab loendur
i iga kord ühe võrra:
res() # väljastab 2
res() # väljastab 3
res() # väljastab 4
Siin on aga oluline nüanss - iga
funktsiooni outer väljakutse suurendab
oma loendurit. Paneme esimese outer
väljakutse muutujasse res1 ja teise
väljakutse - muutujasse res2. Seejärel
väljastame need järjest konsooli:
res1 = outer()
res1() # väljastab 1
res1() # väljastab 2
res1() # väljastab 3
res2 = outer()
res2() # väljastab 1
res2() # väljastab 2
res2() # väljastab 3
Antud on järgmine kood:
def outer():
i = 10
def inner():
nonlocal i
i -= 2
print(i)
return inner
res1 = outer()
res1()
res1()
res2 = outer()
res2()
res2()
res2()
Öelge, mis konsooli väljastatakse.
Tehke funktsioon, mille iga väljakutse annab järgmise Fibonacci arvu.
Tehke funktsioon, mis annab juhusliku täisarvu vahemikus, kuid nii, et kaks korda järjest ei oleks sama.