ქლოუჟერები 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

შექმენით ფუნქცია, რომელიც გამოიტანს შემთხვევით მთელ რიცხვს ინტერვალში, მაგრამ ისე, რომ ზედიზედ ორჯერ არ იყოს ერთი და იგივე.