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:
def 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:
res = 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ë:
res() # 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:
res1 = 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
Jepet kodi i mëposhtëm:
def 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.
Krijoni një funksion, ku çdo thirrje e tij do të kthejë numrin e ardhshëm të Fibonaçit.
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ë.