Python Startup #2.5

by 08:21 0 comments
အပိုင္း ၂မွာေျပာခဲ့တဲ့ Lists ေတြအေၾကာင္းကိုပဲဆက္ေျပာပါမယ္ဗ်ာ။

2.6 List methods
Python မွာ Lists အတြက္အသံုးျပဳႏိုင္တဲ့ methods ေလးေတြရွိပါတယ္။ ပထမတစ္ခုကေတာ့ append() ပါ။
>>> a = [1, 2, 3]
>>> a.append(4)
>>> a
[1, 2, 3, 4]


ဒါဆို b ဆိုတဲ့ List ထပ္လုပ္ျပီး b ထဲက elements ေတြကို a ထဲထည့္မယ္ဗ်ာ။ append() ကိုပဲသံုးရမလားဆိုေတာ့မပာုတ္ပါဘူး။ သံုးရင္ Error ေတာ့မတက္ပါဘူး ဒါေပမယ့္ ကြ်န္ေတာ္တို ့ျဖစ္ေစခ်င္သလိုျဖစ္မွာမပာုတ္ပါဘူး။
>>> a
[1, 2, 3, 4]
>>> b = [5, 6]
>>> a.append(b)
[1, 2, 3, 4, [5 ,6]]


ျမင္တယ္မလားဗ်။ အခုလို append သံုးလိုက္ရင္ b ရဲ့ Elements ေတြကိုမထည့္လိုက္ပဲ b ဆုိတဲ့ List ၾကီးကို nested အေနနဲ ့ထည့္လိုက္ပါတယ္။ ဒီေတာ့ဘယ္လိုလုပ္ၾကမလဲ? 
extend() ဆိုတဲ့ေနာက္ထပ္ method ကိုသံုးပါမယ္။ သူကေတာ့ကြ်န္ေတာ္တို ့လိုခ်င္တဲ့ b ရဲ့ elements ေတြကိုပဲယူျပီး a ထဲထည့္ဖို ့အတြက္ကိုလုပ္ေဆာင္ေပးမွာပါ။
>>> a = [1, 2, 3]
>>> b = [4, 5]
>>> a.extend(b)
>>> a
[1, 2, 3, 4, 5]


ဒါဆိုေနာက္ method တစ္ခုကိုထပ္သြားရေအာင္ဗ်ာ။ sort() ဆိုတာကို alphabet အလိုက္ျပန္စီတာမ်ိဳးေတြေနာက္ order အလိုက္(Low to High) ျပန္စီခ်င္ရင္အသံုးျပဳပါတယ္။
>>> a = [‘e’, ‘b’, ‘d’, ‘f’, ‘a’, ‘c’]
>>> a.sort()
>>> a
[‘a’, ‘b’, ‘c’, ‘d’, ‘e’, ‘f’]


ဒါဆို ခုနကလို sort လုပ္တာကို variable တစ္ခုနဲ ့ေပးညီၾကည့္လိုက္ပါ။
>>> a = [‘e’, ‘b’, ‘d’, ‘f’, ‘a’, ‘c’]
>>> b = a.sort()
>>> print b
None


ဘာမွျပန္မျပဘူးေနာ္။ ဘာလို ့လဲဆိုေတာ့ List methods ေတြအကုန္လံုး List ကို modify လုပ္ျပီးရင္ return None ပဲျပန္ပါတယ္။ ေျပာရရင္ List methods ေတြအကုန္လံုးက void ေတြပါပဲ။ C သမားေတြဆိုသိျပီးသားျဖစ္မွာပါ။ void function ေတြဆို return 0 လို ့ေအာက္ဆံုးမွေရးစရာမလိုတာကို… အခုလဲဒီသေဘာပါပဲ။
2.7 Map, filter and reduce 
ကဲ a = [1, 2, 3] ဆိုတာထားပါေတာ့ ဒီထဲက elements ေတြကိုေပါင္းတဲ့ရလဒ္သိခ်င္ဘယ္လိုလုပ္မလဲ? အခုဥပမာကေတာ့ဘယ္ေျပာစရာလိုတံုး 6 ဆိုတာလူတိုင္းသိတယ္ ဒါေပသိ elements က အခု၃၀, ၄၀ ဆိုဘယ္လိုလုပ္မလဲ? sum() ဆိုတာေလးကိုသံုးပါမယ္။
>>> a = [1, 2, 3]
>>> sum(a)
6


အခုလိုမ်ိဳး sequence of elements ေတြကို single value ျဖစ္ေအာင္ေပါင္းတဲ့လုပ္ေဆာင္ခ်က္ကို reduce လို ့ေခၚပါတယ္။
ေနအံုးအခုလို sum() ဆုိတာကိုကုိယ့္ဘာသာေရးၾကည့္မယ္ဆို…
def add_up(a):
   total = 0
   for x in a:
       total += x # equal to total = total + x
   return total


