ქლოუჟერები Python-ში
ქლოუჟერით (closure) გულისხმობენ ფუნქციას ყველა იმ გარე ცვლადთან ერთად, რომელთაც იგი აქცევს ხელმისაწვდომს.
Python-ში, ყველაზე ხშირად, "ფუნქციის ქლოუჟერი" საუბრისას გულისხმობენ არა თავად ფუნქციას, არამედ მის გარე ცვლადებს.
დავუშვათ გვაქვს შემდეგი ფუნქცია outer,
რომელშიც გამოცხადებულია ცვლადი i და
შიდა ფუნქცია inner. მას i
ცვლადს დაემატება ერთეული. იმისათვის, რომ
ცვლადი i კორექტულად იმუშაოს,
ვამატებთ მას ინსტრუქციას nonlocal:
def outer():
i = 0
def inner():
nonlocal i
i += 1
print(i)
return inner
ახლა მოდით გარე ფუნქცია ჩავსვათ
ცვლადში res და გამოვიძახოთ იგი
მრგვალი ფრჩხილებით:
res = outer()
res() # გამოიტანს 1-ს
მოდით რამდენჯერმე გამოვიძახოთ res.
კოდის შესრულების შემდეგ ყოველ ჯერზე თვლილი
i გაიზრდება ერთეულით:
res() # გამოიტანს 2-ს
res() # გამოიტანს 3-ს
res() # გამოიტანს 4-ს
თუმცა აქ არის მნიშვნელოვანი ნიუანსი - ყოველი
ფუნქციის outer გამოძახება გაზრდის
საკუთარ თვლილს. მოდით პირველი გამოძახება outer
ჩავწეროთ ცვლადში res1, ხოლო მეორე
გამოძახება - ცვლადში res2. შემდეგ
თანმიმდევრობით გამოვიტანოთ ისინი კონსოლში:
res1 = outer()
res1() # გამოიტანს 1-ს
res1() # გამოიტანს 2-ს
res1() # გამოიტანს 3-ს
res2 = outer()
res2() # გამოიტანს 1-ს
res2() # გამოიტანს 2-ს
res2() # გამოიტანს 3-ს
მოცემულია შემდეგი კოდი:
def outer():
i = 10
def inner():
nonlocal i
i -= 2
print(i)
return inner
res1 = outer()
res1()
res1()
res2 = outer()
res2()
res2()
res2()
თქვით, რა გამოიყვანება კონსოლში.
შექმენით ფუნქცია, რომლის ყოველი გამოძახება გამოიძახებს ფიბონაჩის მიმდევრობის შემდეგ რიცხვს.
შექმენით ფუნქცია, რომელიც გამოიტანს შემთხვევით მთელ რიცხვს ინტერვალში, მაგრამ ისე, რომ ზედიზედ ორჯერ არ იყოს ერთი და იგივე.