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:

pythondef 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:

pythonres = outer()
res() # väljastab 1

Kutsume res mitu korda välja. Pärast koodi täitmist suurendab loendur i iga kord ühe võrra:

pythonres() # 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:

pythonres1 = 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
Задание 1

Antud on järgmine kood:

pythondef 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.

Задание 2

Tehke funktsioon, mille iga väljakutse annab järgmise Fibonacci arvu.

Задание 3

Tehke funktsioon, mis annab juhusliku täisarvu vahemikus, kuid nii, et kaks korda järjest ei oleks sama.