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:

pythondef 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:

pythonres = outer()
res() # 1 chiqadi

Keling, res ni bir necha marta chaqiraylik. Kod bajarilgandan so‘ng, har safar i hisoblagichi bittaga oshadi:

pythonres() # 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:

pythonres1 = outer()
res1() # 1 chiqadi
res1() # 2 chiqadi
res1() # 3 chiqadi

res2 = outer()
res2() # 1 chiqadi
res2() # 2 chiqadi
res2() # 3 chiqadi
Задание 1

Quyidagi kod berilgan:

pythondef 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.

Задание 2

Har chaqiruvi keyingi Fibonachchi sonini chiqaradigan funksiya yarating.

Задание 3

Oraliqda tasodifiy butun son chiqaradigan, lekin ketma-ket ikkita bir xil son bo‘lmasligi kerak bo‘lgan funksiya yarating.