Mbylljet në Python

Nën mbyllje (closure) kuptohet një funksion së bashku me të gjitha ndryshoret e jashtme që janë të disponueshme për të.

Në Python më shpesh, kur thuhet "mbyllja e një funksioni", nënkuptohen jo vetë funksioni, por pikërisht ndryshoret e tij të jashtme.

Le të themi se kemi funksionin e mëposhtëm outer, brenda të cilit është deklaruar ndryshorja i dhe funksioni i brendshëm inner. Në të, i do të rritet me një. Që ndryshorja i të funksionojë si duhet, i shtojmë asaj udhëzimin nonlocal:

pythondef outer():
  i = 0
  def inner():
    nonlocal i
    i += 1
    print(i)
  
  return inner

Tani le të vendosim funksionin e jashtëm në ndryshoren res dhe ta thirrim atë me kllapa të rrumbullakëta:

pythonres = outer()
res() # do të shfaqë 1

Le ta thërrasim res disa herë. Pas ekzekutimit të kodit, numëruesi i do të rritet me një çdo herë:

pythonres() # do të shfaqë 2
res() # do të shfaqë 3
res() # do të shfaqë 4

Sidoqoftë, këtu ka një nuancë të rëndësishme - çdo thirrje i funksionit outer do të rrisë numëruesin e vet. Le të vendosim thirrjen e parë të outer në ndryshoren res1, dhe thirrjen e dytë - në ndryshoren res2. Pastaj le t'i shfaqim ato në konsoll në mënyrë sekuenciale:

pythonres1 = outer()
res1() # do të shfaqë 1
res1() # do të shfaqë 2
res1() # do të shfaqë 3

res2 = outer()
res2() # do të shfaqë 1
res2() # do të shfaqë 2
res2() # do të shfaqë 3
Задание 1

Jepet kodi i mëposhtëm:

pythondef outer():
  i = 10

  def inner():
    nonlocal i
    i -= 2
    print(i)
  return inner
  
res1 = outer()
res1()
res1()

res2 = outer()
res2()
res2()
res2()

Thuani, çfarë do të shfaqet në konsoll.

Задание 2

Krijoni një funksion, ku çdo thirrje e tij do të kthejë numrin e ardhshëm të Fibonaçit.

Задание 3

Krijoni një funksion, i cili do të japë një numër të rastësishëm të plotë në një interval, por në mënyrë që dy herë radhazi të mos ketë numra të njëjtë.