Python-da Qapanmalar
Qapanma (closure) anlayisi ile funksiya ve ona muraciet ede bilecek butun xarici deyiskenler nezerde tutulur.
Python-da, adeten "funksiya qapanmasi" deyilende, hemin funksiyanin ozu deyil, eksine onun xarici deyisenleri nezerde tutulur.
Tutaq ki, bizim outer adli bir funksiyamiz var,
icinde i deyiseni elan edilib ve
daxili inner funksiyasi var. Bu funksiyada
i deyisenine bir vahid elave olunur.
i deyiseninin duzgun işlemesi ucun,
ona nonlocal instruksiyasini elave edirik:
def outer():
i = 0
def inner():
nonlocal i
i += 1
print(i)
return inner
Indi ise xarici funksiyani res deyisenine
menimsedek ve onu moterize ile cagiraq:
res = outer()
res() # 1 cap edecek
Gelin res-i bir nece defe cagirag.
Kodu icra etdikden sonra her defe i
sayaci bir vahid artacaq:
res() # 2 cap edecek
res() # 3 cap edecek
res() # 4 cap edecek
Lakin burada muehim bir nüans var - outer
funksiyasinin her cagrilisi oz sayacini artiracaq.
Gelin birinci outer cagirisini res1
deyisenine, ikinci cagirisi ise res2
deyisenine menimsedek. Sonra ise onlari
ardicilliqla konsola cap edek:
res1 = outer()
res1() # 1 cap edecek
res1() # 2 cap edecek
res1() # 3 cap edecek
res2 = outer()
res2() # 1 cap edecek
res2() # 2 cap edecek
res2() # 3 cap edecek
Asagidaki kod verilmisdir:
def outer():
i = 10
def inner():
nonlocal i
i -= 2
print(i)
return inner
res1 = outer()
res1()
res1()
res2 = outer()
res2()
res2()
res2()
Konsola ne cap olunacaqini deyin.
Her cagrildiqda novbeti Fibonaççi ededini geri qaytaran bir funksiya yaradin.
Mueyyen bir araliqda tesadufi tam eded geri qaytaran, lakin ardicil iki defe eyni ededin olmamasini temin eden bir funksiya yaradin.