Python တွင် Closure များ

Closure (closure) ဆိုသည်မှာ လုပ်ဆောင်ချက်တစ်ခုနှင့် ၎င်းရရှိနိုင်သော ပြင်ပကိန်းရှင်များ အားလုံးပါဝင်သည်ကို ဆိုလိုသည်။

Python တွင် "လုပ်ဆောင်ချက်၏ closure" ဟု ပြောသောအခါ များသောအားဖြင့် ထိုလုပ်ဆောင်ချက်ကိုယ်တိုင်ကို မဟုတ်ဘဲ ၎င်း၏ ပြင်ပကိန်းရှင်များကိုသာ ရည်ညွှန်းလေ့ရှိသည်။

ကျွန်ုပ်တို့တွင် outer လုပ်ဆောင်ချက်တစ်ခုရှိပြီး ၎င်းထဲတွင် i ဟူသော ကိန်းရှင်ကို ကြေညာထားကာ အတွင်းပိုင်း inner လုပ်ဆောင်ချက်ရှိသည်ဆိုပါစို့။ ၎င်းထဲတွင် i ကို တစ်ထပ်တိုးပေါင်းမည်။ i ကိန်းရှင် မှန်ကန်စွာအလုပ်လုပ်စေရန် nonlocal ညွှန်ကြားချက်ကို ၎င်းထဲသို့ ထည့်ပေးပါမည်။

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

ယခု အပြင်ဘက်လုပ်ဆောင်ချက်ကို res ဟူသော ကိန်းရှင်ထဲသို့ ထည့်ပြီး ၎င်းကို ကွင်းစကွင်းပိတ်များဖြင့် ခေါ်ယူကြည့်ပါမည်။

pythonres = outer()
res() # ၁ ကို ပြသမည်

res ကို အကြိမ်အနည်းငယ် ခေါ်ယူကြည့်ပါစို့။ ကုဒ်အား လုပ်ဆောင်ပြီးနောက် တစ်ကြိမ်စီတိုင်းတွင် i ရေတွက်ကိန်းသည် တစ်ထပ်တိုးသွားမည်။

pythonres() # ၂ ကို ပြသမည်
res() # ၃ ကို ပြသမည်
res() # ၄ ကို ပြသမည်

သို့သော် ဤတွင် အရေးကြီးသော အချက်တစ်ခုရှိသည် - outer လုပ်ဆောင်ချက်ကို ခေါ်ယူတိုင်းသည် ၎င်း၏ ကိုယ်ပိုင်ရေတွက်ကိန်းကို တိုးမြှင့်ပေးမည်။ outer ကို ပထမအကြိမ်ခေါ်ယူခြင်းအား res1 ကိန်းရှင်ထဲသို့ သိမ်းဆည်းပြီး ဒုတိယအကြိမ်ခေါ်ယူခြင်းအား res2 ထဲသို့ သိမ်းဆည်းပါစို့။ ထို့နောက် ၎င်းတို့ကို အစဉ်လိုက် ကွန်ဆိုးထဲသို့ ပြသပါမည်။

pythonres1 = outer()
res1() # ၁ ကို ပြသမည်
res1() # ၂ ကို ပြသမည်
res1() # ၃ ကို ပြသမည်

res2 = outer()
res2() # ၁ ကို ပြသမည်
res2() # ၂ ကို ပြသမည်
res2() # ၃ ကို ပြသမည်
Задание 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

ခေါ်ယူတိုင်း နောက် Fibonacci ဂဏန်းကို ပြသမည့် လုပ်ဆောင်ချက်တစ်ခု ဖန်တီးပါ။

Задание 3

ပေးထားသော အတိုင်းအတာအတွင်း ကျပန်းကိန်းပြည့်တစ်ခုကို ထုတ်ပေးမည့် လုပ်ဆောင်ချက်တစ်ခု ဖန်တီးပါ၊ သို့သော် ထပ်တိုက်တူညီသောကိန်းများ မရှိစေရပါ။