Pythonda Ýapyk Funksiýalar
Ýapyk funksiýa (closure) diýmek, oňa elýeterli bolan ähli daşky üýtgeýjiler bilen birleşdirilen funksiýa düşünilýär.
Python-da, köplenç "funksiýanyň ýapyklygy" diýilende, öz funksiýanyň özü däl-de, onuň daşky üýtgeýjileri göz öňünde tutulýar.
Bizde outer atly funksiýa bolup, onda
i üýtgeýjisi we inner atly içki
funksiýa bardyr diýeliň. Onda i bir
birlik artdyrylar. i üýtgeýjisiniň
dogry işlemegi üçin, biz oňa nonlocal
buýrugyny goşarys:
def outer():
i = 0
def inner():
nonlocal i
i += 1
print(i)
return inner
Indi daşky funksiýamyzy res üýtgeýjisine
goýup, ony ýönekeý jaýlar bilen çagyrýarys:
res = outer()
res() # 1 çap eder
Geliň res-i birnäçe gezek çagirayň.
Kod ýerine ýetirilenden soň, her gezek sanawçy
i bir birlik artar:
res() # 2 çap eder
res() # 3 çap eder
res() # 4 çap eder
Emma bu ýerde bir wajyp nuans bar - outer
funksiýasynyň her çaýrylyşy öz sanawçysyny artyrar.
Geliň outer funksiýasynyň birinji
çaýrylyşyny res1 üýtgeýjisine, ikinji
çaýrylyşyny bolsa res2 üýtgeýjisine ýazyň.
Soňra olary yzly-ýyzdan konsola çap edeliň:
res1 = outer()
res1() # 1 çap eder
res1() # 2 çap eder
res1() # 3 çap eder
res2 = outer()
res2() # 1 çap eder
res2() # 2 çap eder
res2() # 3 çap eder
Aşakdaky kod berlen:
def outer():
i = 10
def inner():
nonlocal i
i -= 2
print(i)
return inner
res1 = outer()
res1()
res1()
res2 = outer()
res2()
res2()
res2()
Konsola näme çap ediler, aýdyň.
Her çaýrylyşy indiki Fibonacci sanyny çykarýan funksiýa ýasaň.
Mukdarda yzygiderlik iki gezek deň bolmazlyk üçin, aralykda tötänleýin bitin san çykarýan funksiýa ýasaň.