Python-дағы жабықтаулар
Жабықтау (closure) деп функцияға қолжетімді барлық сыртқы айнымалылармен бірге функцияны айтады.
Python-да көбінесе "функцияның жабықтауы" деген сөзді айтқанда, дәл осы функцияның емес, дәл оның сыртқы айнымалыларын айтады.
Бізде outer деген функция бар делік,
онда i айнымалысы жарияланған және
ішкі inner функциясы бар. Онда
i-ге бірлік қосылады. i
айнымалысы дұрыс жұмыс істеуі үшін,
оған nonlocal инструкциясын қосамыз:
def outer():
i = 0
def inner():
nonlocal i
i += 1
print(i)
return inner
Енді сыртқы функцияны res
айнымалысына салайық және оны
жақшамен шақырайық:
res = outer()
res() # шығарады 1
res-ті бірнеше рет шақырайық.
Код орындалғаннан кейін әр жолы i
санағышы бірлікке өседі:
res() # шығарады 2
res() # шығарады 3
res() # шығарады 4
Бірақ мұнда маңызды нюанс бар - әрбір
outer функциясын шақыру өз
санағышын арттырады. Бірінші outer
шақыруын res1 айнымалысына салайық,
ал екінші шақыруды - res2 айнымалысына.
Содан кейін оларды консольге ретімен шығарайық:
res1 = outer()
res1() # шығарады 1
res1() # шығарады 2
res1() # шығарады 3
res2 = outer()
res2() # шығарады 1
res2() # шығарады 2
res2() # шығарады 3
Мына код берілген:
def outer():
i = 10
def inner():
nonlocal i
i -= 2
print(i)
return inner
res1 = outer()
res1()
res1()
res2 = outer()
res2()
res2()
res2()
Консольге не шығатынын айтыңыз.
Әр шақыру келесі Фибоначчи санын шығаратын функция жасаңыз.
Аралықта кездейсоқ бүтін сан шығаратын функция жасаңыз, бірақ сандар екі рет қатарынан бірдей болмауы керек.