initial အေနနဲ ့total ကို သုညေပးထားပါတယ္။ a = [1, 2, 3] နဲ ့ေျပာရမယ္ဆို အရင္ဆံုး a ကေန 1 ကိုယူပါတယ္ ျပီးရင္ 0 ဆိုတဲ့ total ကို x တန္ဖိုး 1 နဲ ့ေပါင္းျပီး total နဲ ့ေပးညီလိုက္ေတာ့ total က 1 ျဖစ္သြားတယ္။ ေနာက္ 2 ကိုယူျပီးေပါင္းတယ္ ျပန္ေပးညီေတာ့ 3 ျဖစ္သြားတယ္။ ေနာက္ 3 ကိုထပ္ယူျပီး total (လက္ရွိမွာ 1 နဲ ့2 ကိုေပါင္းထားလို ့ 3 ျဖစ္ေနပါတယ္) ေပါင္းလိုက္ေတာ့ 6 ျဖစ္သြားပါတယ္။ ျပီးရင္အဲ့တာကို return ျပန္လိုက္ပါတယ္။ ဒါပါပဲ။ total ကဲ့သို ့အသံုးျပဳသြားရတဲ့ Variable ကို accumulator လုိ ့ေခၚပါတယ္။

ဒါဆုိ Map အေၾကာင္းဆက္ေျပာဖို ့ေအာက္ကဥပမာကိုဆက္ေလ့လာၾကည့္ရေအာင္…
ကြ်န္ေတာ္တို ့ List ထဲမွာ small letter နဲ ့ေရးထားတဲ့ arguments ေတြရွိတယ္ဆိုပါစို ့ဗ်ာ… ဒါေတြကို Capital Letter ေလးေတြေျပာင္းရေအာင္…
def capitalizee(a):
   capi = []
   for x in a:
       capi.append(x.capitalize())
   return capi


ဒီ Example မွာဆို capi ဆိုတဲ့ empty list ေလးတစ္ခုလုပ္လိုက္ပါတယ္။ ျပီးရင္ Loop ပတ္ခိုင္းျပီးေတာ့ a ထဲက တစ္ခုခ်င္းစီကို capitalize() နဲ ့ေျပာင္းျပီး capi ဆိုတဲ့ empty list ထဲကိုထည့္သြားတာပါ။
အခုသံုးျပသြားတာကေတာ့ capitalize() ဆိုတဲ့ argument ရဲ့ေရွ  ့စာလံုးကုိ Capital Letter ေျပာင္းတာေပါ့ေလ။ ေနာက္ small letter ေတြပဲေျပာင္းတဲ့ lower() ဆိုတာရယ္, စာလံုးအကုန္လံုးကုိအၾကီးေျပာင္းေပးတဲ့ upper() ဆိုတာရွိပါေသးတယ္။ အခုေပၚက capitalizee() ကဲ့သို ့လုပ္ေဆာင္တဲ့ function ေတြကို map လို ့ေခၚပါတယ္။
ဒါဆိုဘယ္လိုမ်ိဳးလုပ္ေဆာင္ခ်က္ေတြလုပ္တဲ့ function ကို Filter လို ့ေခၚလဲေျပာျပပါမယ္။

namez = [‘I’, ‘love’, ‘MSF’]

def thelower(a):
   lowlist = []
   for x in a:
       if x.islower():
           lowlist.append(x)
   return lowlist

def theupper(a):
   uplist = []
   for x in a:
       if x.isupper():
           uplist.append(x)
   return uplist


ပထမတစ္ခုမွာဆို love ဆိုတာေလးပဲျပန္ေပးမွာပါ။ ဒုတိယတစ္ခုမွာေတာ့ I နဲ ့MSF ကိုေဖာ္ျပမွာပါ။ islower() ရယ္ isupper() ဆိုတာက True or False ျပန္ေပးပါတယ္။ ဒါကို if နဲ ့တြဲသံုးလိုက္ေတာ့အကယ္လို ့ True ျပန္ေပးရင္ if ေအာက္က function ျဖစ္တဲ့ append() ကိုဆက္လုပ္သြားတာပါ။ ဒီလို function မ်ိဳးေတြကို filter  လို ့ေခၚတာပါ။

2.8 Deleting the elements of a list
List အေၾကာင္းစေျပာကထဲက List ေတြက mutable ျဖစ္တယ္ဆိုတာကိုေျပာခဲ့ပါသလို အမ်ိဳးမ်ိဳးလဲသံုးျပခဲ့ပါတယ္။ List ေတြက mutable ျဖစ္တယ္ဆို elements ေတြထည့္လိုက္ sorting လုပ္တာေလာက္တင္ဘယ္ကမလဲ။ မလိုတဲ့ elements ေတြကိုလဲဖယ္ထုတ္ပစ္ႏိုင္ပါတယ္။

