Python တွင် Closure များ
Closure (closure) ဆိုသည်မှာ လုပ်ဆောင်ချက်တစ်ခုနှင့် ၎င်းရရှိနိုင်သော ပြင်ပကိန်းရှင်များ အားလုံးပါဝင်သည်ကို ဆိုလိုသည်။
Python တွင် "လုပ်ဆောင်ချက်၏ closure" ဟု ပြောသောအခါ များသောအားဖြင့် ထိုလုပ်ဆောင်ချက်ကိုယ်တိုင်ကို မဟုတ်ဘဲ ၎င်း၏ ပြင်ပကိန်းရှင်များကိုသာ ရည်ညွှန်းလေ့ရှိသည်။
ကျွန်ုပ်တို့တွင် outer လုပ်ဆောင်ချက်တစ်ခုရှိပြီး
၎င်းထဲတွင် i ဟူသော ကိန်းရှင်ကို ကြေညာထားကာ
အတွင်းပိုင်း inner လုပ်ဆောင်ချက်ရှိသည်ဆိုပါစို့။ ၎င်းထဲတွင်
i ကို တစ်ထပ်တိုးပေါင်းမည်။
i ကိန်းရှင် မှန်ကန်စွာအလုပ်လုပ်စေရန်
nonlocal ညွှန်ကြားချက်ကို ၎င်းထဲသို့ ထည့်ပေးပါမည်။
def outer():
i = 0
def inner():
nonlocal i
i += 1
print(i)
return inner
ယခု အပြင်ဘက်လုပ်ဆောင်ချက်ကို
res ဟူသော ကိန်းရှင်ထဲသို့ ထည့်ပြီး
၎င်းကို ကွင်းစကွင်းပိတ်များဖြင့် ခေါ်ယူကြည့်ပါမည်။
res = outer()
res() # ၁ ကို ပြသမည်
res ကို အကြိမ်အနည်းငယ် ခေါ်ယူကြည့်ပါစို့။
ကုဒ်အား လုပ်ဆောင်ပြီးနောက် တစ်ကြိမ်စီတိုင်းတွင်
i ရေတွက်ကိန်းသည် တစ်ထပ်တိုးသွားမည်။
res() # ၂ ကို ပြသမည်
res() # ၃ ကို ပြသမည်
res() # ၄ ကို ပြသမည်
သို့သော် ဤတွင် အရေးကြီးသော အချက်တစ်ခုရှိသည် -
outer လုပ်ဆောင်ချက်ကို ခေါ်ယူတိုင်းသည်
၎င်း၏ ကိုယ်ပိုင်ရေတွက်ကိန်းကို တိုးမြှင့်ပေးမည်။
outer ကို ပထမအကြိမ်ခေါ်ယူခြင်းအား
res1 ကိန်းရှင်ထဲသို့ သိမ်းဆည်းပြီး
ဒုတိယအကြိမ်ခေါ်ယူခြင်းအား res2 ထဲသို့ သိမ်းဆည်းပါစို့။
ထို့နောက် ၎င်းတို့ကို အစဉ်လိုက် ကွန်ဆိုးထဲသို့ ပြသပါမည်။
res1 = outer()
res1() # ၁ ကို ပြသမည်
res1() # ၂ ကို ပြသမည်
res1() # ၃ ကို ပြသမည်
res2 = outer()
res2() # ၁ ကို ပြသမည်
res2() # ၂ ကို ပြသမည်
res2() # ၃ ကို ပြသမည်
အောက်ပါကုဒ်ကို ပေးထားသည်။
def outer():
i = 10
def inner():
nonlocal i
i -= 2
print(i)
return inner
res1 = outer()
res1()
res1()
res2 = outer()
res2()
res2()
res2()
ကွန်ဆိုးထဲတွင် ဘာပြသမည်နည်း ပြောပြပါ။
ခေါ်ယူတိုင်း နောက် Fibonacci ဂဏန်းကို ပြသမည့် လုပ်ဆောင်ချက်တစ်ခု ဖန်တီးပါ။
ပေးထားသော အတိုင်းအတာအတွင်း ကျပန်းကိန်းပြည့်တစ်ခုကို ထုတ်ပေးမည့် လုပ်ဆောင်ချက်တစ်ခု ဖန်တီးပါ၊ သို့သော် ထပ်တိုက်တူညီသောကိန်းများ မရှိစေရပါ။