Understanding Map,Filter,Reduce

2014 views Oct 30, 2024

ကျွန်တော်တို့ဒီနေ့တော့ python programming ရဲ့ functional approach တွေကိုလေ့လာကြည့်ရအောင်။ဒီမှာသိစေချင်တာက ဒီ function တွေကိုသုံးရေးမယ်ဆို ပိုလွယ်သွားမယ်ဆိုတာပါပဲ။စလိုက်ကြရအောင်!

Map

map() functionသည် ရှေ့မှာ function တစ်ခုကိုလက်ခံပြီး နောက်မှာ iterate လုပ်လို့ရတယ့် sequence တစ်ခုကိုလက်ခံပါတယ်။ဥပမာmap(func,[1,2,3,4]) အဲ့လိုမျိုးဖြစ်ပါတယ်။

>>> def sqr(x):
...     return x * x
... 
>>> map_obj = map(sqr,[1,2,3,4])
>>> list(map_obj)
[1, 4, 9, 16]
>>> 

အပေါ်က code ကိုကြည့်မယ်ဆို ကျွန်တော်တို့ ပထမဦးဆုံး sqr() ဆိုတဲ့ function ကိုဆောက်လိုက်ပါတယ်။ပြီးတော့ ဝင်လာတဲ့ ကိန်းကို နှစ်ခုမြှောက်ပြီး ပြန်ပို့ပေးပါတယ်။ map(sqr,[1,2,3,4]) ဆိုပြီးခေါ်လိုကတဲ့အချိန်မှာ map() function ကနေပြီး [1,2,3,4] ထဲကနေ တစ်လုံးချင်းဆီ function ဆီပို့ပေးပါတယ်။အဲ့တာကြောင့် map object ကို list အနေနဲ့ပြန်ပြောင်းကြည့်လိုက်တဲ့အခါကျ square တွေထွက်လာတာဖြစ်ပါတယ်။ဒါကို အောက်ကတိုင်း list comprehension ပုံစံရေးတာတော့ပိုကောင်းပါတယ်။

>>> [x*x for x in [1,2,3,4]]
[1, 4, 9, 16]
>>> 

ဒီမှာသိထားရမှာက map သည် function ကိုလက်ခံပြီး တန်ဖိုးတွေကို iterate လုပ်ကာ functionဆီပို့ပေးပါတယ်။ဒါလေးပါပဲ။

Filter

Filter ကတော့ သူ့name အတိုင်းလျော့ပြီး ဟုတ်မဟုတ်စစ်ထုတ်ပေးမှာပါ။သူလဲ လက်ခံတာကတော့ filter(func,[1,2,3,4]) အဲ့လိုပုံစံပဲလက်ခံပါတယ်။အောက်က example လေးကိုကြည့်လိုက်ရအောင်

>>> def is_even(x):
...     return x % 2 == 0
... 
>>> numbers = list(range(10))
>>> numbers
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
>>> list(filter(is_even,numbers))
[0, 2, 4, 6, 8]
>>> 

ကျွန်တော်တို့ even ဟုတ်မဟုတ် စစ်ပေးမယ့် function လေးကို ရေးလိုက်တယ် number တစ်ခုက စုံကိန်းဖြစ်လားဆိုတာစစ်ဖို့  2 နဲ့စားလို့အကြွင်း သုံည ကျန်ရင် စုံကိန်းမို့ True ဖြစ်သွားပါလိမ့်မယ်။မဟုတ်ရင် False ဖြစ်သွားပြီး return ပြန်လာတာက true ဆိုအဲ့ကိန်းကို filter က ယူပါတယ်။False ဆိုရင်တော့ မယူတော့ပဲပယ်ထားတာမို့ ကျန်ခဲ့တာပါ။နားလည်မယ်လို့ယုံကြည်ပါတယ်။

Reduce

Reduce ကလဲ လျော့ချပေးတယ်။ပြန်ထုတ်ပေးတဲ့နေရာမှာသူကတော့ တစ်လုံးပဲထုတ်ပေးတယ်ရှေ့ကဟာတွေနဲ့မတူဘူး။exampleကြည့်လိုက်ရအောင်

>>> from functools import reduce
>>> def add(x,y):
...     return x + y
... 
>>> reduce(add,[1,2,3,4])
10

တစ်ခုနားလည်ထားရမှာက reduce သည် functools အောက်မှာရှိပါတယ်။ပြီးတော့ reduce သည် function တွေကို ပို့တဲ့အခါမှာ နှစ်ခုပေးပို့ပါတယ်။အကယ်လို့ add(x) လု့ိပဲရေးထားမယ်ဆို သေချာပေါက် error တက်ပါမယ်။ဘာလို့ဆိုတော့ သူပို့တာနှစ်ခုမို့လို့  လက်ခံလဲနှစ်ခုလက်ခံပါ။အလုပ်လုပ်ပုံကတော့ ရှင်းပါတယ်။ပထမဆုံး ၁ ၂ ကိုပေးလိုက်တယ် return x+y ဆိုတော့ ၃ ရလာတယ်။အဲ့ ၃ ကို x နေရာကိုပေးလိုက်ပြီး [1,2,3,4] ထဲက နောက်တစ်လုံးဖြစ်တဲ့ 3 ကို y နေရာကိုပေးလိုက်ပါတယ်။ပြီးတော့ ၃ + ၃ ဆိုတော့ ၆ရလာတော့ ၆ကို x နေရာထပ်ပေးပြီး list ထဲက 4 ကို yနေရာကိုပို့ပေးလို့ ၁၀ထွက်လာတာပါ။အားလုံးနားလည်မယ်ထင်ပါတယ်။