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()
Консольго эмне чыгаарын айтыңыз.
Ар бир чакыруусу кийинки Фибоначчи санын чыгара турган функция жасаңыз.
Белгилүү бир аралыкта кокус бүтүн сан берген, бирок бир эле сан эки жолу кайталанбаган функция жасаңыз.