22/04/2020
Partial Function in Python
===================
Author :: Win Htut ( https://web.facebook.com/WinHtutEquation )
Partial function ကို အသုံးပြုခြင်း အားဖြင့် function တစ်ခုရဲ့ arguments တွေကို လျော့ချ နိုင်ပါတယ်။ Partial function ကို ခေါ်သုံးနိုင်ရန် functools ဆိုသည့် module ကို import လုပ်ပေးရန် လိုအပ်ပါသည်။ partial function ကို ခေါ်မသုံးခင် မိမိတို့ ကိုယ်တိုင် အောက်ပါ အတိုင်း ရေးကြည့်ပါမည်။
def myFun(x,y,z):
print(x,y,z)
def fn(yy,zz): # line 3
return myFun(10,yy,zz) 4
print(fn(100,200)) 5
အထက်ပါ program အား run ကြည့်ပါက output အနေဖြင့် 10 ,100 ,200 တို့ကို ရှိပါမည်။ program အလုပ်လုပ်ပုံမှာ -
ပထမဆုံး အနေဖြင့် myFun ဆိုသည့် function ကို x,y,z ဆိုသည့် arguments 3 ခုဖြင့် ရေးထားပါသည်။
ဒုတိယ အနေဖြင့် fn ဆိုသည့် function အား yy ,zz ဆိုသည့် arguments 2 ခုဖြင့် တည်ဆောက်ထားပါသည်။ fn ဆိုသည့် function အား ခေါ်သော အခါတွင် return အနေဖြင့် myFun ဆိုသည့် function ကို ပြန်ပေးပါမည်။ ထိုသို့ return ပြန်ရာတွင် 10 ဆိုသည့် value ကို တစ်ခါတည်း ထည့်ပေးလိုက်ပါသည်။ ထိုသို့ထည့်ပေးမှသာ အလုပ်လုပ် မည်ဖြစ်ပြီး မထည့်ပေးပါက error တက်မည် ဖြစ်သည်။
နောက်ဆုံ အနေဖြင့် fn ဆိုသည့် function အား 100 ,200 ဆိုသည့် value များထည့်ပြီး ခေါ်လိုက်ပါသည်။ ထို့ကြောင့် line 3 မှ yy and zz နေရာတွင် 100 နှင့် 200 တို့ ဝင်ရောက်လာပါမည်။
ထို့နောက် fn function သည် myFun အား return ပြန်ပေးသည့် အတွက် myFun ဆိုသည့် function အား 10 ,100 ,200 တို့ဖြင့် လှမ်းခေါ်ပါတော့သည် ။ ထို့ကြောင့် myFun ထဲသို့ 10 ,100 ,200 တို့ arguments value အနေဖြင့် ဝင်သွားပြီး ထို data များအား output အနေဖြင့် ပြန်ပေးခြင်း ဖြစ်ပါသည်။
Partial function သည် higher order function လည်း ဖြစ်သကဲ့သို့ ပုံမှန်အားဖြင့် argument နှစ်ခု ယူပါသည်။ ပထမ တစ်ခုသည် function ဖြစ်ပြီး ဒုတိယ တစ်ခုသည် preset လုပ်ရန် value ဖြစ်သည်။ preset လုပ်ရန် ဆိုသည်မှာ value တစ်ခုအား သတ်မှတ် ပေးထားခြင်း ဖြစ်သည် အထက် Program တွင် 10 ကို preset value အဖြစ် သုံးထားပါသည်။ အောက်တွင် partial function ကို သုံးပြီး program ရေးပြထားပါသည်။
Sample Program :: partial function
from functools import partial
def myFun(x,y,z):
print(x,y,z)
pFn = partial(myFun , 10) 4
print(pFn(100,200))
Partial function သည် return value အနေဖြင့် new function တစ်ခုအား return ပြန်ပေးပါသည်။ ထို့သို့ ပြန်ပေးသည့် function တွင် မိမိတို့ partial function ကို ခေါ်တုန်းက ထည့်ပေးလိုက်သော keyword and arguments တွေကို default အနေဖြင့် function အသစ် မှာ ထည့်ပေးလိုက်ပါသည်။ အထက်ပါ program တွင် line number 4 ၌ ထည့်ပေးလိုက်သော 10 သည် preset value or default အနေဖြင့် pFun ဆိုသည့် function အသစ် မှာ ပါဝင်နေမှာ ဖြစ်ပါတယ်။ ထို့ကြောင့် line number 5 တွင် pFn ဆိုသည့် function ကို ခေါ်ရာ၌ 100 , 200 ဆိုသည့် argument နှစ်ခုသာ ထည့်ပေးလိုက်သော်လည်း output တွင် 10 ,100 , 200 တို့ကို ရနေခြင်း ဖြစ်သည် အဘယ်ကြောင့်ဆိုသော် 10 သည် preset value အဖြစ် partial function မှ ပြုလုပ်ပေးလိုက်သော ကြောင့် ဖြစ်သည်။
နောက်ထပ် program တစ်ပုဒ် အနေဖြင့် ရှုပ်ထွေးသည့် arguments များပါဝင်သည့် function တစ်ခု ကို partial function သုံးပြီး arguments များ လျော့ချ ကြည့်ပါမည်။
from functools import partial
def myFun( x , y , *args , x1 ,y1 ,**kwargs):
print( x , y , args , x1 ,y1 , kwargs) 3
pFn = partial(myFun , 10 ,x1='test') 4
pFn(20 ,30 ,40 ,y1='hello', aa=100 ,bb=200 , cc=300) 5
Output::
10 20 (30, 40) test hello {'aa': 100, 'bb': 200, 'cc': 300}
10 သည် preset value အနေဖြင့် ထည့်ထားသော value ဖြစ်သည်။ 20 သည် y အတွက် ထည့်ပေးလိုက်သော value ဖြစ်သည်။ 30 and 40 တို့မှာ arbitrary argument အတွက် ထည့်ပေးလိုက်သော value များ ဖြစ်သည်။ test သည် လည်း preset အနေဖြင့် partial function ၌ ထား ထားပြီးသော value ဖြစ်ပြီး hello သည် y1 အတွက် ထည့်ပေးလိုက်သော value ဖြစ်သည်။ နောက်ဆုံးတွင် ကျန်ခဲ့သော aa , bb, cc တို့သည့် **kwargs argument အတွက် ဖြစ်ပါသည်။ အထက်ပါ program တွင် partial function ကိုသုံးပြီး arguments နှစ်ခုကို preset လုပ်ကာ လျော့ချ လိုက်ပါသည်။
Partial function က လုပ်ပေးလိုက်သော preset value ကိုလည်း ပြန်လည်ချိန်းနိုင်ပါသေးတယ်။ အောက်တွင် sample program ရေးပြထားပါသည်။
from functools import partial 1
def pow(base , exponent): 2
return base ** exponent 3
sq = partial(pow , exponent =3) 4
print(sq(4)) 5
cu = partial(pow , exponent =2) 6
print(cu(2)) 7
print("test with base 5 expo 2 = ",cu(base=5)) 8
Output::
64
4
test with base 5 expo 2 = 25
Line number 2 တွင် power ကိုရှာသည့် fun တစ်ခုရေးထားပါသည်။ line number 4 တွင် partial function ဖြင့် exponent အား 3 အဖြစ် preset လုပ်ပါသည်။ ထို့နောက် sq(4) ဟု လှမ်းခေါ်ရာတွင် output အနေဖြင့် 64 ကို ရ ရှိပါသည်။ အဘယ်ကြောင့်ဆိုသော် 4 သည် base ဆိုသည့် နေရာသို့ရောက်သွားမည် ဖြစ်ပြီး မူရင်း preset value အဖြစ်ရှိနေသော 3 ဖြင့် 4 to the power 3 ဖြစ်သောကြောင့် ဖြစ်သည်။ line number 6 တွင် exponent = 2 ဟုရေးပြီးမူရင်း preset value အား လှမ်းပြင်ပါသည်။ ထို့ကြောင့် cu(2) ဟုလှမ်းခေါ်လိုက်သော အချိန်တွင် 2 to the power 2 ဖြစ်သွားသောကြောင့် output အနေဖြင့် 4 ကို ရရှိခြင်း ဖြစ်ပါသည်။ line number 8 တွင်မူ base အား 5 ဟု လှမ်းပြင်ပါသည် line number 6 တွင် exponent အား 2 ဟု ပြင်ခဲ့သည့်အတွက် 5 to the power 2 ဖြစ်သွားသောကြောင့် output ကို 25 ဟု ရရှိခြင်း ဖြစ်ပါသည်။