Pythonda Ýapyk Funksiýalar

Ýapyk funksiýa (closure) diýmek, oňa elýeterli bolan ähli daşky üýtgeýjiler bilen birleşdirilen funksiýa düşünilýär.

Python-da, köplenç "funksiýanyň ýapyklygy" diýilende, öz funksiýanyň özü däl-de, onuň daşky üýtgeýjileri göz öňünde tutulýar.

Bizde outer atly funksiýa bolup, onda i üýtgeýjisi we inner atly içki funksiýa bardyr diýeliň. Onda i bir birlik artdyrylar. i üýtgeýjisiniň dogry işlemegi üçin, biz oňa nonlocal buýrugyny goşarys:

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

Indi daşky funksiýamyzy res üýtgeýjisine goýup, ony ýönekeý jaýlar bilen çagyrýarys:

pythonres = outer()
res() # 1 çap eder

Geliň res-i birnäçe gezek çagirayň. Kod ýerine ýetirilenden soň, her gezek sanawçy i bir birlik artar:

pythonres() # 2 çap eder
res() # 3 çap eder
res() # 4 çap eder

Emma bu ýerde bir wajyp nuans bar - outer funksiýasynyň her çaýrylyşy öz sanawçysyny artyrar. Geliň outer funksiýasynyň birinji çaýrylyşyny res1 üýtgeýjisine, ikinji çaýrylyşyny bolsa res2 üýtgeýjisine ýazyň. Soňra olary yzly-ýyzdan konsola çap edeliň:

pythonres1 = outer()
res1() # 1 çap eder
res1() # 2 çap eder
res1() # 3 çap eder

res2 = outer()
res2() # 1 çap eder
res2() # 2 çap eder
res2() # 3 çap eder
Задание 1

Aşakdaky kod berlen:

pythondef outer():
  i = 10

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

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

Konsola näme çap ediler, aýdyň.

Задание 2

Her çaýrylyşy indiki Fibonacci sanyny çykarýan funksiýa ýasaň.

Задание 3

Mukdarda yzygiderlik iki gezek deň bolmazlyk üçin, aralykda tötänleýin bitin san çykarýan funksiýa ýasaň.