Aizvērumi Python

Ar aizvērumu (closure) saprot funkciju kopā ar visām ārējām mainīgajām, kas tai ir pieejamas.

Python biežāk, runājot "funkcijas aizvērums", domā nevis pašu funkciju, bet tieši tās ārējos mainīgos.

Pieņemsim, ka mums ir šāda funkcija outer, kurā deklarēts mainīgais i un iekšējā funkcija inner. Tajā i tiks pieskaitīts viens. Lai mainīgais i darbotos korekti, pievienojam tam instrukciju nonlocal:

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

Tagad ieliksim ārējo funkciju mainīgajā res un izsauksim to ar apaļām iekavām:

pythonres = outer()
res() # izvadīs 1

Izsauksim res vairākas reizes. Pēc koda izpildes katru reizi skaitītājs i palielināsies par vienu:

pythonres() # izvadīs 2
res() # izvadīs 3
res() # izvadīs 4

Tomēr šeit ir svarīga nianse - katrs funkcijas outer izsaukums palielinās savu skaitītāju. Ieliksim pirmo outer izsaukumu mainīgajā res1, bet otro izsaukumu - mainīgajā res2. Tad secīgi izvadīsim tos konsolē:

pythonres1 = outer()
res1() # izvadīs 1
res1() # izvadīs 2
res1() # izvadīs 3

res2 = outer()
res2() # izvadīs 1
res2() # izvadīs 2
res2() # izvadīs 3
Задание 1

Dots šāds kods:

pythondef outer():
  i = 10

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

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

Sakiet, kas tiks izvadīts konsolē.

Задание 2

Izveidojiet funkciju, kuras katrs izsaukums izsauks nākamo Fibonači skaitli.

Задание 3

Izveidojiet funkciju, kas izvadīs nejaušu veselu skaitli intervālā, bet tā, lai divas reizes pēc kārtas nebūtu vienādi.