အပိုင္း၃ကိုမွာေတာ့ ကြ်န္ေတာ္တို ့ Tuple အေၾကာင္းကိုေလ့လာၾကပါမယ္။
Tuples
3.1 Tuples are immutable
အရင္ကလဲကြ်န္ေတာ္ေျပာခဲ့ပါတယ္။ Tuples ေတြကို constant ျဖစ္ေစခ်င္တဲ့ Sequence ေတြမွာသံုးၾကပါတယ္။ Tuple ဆိုတာပာာလဲ Values ေတြကုိ Sequence လိုက္သတ္မွတ္ထားတာပါပဲ။ Values ေတြကၾကိဳက္တဲ့ Type ျဖစ္ႏိုင္ပါတယ္ ေနာက္ Lists တံုးကလိုပါပဲ integers နဲ ့ပဲ indexed ထားတာပါ။ Lists နဲ ့တူတဲ့အခ်က္ေတြေပါ့ေလ မတူတာဆိုလို ့ Mutable မျဖစ္တာပါ။
Tuples ေတြကိုေရးရင္ parentheses မပါပဲ comma (,) ကုဒ္ျပီးေရးလိုက္တာနဲ ့တင္ tuple ျဖစ္ပါတယ္။
>>> a = 'Hello',ဒါေပသိအက်င့္ျဖစ္ျပီး ၾကည့္ရတာရွင္းရွင္းလင္းလင္းျဖစ္ေအာင္ေတာ့ထည့္ေရးေပးပါ။
>>> a = ('Hello', 'World', 1)
>>> type(a)
<type 'tuple'>
>>> type(a[0])
<type 'string'>
>>> type(a[2])
<type 'int'>
>>> b = tuple('MSF')
>>> b
('M', 'S', 'F')Lists မွာတံုးကေျပာခဲ့တဲ့ indexing နဲ ့ slicing က tuple မွာလဲအလုပ္လုပ္ပါတယ္။
>>> a
('Hello', 'World', 1)
>>> a[2]
1
>>> a[:2]
('Hello', 'World')Tuple ေတြသည္ immutable ျဖစ္တဲ့အတြက္ modify လုပ္လို ့မရပါ ဒါေပသိ replace လုပ္လို ့ေတာ့ရပါတယ္။
>>> a[2] = 2
TypeError: 'tuple' object doesn't support item assignment
>>> a = tuple('MSF')
>>> a
('M', 'S', 'F')3.2 Tuple Assignment
Variable ၁ခုထက္ပုိတာကို တျပိဳင္ထဲ assign လုပ္ခ်င္ comma ကုဒ္ျပီးတြဲေပးသြားလို ့ရပါတယ္။ ဒါေပသိ left hand side နဲ ့ right hand side က အေရအတြက္တူညီရမွာပါ။
>>> a, b = 1, 2
>>> c, d = 1, 2, 3
ValueError: too many values to unpack
>>> addres = 'helloworld@python.org'
>>> usrname, domain = addres.split('@')အရင္က split() ဆိုတာကိုသံုးေပးခဲ့ဖူးပါတယ္။ သေဘာေပါက္မယ္ထင္ပါတယ္။
3.3 Tuples as return values
Function တစ္ခုပာာ Value တစ္ခုထဲကိုပဲ Return ျပန္ႏိုင္ပါတယ္။ ဒါေပမဲ့ Value က tuple ျဖစ္ေနရင္ ဒါပာာ multiple values ကို return ျပန္ေပးသလိုပါပဲ။ သခ်ာၤမွာ Quotient (စားလဒ္) နဲ ့Remainder (အၾကြင္း) ဆိုတာၾကားဖူးမယ္ထင္ပါတယ္။ ဒီအတြက္ Python မွာ divmod() ဆိုတဲ့ built-in function တစ္ခုရွိပါတယ္။ သူက argument ၂ခုကိုယူမယ္ေနာက္ျပီးရင္ quotient နဲ ့ remainder ကို tuple အျဖစ္နဲ ့့ျပန္ေပးပါတယ္။
ကြ်န္ေတာ္ေျပာတာထက္ပိုရွင္းခ်င္ Python interpreter မွာ help('divmod') လို ့ရိုက္ၾကည့္လိုက္ပါ။ သူတြက္ခ်က္တဲ့ formula ေလးကို x နဲ ့ y အေနနဲ ့ေဖာ္ျပေပးထားမွာပါ။
>>> a = divmod(9, 3)
>>> a
(3, 0) #first argument is quotient and second argument is remainder3.4 Lists and tuples
Python မွာ zip() ဆိုတဲ့ built-in function ေလးတစ္ခုရွိတယ္ဗ်။ သူက ၂ခုဒါမွမပာုတ္ ၂ခုထက္ပုိတဲ့ sequence ေတြကို tuple တစ္ခုခ်င္းစီနဲ ့ List ျပဳလုပ္ေပးပါတယ္။ လည္သြားျပီလားမသိ... ဥပမာေလးၾကည့္လိုက္ရေအာင္...
>>> a = 'abc'
>>> b = [1, 2, 3]
>>> zip(a, b)
[('a', 1), ('b', 2), ('c', 3)]ရွင္းတယ္မလား ဒါဆိုဆက္မယ္ အကယ္လို ့ zip ထဲထည့္မယ့္ argument ၂ခုက length မတူရင္ေကာ
>>> c = 'Hello'
>>> d = 'MSF'
>>> e = zip(c, d)
>>> e
[('H', 'M'), ('E', 'S'), ('L', 'F')]ျမင္တယ္မလားဗ်။ Error မတက္ပါဘူး။ သူမွာရွိသေလာက္နဲ ့ပဲတြဲေပးသြားမွာပါ။ ဒါဆိုအဲ့ဒီ e ဆိုတာကို for loop ပတ္ျပီးေတာ့ တြဲရက္ argument ေတြကိုတစ္ေၾကာင္းခ်င္းေဖာ္ျပမယ့္ function ေရးမယ္ဗ်ာ။
>>> for x, y in e:
… print x, y
...
H M
e S
l F3. 5 Comparing Tuples
Tuple ေတြကို compare လုပ္မယ္ဆိုရင္ left hand side နဲ ့ right hand side ရွိတယ္ဆိုပါစို ့။ LHS ဘက္က first element ကို RHS ဘက္က first element နဲ ့ကိုစျပီး compare လုပ္ပါတယ္။ equal ျဖစ္တယ္ဆုိမွေနာက္ element ကိုသြားျပီး differ ျဖစ္တဲ့အထိဒီအတိုင္းလုပ္ေဆာင္သြားပါတယ္။ Subsequence ေတြကိုေတာ့ထည့္မတြက္ပါဘူး။
>>> (0, 1, 2) < (0, 3, 4)
True
>>> (0, 1, 10) < (0, 3, 4)
True
>>> (0, 10, 2) < (0, 3, 4)
False
>>> (10, 1, 2) < (0, 3, 4)
Falsesort function ကလဲအဲ့သလိုပဲပါ first element ကိုစလုပ္ပါတယ္။ အကယ္လို ့တူေနခဲ့ရင္ second element နဲ ့sort သြားပါတယ္....
ေနာက္ေျပာစရာရွိတာေလးကေတာ့ DSU patten ေပါ့။ အရွည္ေခါက္ကေတာ့ Decorate, Sort and Undecorate
Decorate = အရင္ဆံုး sequence ကို tuples ေျပာင္းေနာက္သက္ဆိုင္ရာ sequence ထဲက element ရဲ့သက္ဆိုင္ရာ key နဲ ့အတူ List ထဲထည့္လိုက္ပါတယ္။ ေျပာရရင္ List of tuples ေပါ့။
Sort = အဲ့ List ထဲက tuple ေတြကို sorting လုပ္ပါတယ္။
Undecorate = ေနာက္ sorted လုပ္ထားတဲ့ sequence ကို extract ျပန္လုပ္ပါတယ္။
ေအာက္ကဥပမာေလးၾကည့္လိုက္ရေအာင္ပိုရွင္းေအာင္ေပါ့ သူက ထည့္လိုက္တဲ့ string ကို List အေနနဲ ့ေျပာင္းျပန္ျပေပးမွာပါ။
def sortby_length(x):
a = []
for word in x:
a.append((len(word), word)) # Decorate
a.sort(reverse=True) # Sort
res = []
for length, word in a:
res.append(word)
return res # Undecorate3.6 Sequence of sequences
Strings, lists နဲ ့ tuples ေတြကိုလိုအပ္တဲ့ေနရာမွာသင့္ေတာ္သလိုအသံုးျပဳၾကပါတယ္။ String ကေနစေျပာရမယ္ဆို strings ေတြပာာ immutable ျဖစ္ပါတယ္ေနာက္ elements ေတြပာာလဲ character ေတြျဖစ္ကိုျဖစ္ရပါမယ္။ အကယ္လို့ new strings လဲမလုပ္ခ်င္ပဲ characters ေတြကို changes ျပဳလုပ္မယ္ဆို List ကိုအသံုးျပဳရပါမယ္။
Lists ေတြက tuples ေတြထက္ပိုေတြ ့ရတတ္ပါတယ္။ mutable ျဖစ္တာကလဲတစ္ပိုင္းေပါ့ ဒါေပသိ တခ်ိဳ ့အေျခအေနမ်ိဳးေတြမွာ Tuples ေတြကိုအသံုးျပဳရမယ့္အခါမ်ိဳးေတြရွိတတ္ပါတယ္။ ဘယ္လိုအခ်ိန္အခါမ်ိဳးလဲဆိုေတာ့.....
- Return statement လိုေနရာမ်ိဳးမွာဆို List တစ္ခုလုပ္ရတာထက္ Tuple ပဲအသံုးျပဳရတာကပိုအဆင္ေျပပါတယ္ သို ့ေသာ္ exception ေလးေတြေတာ့ရွိတာေပါ့..
- Dictionary အေၾကာင္းေတာ့မေျပာရေသးဘူးေပါ့... (အၾကမ္းဖ်င္းေျပာရမယ္ဆို Dictionary မွာ keys and values ဆိုျပီးရွိပါတယ္) အဲ့ဒီ Keys ေတြကိုက် constant ျဖစ္ဖို ့အတြက္ immutable types ေတြျဖစ္တဲ့ strings ဒါမွမပာုတ္ tuples ကိုပဲအသံုးျပဳရပါတယ္။
- Function ထဲကို sequence တစ္ခုအား argument အေနနဲ ့ထည့္တဲ့အခ်ိန္မွာ tuples ကိုအသံုးျပဳတာက aliasing မွာ error ျဖစ္ႏိုင္ေျခနည္းသြားေစပါတယ္။
ဒါေပသိ Tuples ေတြက immutable ျဖစ္တဲ့အတြက္ Lists ေတြလို sort တို ့လို modify လုပ္တဲ့ေကာင္ေတြေတာ့မရဘူးေပါ့။ၾကံဳတံုးေျပာသြားအံုးမယ္ sort() က ငယ္စဥ္ၾကီးလိုက္စီသလို ၾကီးစဥ္ငယ္လိုက္ဆို reverse() ကိုသံုးႏိုင္ပါတယ္။ ဒါေပသိ Python မွာ Tuple ကို List လို sort တို ့reverse တို ့လုပ္ႏိုင္ေအာင္ built-in function ေလး ၂ခုရွိပါေသးတယ္။ အဲ့တာကေတာ့ sorted() နဲ ့ reversed() ပါ။
မတူဘူးေနာ္... အခုပာာက ed နဲ ့ဆံုးတာေနာ္။ ေနာက္အဲ့ေကာင္ေတြက list အေနနဲ ့ျပန္တာပါ ဒီေတာ့ tuple ျပန္ျဖစ္ေစခ်င္ tuple() ဆိုတဲ့ function နဲ ့တြဲသံုးရမွာပါ။ ဥပမာေလးေရးျပပါမယ္။
>>> a = (1, 3, 2)
>>> a = tuple(sorted(a))
>>> a
(1, 2, 3)Tuple အေၾကာင္းကေတာ့ဒီေလာက္ပါပဲ သိပ္ေျပာစရာမရွိပါဘူး။ ေနာက္တစ္ခန္းက်ရင္ေတာ့ကြ်န္ေတာ္တို ့Dictionary အေၾကာင္းကိုေလ့လာၾကပါမယ္။
(C) PyLab 2016

0 comments:
Post a Comment