Պիտոնում փակումները

Փակում-ի (closure) տակ հասկանում են ֆունկցիան՝ միասին դրան հասանելի բոլոր արտաքին փոփոխականների հետ:

Պիտոնում, ամենից հաճախ, «ֆունկցիայի փակում» ասելով, նկատի ունեն ոչ թե հենց այդ ֆունկցիան, այլ հենց դրա արտաքին փոփոխականները:

Ենթադրենք ունենք հետևյալ 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

Ստեղծեք ֆունկցիա, որն կտա պատահական ամբողջ թիվ միջակայքում, բայց այնպես, որ երկու անգամ անընդմեջ նույնը չլինի: