Python-da Qapanmalar

Qapanma (closure) anlayisi ile funksiya ve ona muraciet ede bilecek butun xarici deyiskenler nezerde tutulur.

Python-da, adeten "funksiya qapanmasi" deyilende, hemin funksiyanin ozu deyil, eksine onun xarici deyisenleri nezerde tutulur.

Tutaq ki, bizim outer adli bir funksiyamiz var, icinde i deyiseni elan edilib ve daxili inner funksiyasi var. Bu funksiyada i deyisenine bir vahid elave olunur. i deyiseninin duzgun işlemesi ucun, ona nonlocal instruksiyasini elave edirik:

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

Indi ise xarici funksiyani res deyisenine menimsedek ve onu moterize ile cagiraq:

pythonres = outer()
res() # 1 cap edecek

Gelin res-i bir nece defe cagirag. Kodu icra etdikden sonra her defe i sayaci bir vahid artacaq:

pythonres() # 2 cap edecek
res() # 3 cap edecek
res() # 4 cap edecek

Lakin burada muehim bir nüans var - outer funksiyasinin her cagrilisi oz sayacini artiracaq. Gelin birinci outer cagirisini res1 deyisenine, ikinci cagirisi ise res2 deyisenine menimsedek. Sonra ise onlari ardicilliqla konsola cap edek:

pythonres1 = outer()
res1() # 1 cap edecek
res1() # 2 cap edecek
res1() # 3 cap edecek

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

Asagidaki kod verilmisdir:

pythondef outer():
  i = 10

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

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

Konsola ne cap olunacaqini deyin.

Задание 2

Her cagrildiqda novbeti Fibonaççi ededini geri qaytaran bir funksiya yaradin.

Задание 3

Mueyyen bir araliqda tesadufi tam eded geri qaytaran, lakin ardicil iki defe eyni ededin olmamasini temin eden bir funksiya yaradin.