Delete an element using pop()
>>> a = [1, 2, 3, 4, 5, 6]
>>> b = a.pop(0) # Remember, elements counting start from 0
>>> a
[2, 3, 4, 5, 6]
>>> b
1
>>> a.pop() # If we do not provide an index, it will remove last element and return that value.
6


Delete the element using “del”
>>> a = [‘a’, ‘b’, ‘c’, ‘d’, ‘e’]
>>> del a[1]
>>> a
[‘a’, ‘c’, ‘d’, ‘e’]


Index အသံုးမျပဳခ်င္ပဲကိုယ္ delete လုပ္ခ်င္တဲ့ element ကိုသိတယ္ဆို remove() ကိုအသံုးျပဳလုိ ့ရပါတယ္။
>>> a = [‘I’, ‘Love’, ‘MSF’]
>>> a.remove(‘Love’)


ဒီမွာက remove() ထဲမွာကြ်န္ေတာ္ဖ်က္ခ်င္တဲ့ေကာင္ကိုထည့္လိုက္တာပါ။ string ဆိုလဲ string ေပါ့။ integer ဆိုလဲ integer ေပ့ါ။ တစ္ခုမွတ္ထားရမွာက remove() က None ပဲ return ျပန္ပါတယ္။

ဒါဆို List ထဲမွာ Elements 10 ခုရွိတယ္ဗ်ာ။ 4 ခုေျမာက္ကေန 6 ခုေျမာက္ထိဖ်က္တယ္ဒါမ်ိဳးဆိုဘယ္လိုလုပ္မလဲ? ေျပာရရင္ Element တစ္ခုထဲမပာုတ္ပဲ အမ်ားၾကီးကိုတခါထဲနဲ ့ဖ်က္ခ်င္ရင္ေပါ့။ ကြ်န္ေတာ္ဥပမာေလးျပပါမယ္။
>>> a = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
>>> del a[3:6]
>>> a
[1, 2, 3, 7, 8, 9, 10]


ကြ်န္ေတာ္အေပၚမွာေရးျပခဲ့သလို index slicing ကို del နဲ ့တြဲသံုးလို ့ရပါတယ္။

2.9 Lists and strings
Characters ေတြကိုအစဥ္လိုက္စုလိုက္ရင္ String ပါ။ Values ေတြကိုအစဥ္လုိက္စုလိုက္ရင္ List ေပါ့ ဒါေပသိ List of Character ေတြသည္ String တစ္ခုမပာုတ္ပါ။ String တစ္ခုကို List ေျပာင္းခ်င္ရင္ list() ဆိုတာကိုအသံုးျပဳႏုိင္ပါတယ္။ ေအာက္မွာ abc ဆိုတဲ့ beer အဲေလ string ေလးကို List ေျပာင္းျပပါမယ္။
>>> a = ‘abc’
>>> thelist = list(a)
>>> thelist
[‘a’, ‘b’, ‘c’]


list() ဆိုတဲ့ function က string ထဲက character ကို letter တစ္ခုခ်င္းစီေျပာင္းလိုက္ပါတယ္။ ေနာက္ string တစ္ခုကုိခြဲထုတ္ခ်င္ရင္ split() ဆိုတဲ့ function ကိုအသံုးျပဳႏိုင္ပါတယ္။
>>> a = ‘I Love MSF’
>>> b = a.split()
>>> b
[‘I’, ‘Love’, ‘MSF’]


ေနအံုးဗ် အဲ့ဒီ split() ဆိုတဲ့ function မွာ option character ရွိပါတယ္။ ဘယ္လိုသံုးတယ္ဆိုတာဥပမာေလးနဲ ့ျပပါတယ္။
>>> a = ‘Hello-World-MSF’
>>> b = a.split(‘-‘)
>>> b
[‘Hello’, ‘World’, ‘MSF’]


Option character ရဲ့သေဘာတရားကဆိုရင္ကိုယ္ထည့္လိုက္တဲ့ argument ကိုဖယ္ျပီးအဲ့ေကာင္ကေနပဲခြဲခြဲသြားမွာျဖစ္ပါတယ္။ ရွင္းသြားေအာင္ေနာက္ဥပမာေလးလုပ္ရေအာင္။
>>> a = ‘Hello World! MSF’
>>> b = a.split(‘!’)
>>> b
[‘Hello World’, ‘MSF’]


