Python-дағы жабықтаулар

Жабықтау (closure) деп функцияға қолжетімді барлық сыртқы айнымалылармен бірге функцияны айтады.

Python-да көбінесе "функцияның жабықтауы" деген сөзді айтқанда, дәл осы функцияның емес, дәл оның сыртқы айнымалыларын айтады.

Бізде outer деген функция бар делік, онда i айнымалысы жарияланған және ішкі inner функциясы бар. Онда i-ге бірлік қосылады. i айнымалысы дұрыс жұмыс істеуі үшін, оған nonlocal инструкциясын қосамыз:

pythondef outer():
  i = 0
  def inner():
    nonlocal i
    i += 1
    print(i)
  
  return inner

Енді сыртқы функцияны res айнымалысына салайық және оны жақшамен шақырайық:

pythonres = outer()
res() # шығарады 1

res-ті бірнеше рет шақырайық. Код орындалғаннан кейін әр жолы i санағышы бірлікке өседі:

pythonres() # шығарады 2
res() # шығарады 3
res() # шығарады 4

Бірақ мұнда маңызды нюанс бар - әрбір outer функциясын шақыру өз санағышын арттырады. Бірінші outer шақыруын res1 айнымалысына салайық, ал екінші шақыруды - res2 айнымалысына. Содан кейін оларды консольге ретімен шығарайық:

pythonres1 = outer()
res1() # шығарады 1
res1() # шығарады 2
res1() # шығарады 3

res2 = outer()
res2() # шығарады 1
res2() # шығарады 2
res2() # шығарады 3
Задание 1

Мына код берілген:

pythondef outer():
  i = 10

  def inner():
    nonlocal i
    i -= 2
    print(i)
  return inner
  
res1 = outer()
res1()
res1()

res2 = outer()
res2()
res2()
res2()

Консольге не шығатынын айтыңыз.

Задание 2

Әр шақыру келесі Фибоначчи санын шығаратын функция жасаңыз.

Задание 3

Аралықта кездейсоқ бүтін сан шығаратын функция жасаңыз, бірақ сандар екі рет қатарынан бірдей болмауы керек.