Aizvērumi Python
Ar aizvērumu (closure) saprot funkciju kopā ar visām ārējām mainīgajām, kas tai ir pieejamas.
Python biežāk, runājot "funkcijas aizvērums", domā nevis pašu funkciju, bet tieši tās ārējos mainīgos.
Pieņemsim, ka mums ir šāda funkcija outer,
kurā deklarēts mainīgais i un
iekšējā funkcija inner. Tajā
i tiks pieskaitīts viens. Lai
mainīgais i darbotos korekti,
pievienojam tam instrukciju nonlocal:
def outer():
i = 0
def inner():
nonlocal i
i += 1
print(i)
return inner
Tagad ieliksim ārējo funkciju
mainīgajā res un izsauksim to ar
apaļām iekavām:
res = outer()
res() # izvadīs 1
Izsauksim res vairākas reizes.
Pēc koda izpildes katru reizi skaitītājs
i palielināsies par vienu:
res() # izvadīs 2
res() # izvadīs 3
res() # izvadīs 4
Tomēr šeit ir svarīga nianse - katrs
funkcijas outer izsaukums palielinās
savu skaitītāju. Ieliksim pirmo outer
izsaukumu mainīgajā res1, bet otro
izsaukumu - mainīgajā res2. Tad
secīgi izvadīsim tos konsolē:
res1 = outer()
res1() # izvadīs 1
res1() # izvadīs 2
res1() # izvadīs 3
res2 = outer()
res2() # izvadīs 1
res2() # izvadīs 2
res2() # izvadīs 3
Dots šāds kods:
def outer():
i = 10
def inner():
nonlocal i
i -= 2
print(i)
return inner
res1 = outer()
res1()
res1()
res2 = outer()
res2()
res2()
res2()
Sakiet, kas tiks izvadīts konsolē.
Izveidojiet funkciju, kuras katrs izsaukums izsauks nākamo Fibonači skaitli.
Izveidojiet funkciju, kas izvadīs nejaušu veselu skaitli intervālā, bet tā, lai divas reizes pēc kārtas nebūtu vienādi.