သေဘာေပါက္မယ္ထင္ပါတယ္။
split() နဲ ့ခြဲလိုက္တာေတာ့ပာုတ္ျပီဗ်ာ…. ပာာေပာ့လူ..မေက်နပ္ဘူးျပန္ေပါင္းခ်င္တယ္ဗ်ာ။ ဘယ္လိုလုပ္ရမလဲဆိုေတာ့သူရဲ့ေျပာင္းျပန္ join() ဆုိတာရွိပါတယ္။ ေအာက္ကဥပမာေလးၾကည့္လိုက္ရေအာင္…

>>> a = [‘Hello’, ‘World’, ‘MSF’]
>>> b = ‘ ‘ #There is a space between two single quotes
>>> b.join(a)
‘Hello World MSF’

ျမင္တယ္မလားမသိ space ေနရာမွာကိုယ္ဆက္ခ်င္တာကိုထည့္ႏိုင္ပါတယ္။

2.10 Objects and Values
Interpreter မွာဒီိလိုေလးေရးလိုက္ပါ။
>>> a = ‘MSF’
>>> b = ‘MSF’
>>> c = [1, 2, 3]
>>> d = [1, 2, 3]


Variable ေတြျဖစ္တဲ့ a ေကာ b ေကာက MSF ဆိုတာေတာ့လူတိုင္းၾကည့္တာနဲ ့သိပါတယ္ ဒါေပသိ string တစ္ခုထဲကိုပဲရည္ညႊန္းထားတာလားဆိုတာကိုေတာ့မသိဘူးဗ်ာ။ မသိေတာ့ဘာလုပ္မလဲ? အေျဖရွာမွာေပါ့ဗ်ာ…. ဒီလိုအေျဖရွာဖို ့အတြက္ Object တူမတူရွာမယ္ ဒီလို Object တူမတူကိုသိဖို ့အတြက္ is ဆိုတာေလးကိုအသံုးျပဳၾကပါမယ္။
a နဲ ့ b ကိုအရင္ရွင္းမယ္ဗ်ာ။
>>> a is b
True


a နဲ ့ b ကို is နဲ ့အေျဖထုတ္တာ True ဆိုေတာ့ Object တူပါတယ္။ ေအာက္ကပံုေလးနဲ ့ျမင္ေအာင္ဆြဲျပေပးထားပါတယ္။


ဒါဆုိေနာက္တစ္ခုထပ္ေျပာရေအာင္…
>>> c is d
False



သေဘာေပါက္မယ္ထင္ပါတယ္။ c နဲ ့ d က value တူေပမယ့္ မတူညီတဲ့ objects ေတြကိုရည္ညႊန္းထားတာပါ။

2.11 Aliasing
a = b ဆိုရင္ same object ကုိပဲ refer လုပ္တယ္ဆိုတာကိုေတာ့သိျပီးသားျဖစ္မွာပါ။
Object တစ္ခုမွာ refer လုပ္တာ၁ခုထက္ပုိရင္ name ကလဲတစ္ခုထက္ပိုပါပဲ။ ဒီလို object ကို alias လို ့ေခၚပါတယ္။ အကယ္လို object ကသာ List ေတြလို mutable ျဖစ္ခဲ့ရင္ a ကိုခ်ိန္းရင္ b မွာလဲသက္ေရာက္မွဳရွိတယ္ဆိုတာကိုအရင္သင္ခန္းစာမွာထဲကသိျပီးေလာက္ျပီျဖစ္ပါတယ္။ Recall ျပန္ေခၚရမယ္ဆို
>>> a = [1, 2, 3]
>>> b = a
>>> b[0] = 11
>>> a
[11, 2, 3]


Alias က strings ေတြလို immutable ေတြဆိုဘာမွမျဖစ္ေပမယ့္ List တို ့လို mutable ေတြက်သတိထားရပါတယ္။ ဒီလို List ေတြကို changes လုပ္ရင္ တစ္ခုခ်ိန္းရင္ေနာက္တစ္ခုမွ changes မျဖစ္ေစခ်င္ရင္အသံုးျပဳလို ့ရတဲ့နည္းကိုအရင္အပုိင္း ၂ မွာေျပာျပျပီးသားပါ။ သိအံုးမယ္ထင္ပါတယ္။ (ေမ့သြားရင္ေတာ့ျပန္ဖတ္ေပါ့ေလ)

Let’s Write Python [2.5] ကေတာ့ဒီေလာက္ပါပဲ။ ေနာက္အပိုင္း ၃က်ရင္ Tuple ေတြအေၾကာင္းကိုေလ့လာၾကပါမယ္။ ကြ်န္ေတာ္ဘာလို ့ [3] လို ့မစပဲ [2.5] လို ့ေရးလဲဆို ဒီအခန္းကေရွ ့ကအခန္းရဲ့အဆက္ျဖစ္ေနလို ့ပါ။

(c) PyLab 2016

Pylab

Developer

Keep calm and love Python

0 comments:

Post a Comment