Pythonda Yopilishlar
Yopilish (closure) deb funksiya bilan birga unga kirish mumkin bo‘lgan barcha tashqi o‘zgaruvchilar tushuniladi.
Pythonda ko‘pincha, "funksiya yopilishi" deyilganda, o‘sha funksiyaning o‘zi emas, balki aynan uning tashqi o‘zgaruvchilari nazarda tutiladi.
Faraz qilaylik, bizda outer deb nomlangan
funksiya mavjud bo‘lib, unda i o‘zgaruvchisi
va inner ichki funksiyasi e’lon qilingan.
Undagi i o‘zgaruvchisiga bir qo‘shiladi.
i o‘zgaruvchisi to‘g‘ri ishlashi uchun,
unga nonlocal instruksiyasini qo‘shamiz:
def outer():
i = 0
def inner():
nonlocal i
i += 1
print(i)
return inner
Endi tashqi funksiyani res o‘zgaruvchisiga
joylashtiramiz va uni qavslar bilan chaqiramiz:
res = outer()
res() # 1 chiqadi
Keling, res ni bir necha marta chaqiraylik.
Kod bajarilgandan so‘ng, har safar i
hisoblagichi bittaga oshadi:
res() # 2 chiqadi
res() # 3 chiqadi
res() # 4 chiqadi
Biroq, bu yerda muhim nuans bor - outer
funksiyasini har bir chaqirishi o‘z hisoblagichini
oshiradi. Keling, birinchi outer chaqiruvini
res1 o‘zgaruvchisiga, ikkinchi chaqiruvni esa
res2 o‘zgaruvchisiga joylashtiraylik. Keyin
ularni ketma-ket konsolga chiqaramiz:
res1 = outer()
res1() # 1 chiqadi
res1() # 2 chiqadi
res1() # 3 chiqadi
res2 = outer()
res2() # 1 chiqadi
res2() # 2 chiqadi
res2() # 3 chiqadi
Quyidagi kod berilgan:
def outer():
i = 10
def inner():
nonlocal i
i -= 2
print(i)
return inner
res1 = outer()
res1()
res1()
res2 = outer()
res2()
res2()
res2()
Konsolda nima chiqishini aytib bering.
Har chaqiruvi keyingi Fibonachchi sonini chiqaradigan funksiya yarating.
Oraliqda tasodifiy butun son chiqaradigan, lekin ketma-ket ikkita bir xil son bo‘lmasligi kerak bo‘lgan funksiya yarating.