Պիտոնում փակումները
Փակում-ի (closure) տակ հասկանում են ֆունկցիան՝ միասին դրան հասանելի բոլոր արտաքին փոփոխականների հետ:
Պիտոնում, ամենից հաճախ, «ֆունկցիայի փակում» ասելով, նկատի ունեն ոչ թե հենց այդ ֆունկցիան, այլ հենց դրա արտաքին փոփոխականները:
Ենթադրենք ունենք հետևյալ 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()
Ասեք, թե ինչ կարտածվի կոնսոլ:
Ստեղծեք ֆունկցիա, որի ամեն կանչ կկանչի Ֆիբոնաչչիի հաջորդ թիվը:
Ստեղծեք ֆունկցիա, որն կտա պատահական ամբողջ թիվ միջակայքում, բայց այնպես, որ երկու անգամ անընդմեջ նույնը չլինի: