Uploaded by A1-Nguyễn Hữu Bằng

Python VoDuyTuan

advertisement
+MЪMXLMЖY
,MЖRRE]4]XLSRPɧQШXXVSRKRLоRKRKɺRRKоPϼTXVɳRL
чERKчšвGGLɾʁFЮMXɴRLчEHϰRKZАиRKHдRKXLšZMЖR
TLSRKTLɾZɧGШRKчТRKчɺRKчϲS
ɇɪPɧQZMЖGZЪM4,4RʆQZɧGɹRLоRKXɨGZдQɧ4,4
OLɹQɧXLрGLMЖRXРMšYчšвGOLMЎRQɳRLTLϲMXMЎTGϼRZЪM
4]XLSRXVSRKKMEMчSϰRRɧ]
'YРRWɨGLRLОRɧ]чšвGZMЎXXVSRKUYɨXVɳRLQɳRLFϾXч϶Y
LМG4]XLSRZɧKMϲMUY]ЎXGɨGFɧMXSɨRG˜FϲRXLISRLYG϶Y
GжEQɳRL
,]ZМRKRLоRKKLMGLɰTGжEQɳRLGˢRKWЌKMɾTɴGLGLS
RLоRKEMчERKUYERXɩQчЎRZMЖGиRKHдRK4]XLSRZɧS
GɺRKZMЖGZɧ\мPʁLMЖRXϰM
1дGPдG
7ɨGLчšвGGLMEPɧQGLš˜RKQЦMGLš˜RKWЌXVɳRLFɧ]
OLɴEGϰRLGжE4]XLSRQɧQɳRLWЌKІTTLϲMZɧWЌLоYɴGL
OLMFMЎXGɨGOMЎRXLиGRɧ]XVSRKZMЖGɨTHдRK4]XLSRZɧS
GɺRKZMЖGXVSRKXš˜RKPEM
,IPPS[SVPH
'ɾTLɨT
4LɩRGLMEQSHYPI
'PEWW
8LESXɨGXVɱRXϼTXMR
<мPʁLɳRLϲRL
<мPʁJMPI.732
<мPʁJMPI<10
/ЎXRРM1]750
/ЎXRРM6IHMW
/ЎXRРM1IQGEGLIH
/ЎXRРM6EFFMX15
6IWXJYP'PMIRX
+ЮMIQEMPZЪM7184
7SGOIX4VSKVEQQMRK
'Lš˜RK,IPPS[SVPH
4]XLSRPɧQШXRKɺRRKоTLMɱRHКGL -RXIVTVIXIV0ERKYEKI XиGPɧOLɺRKG϶RFYMPHXLɧRLJMPIXLрGXLMQɧGLϰ]XVрGXMЎT
RLš4,4
,MЖRXϰM4]XLSRGɹRLɨRLGLɴRLPɧ\Zɧ\ЭRLɨRL\
чɪHкRKTLɨXXVMВRZɧчERKчиRKЮTLMɱRFϲR2LɨRL
4]XLSR\XLɳZϺRчERKчšвGXMЎTXдGTLɨXXVMВR
;IFWMXIGLɴRLXLиGGжE4]XLSR[[[T]XLSRSVK
'ɧMчІX
4]XLSRLЦXVвL϶YLЎXGɨGRАRXϲRKZɧVϴXHДXɳQXLϴ]WЄR
XVɱRQШXWРLЖчMАYLɧRLRLš1EG37ŷ
ɇВFMЎXPɧLЖXLРRKGжEFϰRчɪGɧM4]XLSRGLšEGɹXLВZɧS
QɧRLɳRLGSQQERHPMRIZɧKɻ
$ python --version
2ЎYчɪGɧMчІXT]XLSRXLɳWЌLMВRXLКXLɺRKXMRTLMɱRFϲR
T]XLSR2ЎYFɨSPЦMXLɳчТRKRKLʨEZЪMFϰRGLšEGɧMчІX
4]XLSR
'ɹXLВXLEQOLϲSGɨGLGɧMчІX4]XLSRXϰM
LXXTW[[[T]XLSRSVKHS[RPSEHW
'ɺRKGдTLɨXXVMВR
'LИG϶RHɽRKQШXXI\XIHMXSVPɧFϰRGɹXLВZMЎXчšвGGSHI
T]XLSRLSІGGɹXLВHɽRKGɨGGɺRKGдGESGϴTL˜R -()
RLš%TXERE4]'LEVQŷ'ɨG-()XLšЬRKLЦXVвXLɱQUYɨ
XVɳRLTLɩRXɴGLGɾTLɨTHɸRKPЖRLHIFYKŷXVSRKTLϰQZM
GYРRWɨGLRLОRɧ]XLɳQɳRLLšЪRKчЎRGɨGLXLрGXLM
T]XLSRFЀRKHɸRKPЖRL
,IPPS[SVPH
8ϰSQШXJMPIGɹXɱRPɧ helloworld.py ZɧGɹRШMHYRKRLš
WEY
print 'Hello world'
print PɧPЖRLG˜FϲRRLϴXчВ\YϴXQШXFMЎRVE XLšЬRKPɧ
QɧRLɳRL
7EYчɹZɧSQɧRLɳRLGSQQERHPMRIHMGLY]ВRчЎRXLš
QдGGLиEJMPIRɧ]ZɧKɻ
$ python helloworld.py
2ЎYXLϴ]\YϴXLMЖRHɸRKGLо Hello world XиGPɧFϰRчɪ
LSɧRXLɧRLZMЖGZMЎXиRKHдRKT]XLSRч϶YXMɱR
'Lš˜RK'ɾTLɨT
&MЎRWР
/LEMFɨSFMЎRFЀRKQШXGɩYPЖRLKɨR
a = 1
FϰRGɹXLВKɨRRLMАYPSϰMKMɨXVК WРGLYЦM GLSQШXFMЎR
a = 1
a = 'Hello World'
a = [1, 2, 3]
a = [1.2, 'Hello', 'W', 2]
8SɨRXмWРLМG
4]XLSRGˢRKLЦXVвQШXWРXSɨRXмXSɨRLМGXLɺRKHдRK
RLš
+ TLɰTGШRK
- TLɰTXVк
* TLɰTRLɩR
/ TLɰTGLME
% TLɰTGLMEPϴ]Hš QSHYPS
&SSPIERZɧ8SɨRXмPSKMG
+MɨXVКчɾRKZɧWEMXš˜RKиRKPɧ True Zɧ False not чВчϲSKMɨXVК
and TLɰTXɴRLPSKMGZɧ %2(
or TLɰTXɴRLPSKMGLSІG 36
1ШXWРTLɰTWSWɨRLXLɺRKXLšЬRKRLš < FɰL˜R <= Fɰ
L˜RLSІGFЀRK > PЪRL˜R >= PЪRL˜RLSІGFЀRK ==
FЀRK != OLɨG чВWSWɨRLKMɨXVК
,ЦXVвHϰRKWSWɨRLOɰTRLš
x = 2
1 < x < 3
# True
10 < x < 20 # False
3 > x <= 2 # True
2 == x < 4 # True
8SɨRXмOMВQXVETL϶RXмXVSRKQШXXϼTLвT in OMВQXVE
GɹXТRXϰM not in OMВQOLɺRKXТRXϰM
'good' in 'this is a greate example'
alse
'good' not in 'this is a greate example'
# F
# True
'ϴYXVɾGчMАYOLMВR
4]XLSRLЦXVвQШXWРGϴYXVɾGчMАYOLMВRXLɺRKHдRK,϶Y
LЎXGɨGGϴYXVɾGчMАYOLMВRчАYHрEZɧSXLдXч϶YHɸRK
MRHIRXMSR чВXϰSXLɧRLQШXFPSGO\мPʁXLE]ZɳWмHдRK
{ ŷ } RLšGɨGRKɺRRKоOLɨG 4,4.EZEWGVMTX -JŷIPMJŷIPWI
if condition1 :
indentedStatementBlockForTrueCondition1
elif condition2 :
indentedStatementBlockForFirstTrueCondition2
elif condition3 :
indentedStatementBlockForFirstTrueCondition3
elif condition4 :
indentedStatementBlockForFirstTrueCondition4
else:
indentedStatementBlockForEachConditionFalse
7[MXGLŷGEWI
4]XLSROLɺRKGɹGϴYXVɾG switch ŷ case
*SVŷMR
for iterating_var in sequence:
statements(s)
:ɴHд
for letter in 'Python':
# First Example
print 'Current Letter :', letter
fruits = ['banana', 'apple', 'mango']
for fruit in fruits:
# Second Example
print 'Current fruit :', fruit
print "Good bye!"
/ЎXUYϲLMВRXLКGжEZɴHдXVɱR
Current Letter : P
Current Letter : y
Current Letter : t
Current Letter : h
Current Letter : o
Current Letter : n
Current fruit : banana
Current fruit : apple
Current fruit : mango
Good bye!
;LMPI
while expression:
statement(s)
:ɴHд
count = 0
while (count < 9):
print 'The count is:', count
count = count + 1
print "Good bye!"
/ЎXUYϲLMВRXLКGжEZɴHдXVɱR
The count is: 0
The count is: 1
The count is: 2
The count is: 3
The count is: 4
The count is: 5
The count is: 6
The count is: 7
The count is: 8
Good bye!
,ɧQ
/LEMFɨSLɧQXLISGɾTLɨT
def functionname(param, param2,..):
statements(s)
,ɧQRЎYOLɺRKXVϲHоPMЖYXLɳQІGчКRLWЌXVϲZАKMɨXVК
None
:ɴHдOLEMFɨSLɧQXɴRLZɧXVϲZАKMɨXVКXФRKGжEXLEQ
WРч϶YZɧS
def sum(a, b):
return (a+b)
'ɨGLKМMLɧQ
sum(1, 2)
(trҥ vӃ giá trӍ là 3)
,ɧQGɹLЦXVвKMɨXVКQІGчКRLGLSXLEQWРOLMOLɺRK
XVY]АRZɧS:ɴHдLɧQWEY
def plus(c, d = 10):
return (c+d)
2ЎYKМMLɧQXVɱRRLšWEY
plus(2)
(kӁt quҥ trҥ vӃ là 12)
1ШXOLɨGFMЖXXVSRKGɨGLKМMLɧQGжE4]XLSRWSZЪM4,4
PɧGLɾRKXEGɹXLВXLE]чФMXLиXрXLEQWРXVY]АRZɧSFЀRK
GɨGLчІXXɱRXLEQWРOLMKМMLɧQ:ɴHдXEGɹXLВKМMLɧQ
sum(a,b) ЮZɴHдXVɱRFЀRKGɨGLXVY]АRXLEQWР b XVšЪG a
RLšWEY
sum(b = 1, a = 10)
<мPʁGLYЦM
1ШXGLYЦMGɹXLВOLEMFɨSFЀRKHϴYRLɨ]чɺM " LSІGч˜R
' :ɴHдGɨGGLYЦMWEY
str1 = "Hello"
str2 = 'world'
'ɹXLВXVY]\YϴXXкRKOʁXрXVSRKQШXGLYЦMXLISLɳRLXLиG
MRHI\ZɴHд str1[0] str1[1] ŷ
'ɹXLВWмHдRKHϴYRLɨ] чɺMLSІGч˜R чВOLEMFɨS
GLYЦMXVɱRRLMАYHɸRK:ɴHд
paragraph = """This is line 1
This is line 2
This is line 3"""
2РMGLYЦM
'ɹXLВXϰSQШXGLYЦMHɧMXкZMЖGRРMGɨGGLYЦMPϰMXLISGɾ
TLɨT
str = str1 + " " + str2
8VɴGL\YϴXGLYЦMGSR
'ɹXLВXϰSGɨGGLYЦMGSRXLɺRKUYEXSɨRXмPϴ]OLSϲR
[start:end] VERKI 1ІGчКRL start PɧXкZКXVɴч϶YGLYЦM
0 Zɧ end PɧчЎRZКXVɴGYРMGLYЦM:ɴHд
str = 'Hello world'
print str[0:4]
(HiӅn thӍ "Hell")
print str[:4]
(HiӅn thӍ "Hell")
print str[-3:]
(HiӅn thӍ "rld")
print str[6:-3]
(HiӅn thӍ "wo")
0ϴ]чШHɧMGжEGLYЦM
7мHдRKLɧQ len(...) чВXVϲZАчШHɧMGжEGLYЦM:ɴHд
count = len("Hello world")
(count có giá trӍ 11)
8ɳQ XLE]XLЎRШMHYRK
'ɹXLВXɳQZɧXLE]XLЎXVSRKGLYЦMFЀRKGɨGLKМMTLš˜RK
XLиG replace(search, replace[, max]) GжEQШXGLYЦM:ɴ
Hд
str = 'Hello world'
newstr = str.replace('Hello', 'Bye')
print newstr
(Sҿ hiӅn thӍ chuәi "Bye world" trên màn hình)
8ɳQZКXVɴGLYЦMGSR
'ɹXLВXɳQZКXVɴGжEQШXGLYЦMGSRXVSRKGLYЦMPЪRFЀRK
GɨGLKМMTLš˜RKXLиG find(str, beg=0
end=len(string)) &ϾXч϶YPɧZКXVɴ 0 RЎYOLɺRKXɳQVEXLɳ
XVϲZА -1 :ɴHд
str = 'Hello world'
print str.find('world')
(hiӅn thӍ 6)
print str.find('Bye');
(hiӅn thӍ -1)
,ɧQ find() WЌXɳQXLISXLиXрXкXVɨMUYETLϲMGжEGLYЦM
XиGPɧXкP϶R\YϴXLMЖRч϶YXMɱR'ɹXLВHɽRKLɧQ rfind()
чВXɳQXLISZКXVɴXкGYРMGLYЦMZАTLɴEXVšЪG
8ɨGLGLYЦM
'ɹXLВXɨGLGLYЦMHрEXLISQШXGLYЦMHIPMQIXIVFЀRKGɨGL
KМMTLš˜RKXLиG split(str="", num=string.count(str)) :ɴHд
str = 'Hello world'
print str.split(' ')
(Trҥ vӃ mӛt mҥng có 2 phҩn tӯ là 2 chuәi "Hello" và
"world")
'ɹXLВWмHдRKLɧQ splitlines() чВXɨGLGLYЦMXLIS
XкRKLɧRKZɧPSϰMFОOʁXр2);0-2)
8VMQOʁXрOLSЂRKXVϾRK
'ɹXLВPSϰMFОGɨGOʁXр QІGчКRLPɧOʁXрOLSϲRKXVϾRK
XVšЪGZɧWEYQШXGLYЦMFЀRKGɨGLKМMGɨGTLš˜RKXLиG
WEY
strip([chars]) PSϰMFОXVšЪGZɧWEYGLYЦM
lstrip([chars]) PSϰMFОTLɴEXVšЪGGLYЦM
rstrip([chars]) PSϰMFОTLɴEWEYGLYЦM
1ШXWРLɧQ\мPʁGLYЦM
isnumeric() /MВQXVEQШXGLYЦMGɹTLϲMPɧGLYЦMWР
lower() 'LY]ВRGLYЦMLЎXXLɧRLGLоXLšЬRK
upper() 'LY]ВRGLYЦMLЎXXLɧRLGLо,3%
0MWX
0MWXXVSRK4]XLSRPɧGϴYXVɾGQϲRKZɧGɨGTL϶RXмGɹMRHI\
GɹXLиXр/LɺRKRLš4,4OI]GжEQШXQϲRKGɹXLВZкE
PɧWРZкEPɧGLYЦM EWWSGMEXIHEVVE] 8VSRK4]XLSRQYРRXϰSQШXQϲRKGɹOI]PɧGLYЦMXLɳWЌ
WмHдRKGϴYXVɾG(MGXMSREV] TL϶RXMЎTXMЎT 8VSRKTL϶R
Rɧ]GLɾRKXEWЌRɹMчЎR0MWX1ШX0MWXчšвGOLEMFɨSRLš
QϲRKXVSRK.7327мHдRK [..] чВOLEMFɨSQШXQϲRK
:ɴHд
numbers = [1, 2, 3, 4, 5]
names = ['Marry', 'Peter']
'ɹXLВXVY]\YϴXXкRKTL϶RXмGжEQϲRKFЀRKMRHI\TL϶R
Xмч϶YXMɱRGɹXLиXрPɧ 0 :ɴHд
print numbers[0]
(HiӅn thӍ 1)
print numbers[-3]
(HiӅn thӍ 3)
print names[1]
(HiӅn thӍ 'Peter')
ɇВFMЎXчšвGWРPšвRKTL϶RXмGжE0MWXGɹXLВWмHдRK
LɧQ len(array) чВPϴ]WРPšвRKTL϶RXмGжEQϲRKXLEQ
WРXVY]АRZɧS
/MВQXVEWрXТRXϰMGжEQШXTL϶RXм
/MВQXVEXLIS-RHI\
8VSRKRLMАYXVšЬRKLвTFϰRQYРRXVY]\YϴXQШXTL϶RXм
FϴXOΧ HрEZɧSMRHI\ GжEQϲRKXLɳRЎYXVY]\YϴXчЎRQШX
TL϶RXмOLɺRKXТRXϰMXLɳиRKHдRKWЌFɨSPЦM(SчɹXVšЪG
OLMXVY]\YϴXQШXTL϶RXмFϰRG϶ROMВQXVE\IQTL϶RXм
Rɧ]чɪXТRXϰMLE]GLšE,MЖRXϰMT]XLSROLɺRKLЦXVвLɧQ
RɧSчВOMВQXVEWрXТRXϰMGжEQШXTL϶RXмXVSRKQϲRK
'ɹGɨGLXLšЬRKXLϴ]чВOMВQXVEчɹPɧŰ0SSOFIJSVI]SY
PIETű 0&=0 ZɧŰ)EWMIVXSEWOJSVKMZIRIWWXLER
TIVQMWWMSRű )%*4 :ɴHдZАŰ0SSOFIJSVI]SYPIET 0&=0 ű
if index < len(array):
array[index]
else:
# handle this
:ɴHдZАŰ)EWMIVXSEWOJSVKMZIRIWWXLERTIVQMWWMSRű
)%*4 try:
array[index]
except IndexError:
# handle this
/MВQXVEXLISKMɨXVК
ɇВOMВQXVEQШXKMɨXVКGɹXТRXϰMOLɺRKXТRXϰMXVSRK
QϲRKLE]OLɺRKXLɳGɹXLВWмHдRKXSɨRXм in not in :ɴ
Hд
mylist = ['a', 'b', 'c']
print 'a' in mylist
(HiӅn thӍ True)
print 'b' not in mylist
(HiӅn thӍ False)
8VɴGL\YϴXQϲRKGSR
8š˜RKXрRLšGLYЦMXɹXLВXϰSGɨGQϲRKGSRXLɺRKUYE
XSɨRXмPϴ]OLSϲR [start:end] VERKI 1ІGчКRL start Pɧ
XкZКXVɴч϶YGLYЦM 0 Zɧ end PɧчЎRZКXVɴGYРMGLYЦM:ɴHд
numbers = ['a', 'b', 'c', 'd']
print numbers[:2]
(HiӅn thӍ ['a', 'b'])
print numbers[-2:]
(HiӅn thӍ ['c', 'd'])
<ɹETL϶RXмGжEQϲRK
'ɹXLВ\ɹEQШXTL϶RXмXLɺRKUYEXSɨRXм del 8LиXрGжE
GɨGTL϶RXмWЌHКGLGLY]ВRXɽ]ZɧSZКXVɴGжETL϶RXмFК
\ɹE:ɴHд
numbers = [1, 2, 3, 4, 5]
del numbers[0]
print numbers
(HiӅn thӍ [2, 3, 4, 5])
&ϰRGɹXLВ\ɹEQШXOLSϲRHрEZɧSXSɨRXмPϴ]OLSϲR
[start:end] :ɴHд
numbers = [1, 2, 3, 4, 5, 6, 7]
del numbers[2:4]
print numbers
(HiӅn thӍ [1, 2, 5, 6, 7])
2РMQϲRK
&ϰRGɹXLВWмHдRKXSɨRXм + чВRРMKMɨXVКGжEQϲRKZɧ
XϰSVEQШXQϲRKPЪRGɹWРPšвRKTL϶RXмPɧXФRKWРPšвRK
TL϶RXмGжEQϲRKGSR:ɴHд
a = [1, 2]
b = [1, 3]
print a + b
(HiӅn thӍ [1, 2, 1, 3])
8LɱQTL϶RXмZɧSQϲRK
2ЎYFϰRQYРRXLɱQTL϶RXмZɧSQШXQϲRKчɪXТRXϰMLɪ]
HɽRKTLš˜RKXLиG list.append(newvalue) чВXLɱQTL϶R
XмGɹKMɨXVК newvalue ZɧSGYРMQϲRK list :ɴHд
numbers = [1, 2, 3]
numbers.append(4)
print numbers
(HiӅn thӍ [1, 2, 3, 4]
0ϴ]TL϶RXмGYРMQϲRK
2ЎYQYРRPϴ]TL϶RXмGYРMGɽRKGжEQϲRKVEOLОMQϲRK
GɹXLВWмHдRKTLš˜RKXLиG list.pop() WЌXVϲZАKMɨXVК
GжETL϶RXмGYРMGɽRKZɧQϲRKFɩ]KMЬWЌOLɺRKGɸRTL϶R
XмRɧ]
numbers = [1, 2, 3]
mynumber = numbers.pop()
print mynumber
(HiӅn thӍ 3)
print numbers
(HiӅn thӍ [1, 2])
8ɳQQШXKMɨXVКXVSRKQϲRK
2ЎYFϰRQYРRXɳQZКXVɴ MRHI\ GжEQШXKMɨXVКXVSRKQШX
QϲRKGɹXLВHɽRKTLš˜RKXLиG list.index(obj) 2ЎY
XɳQXLϴ]WЌXVϲZАMRHI\GжETL϶RXмч϶YXMɱRXɳQXLϴ]2ЎY
OLɺRKXɳQXLϴ]WЌUYʆRK)\GITXMSR:ɴHд
aList = [123, 'xyz', 'zara', 'abc'];
print "Index for xyz : ", aList.index('xyz')
print "Index for zara : ", aList.index('zara')
/LMGLϰ]WЌLMВRXLКOЎXUYϲ
Index for xyz : 1
Index for zara : 2
ɇϲSRKšвGKMɨXVКGжEQϲRK
ɇВчϲSRKšвGXLиXрGɨGKMɨXVКGжEQШXQϲRKWмHдRK
TLš˜RKXLиG list.reverse() 4Lš˜RKXLиGRɧ]OLɺRKXVϲ
ZАOЎXUYϲQɧXLE]чФMXVрGXMЎTQϲRK list :ɴHд
numbers = [1, 2, 3, 4]
numbers.reverse()
print numbers
(HiӅn thӍ [4, 3, 2, 1])
7ϾT\ЎTKMɨXVКGɨGTL϶RXм
ɇВWϾT\ЎTXLиXрGжEKMɨXVКXVSRKQϲRKWмHдRKTLš˜RK
XLиG list.sort([func]) чВWϾT\ЎT2ЎYXLEQWРч϶Y
ZɧSPɧLɧQ func OLɺRKXVY]АRZɧSXLɳQІGчКRLPɧWϾT\ЎT
XLISKMɨXVКXʆRKH϶R4Lš˜RKXLиGRɧ]OLɺRKXVϲZАOЎX
UYϲQɧXLE]чФMXVрGXMЎTQϲRK list :ɴHд
aList = [123, 'xyz', 'zara', 'abc', 'xyz']
aList.sort()
print "List : ", aList
(HiӅn thӍ List : [123, 'abc', 'xyz', 'xyz', 'zara'
])
'ɨGLXVMВROLEMLɧQGSQTEVI func() GˢRKKMРRKRLšLɧQ
YWSVXXVSRK4,4,ɧQXVϲZАGɨGKMɨXVК 0 -1 Zɧ 1 8YTPI
8YTPIGˢRKPɧQШXGϴYXVɾGQϲRKXš˜RKXрRLšGϴYXVɾG
0MWX1ШXWРчMВQOLɨGRLEYG˜FϲRPɧOLEMFɨS8YTPIWм
HдRKGІTHϴYRKSІG (...) ZɧQШXXYTPIчɪчšвGOLEMFɨS
VТMXLɳOLɺRKXLE]чФMчšвGKMɨXVК MQQYXEFPI ZɧOLɺRKLЦ
XVвGɨGTLš˜RKXLиGRLš append() pop() ŷ:ɴHд
mytuple = ('x', 'y', 'z')
print mytuple
(HiӅn thӍ ('x', 'y', 'z'))
:ϺRLЦXVвGɨGGɨGLчВXVY]\YϴXTL϶RXмKMРRK0MWXRLšPɧ
XVY]\YϴXXLISMRHI\VERKIXɳQOMЎQŷ
(MGXMSREV]
(MGXMSREV]GˢRKPɧQШXGϴYXVɾGQϲRKRLšRKGɨGTL϶RXм
FESKТQOI]ZɧZEPYI2ЎYFϰRGɹFMЎX.732XLɳGϴYXVɾG
(MGXMSREV]Xš˜RKXрRLšQШXSFNIGXNWSR1ШX(MGXMSREV]
чšвGOLEMFɨSFЀRKGІTHϴYRKSІG {...} :ɴHд
point = {'x': 1, 'y': 2}
8VY]\YϴXQШXKMɨXVКHрEZɧSOI]GжEчРMXšвRK:ɴHд
point = {'x': 3, 'y': 6, 'z' : 9}
print point[x]
(HiӅn thӍ 3)
8LɱQQШXTL϶RXм
ɇВXLɱQQШXTL϶RXмZɧSчРMXšвRKчɪOLEMFɨSWмHдRK
GϴYXVɾG dict[key] = value :ɴHд
user = {'name': 'Jone', 'age': 30}
user['country'] = 'Vietnam'
print user
(HiӅn thӍ {'country': 'Vietnam', 'age': 30, 'name':
'Jone'})
1ШXWРLɧQTLš˜RKXLиGXLɺRKHдRK
dict.clear() <ɹEXSɧRFШHоPMЖYFɱRXVSRKчРM
XšвRK
dict.copy() 8VϲZАQШXFϲRGST]GжEчРMXšвRK
dict.fromkeys(seq[, value]) 8ϰSQШXчРMXšвRKZЪM
HERLWɨGLOI]XкWIUZɧRЎYGɹXVY]АR value XLɳPϴ]
чɹPɧQKMɨXVКGLSGɨGTL϶RXм
dict.has_key(key) OMВQXVEQШXOI]GɹXТRXϰMXVSRK
чРMXšвRKLE]OLɺRK
dict.keys() 8VϲZАQШX0MWXGLиEGɨGOI]
dict.values() 8VϲZАQШX0MWXGLиEGɨGZEPYI
'Lš˜RK4LɩRGLMEQSHYPI
8ϴXGϲZɴHдGLSчЎRXLЬMчMВQRɧ]чАYчšвGXLрGXLMXVSRK
GSQQERHPMRILSІGXкQШXJMPIT]XLSR .py 8Y]RLMɱRчРM
ZЪMGɨGиRKHдRKPЪRGɹRLMАYGLиGRʆRKXLɳTLɩRGLMERLО
HрɨRXLɧRLGɨGJMPIOLɨGRLEYWЌKMɾTHДFϲSXVɳZɧXɨMWм
HдRKGɨGXLɧRLTL϶RчɪXLMЎXOЎ
'Lš˜RKRɧ]WЌKMɾTFϰRXLMЎXOЎGɨGXɴRLRʆRKXLISQɺ
LɳRLGɨGQSHYPIZɧOLMG϶RXLɳWЌKМMJMPIXš˜RKиRKZɧWм
HдRK
'ɨGPSϰMQSHYPIXLšZMЖR
'ɹPSϰMQSHYPIXLšЬRKXLϴ]Pɧ
:MЎXFЀRK4]XLSRGɹTL϶RQЮVШRKPɧ .py
'ɨGXLšZMЖRPMɱROЎXчШRKGɹTL϶RQЮVШRKPɧ .dll .pyd .so .sl ŷ
'1SHYPIPMɱROЎXZЪMXVɳRLTLMɱRHКGL
ɇšЬRKHϺRXɳQчВPSEHQSHYPI
ɇВXϲMQШXQSHYPIZɧSWGVMTXGжEFϰRWмHдRKGɾTLɨT
ч˜RKMϲR
import modulename
OLMKІTGɩYPЖRLXVɱRXLɳXVɳRLFMɱRHКGLWЌXMЎRLɧRLXɳQ
OMЎQJMPIQSHYPIXš˜RKиRKXLISXLиXрXLšQдGWEY
8LšQдGLMЖRLɧRLQɧWGVMTXчERKKМM
'ɨGXLšQдGXVSRK4=8,324%8, RЎYGɹWIX
'ɨGXLšQдGGɧMчІXGLYϸRXVɱR0MRY\9RM\
'ɹXLВFMЎXчšвGчšЬRKHϺRQɧQШXQSHYPIчɪчšвGPSEH
FЀRKчSϰRGSHIHšЪMчɩ]
import math
math.__file__
(Ví dӧ trҥ vӃ '/usr/lib/python2.5/lib-dynload/math.
so')
import random
random.__file__
(Ví dӧ trҥ vӃ '/usr/lib/python2.5/random.pyc')
0ϴ]HERLWɨGLXLYШGXɴRLZɧTLš˜RK
XLиGGжEQШXQSHYPI
ɇВPϴ]чšвGHERLWɨGLGɨGXLYШGXɴRLZɧTLš˜RKXLиGQɧ
QSHYPILЦXVвWмHдRKLɧQ dir(modulename) :ɴHд
dir(math)
['__doc__', '__file__', '__name__', '__package__',
'acos', 'acosh', 'asin', 'asinh', 'atan', 'atan2',
'atanh', 'ceil', 'copysign', 'cos', 'cosh', 'degree
s', 'e', 'erf', 'erfc', 'exp', 'expm1', 'fabs', 'fa
ctorial', 'floor', 'fmod', 'frexp', 'fsum', 'gamma'
, 'hypot', 'isinf', 'isnan', 'ldexp', 'lgamma', 'lo
g', 'log10', 'log1p', 'modf', 'pi', 'pow', 'radians
', 'sin', 'sinh', 'sqrt', 'tan', 'tanh', 'trunc']
'ɹXLВKМMLɧQ dir() OLɺRKXVY]АRXLEQWРчВPϴ]GɨG
XLYШGXɴRLZɧTLš˜RKXLиGGжEWGSTILMЖRXϰMчERKXLрG
XLM
'ɨGLOLEMFɨSZɧWмHдRKQSHYPI
+MϲWмFϰRXϰSQШXJMPIT]XLSR mymath.py GɹRШMHYRKRLš
WEY
def cong(a, b):
return a + b
def tru(a, b):
return a - b
def nhan(a, b):
return a * b
7EYчɹXϰSQШXJMPIGɹXɱR myexample.py XVSRKGɽRKXLš
QдGZЪMJMPI mymath.py ZкEXϰSЮXVɱRGɹRШMHYRKRLš
WEY
import mymath
num1 = 1
num2 = 2
print 'Tong hai so la: ', mymath.cong(num1, num2)
:ɧSGSQQERHPMRIXLрGLMЖRKМMJMPIQ]I\EQTPIRLšWEY
$ python myexample.py
7EYOLMXLрGLMЖRWЌLMВRXLКPɱRQɧRLɳRLPɧ
Tong hai so la: 3
4EGOEKIQSHYPI
'ɹXLВKSQRLMАYQSHYPI .py ZɧSQШXXLšQдGZɧXɱRXLš
QдGPɧXɱRGжETEGOEKIZɧXϰSQШXJMPI __init__.py XVSRK
XLšQдGRɧ]
2LšZϼ]GϴYXVɾGXLšGжEQШXTEGOEKIWЌRLšWEY
|-- mypack
|
|-- __init__.py
|
|-- mymodule1.py
|
|-- mymodule2.py
|
'ɹXLВWмHдRK mymodule1 XLISGɾTLɨTMQTSVXWEY
import mypack.mymodule1
LSІG
import mypack.mymodule1 as mymodule1
LSІG
import mypack.mymodule1 as mod
/LMWмHдRKQШXQSHYPIXLYШGQШXTEGOEKIXLɳGɨGPЖRL
XVSRKJMPI __init__.py WЌчšвGXLрGLMЖRXVšЪG8LɺRK
XLšЬRKXLɳJMPI __init__.py WЌVЦRK
'ɹXLВXϰSGɨGWYFTEGOEKIFɱRXVSRKQШXTEGOEKIXLIS
чɾRKGϴYXVɾGXLšQдGGɹJMPI __init__.py :ɴHд
import mypack.mysubpack.mysubsubpack.module
'Lš˜RK'PEWW
0ϼTXVɳRLLšЪRKчРMXšвRKPɧQШXOLɨMRMЖQOLɺRKXLВ
XLMЎYXVSRKL϶YLЎXGɨGRKɺRRKоXLɺRKHдRKLMЖRRE]
4]XLSRGˢRKLЦXVвPϼTXVɳRLLšЪRKчРMXšвRKZЪMGɨGOLɨM
RMЖQ'PEWW3FNIGX3ZIVVMHIŷ
/LEMFɨSQШX'PEWW
/LEMFɨSQШXGPEWWXLISGɾTLɨTWEY
class myclass([parentclass]):
assignments
def __init__(self):
statements
def method():
statements
def method2():
statements
:ɴHдQШXGPEWW
class animal():
name = ''
name = ''
age = 0
def __init__(self, name = '', age = 0):
self.name = name
self.age = age
def show(self):
print 'My name is ', self.name
def run(self):
print 'Animal is running...'
def go(self):
print 'Animal is going...'
class dog(animal):
def run(self):
print 'Dog is running...'
myanimal = animal()
myanimal.show()
myanimal.run()
myanimal.go()
mydog = dog('Lucy')
mydog.show()
mydog.run()
mydog.go()
7EYOLMXLрGXLMWЌGLSVEOЎXUYϲ
My Name is
Animal is running...
Animal is going...
My Name is Lucy
Dog is running...
Animal is going...
8VSRKZɴHдXVɱRXLɳ
animal Zɧ dog PɧGPEWW8VSRKчɹGPEWW dog OЎXLкE
XкGPEWWGLEPɧ animal RɱRWЌGɹGɨGTLš˜RKXLиGGжE
GPEWW animal name Zɧ age PɧXLYШGXɴRL %XXVMFYXI GжEGPEWW
4Lš˜RKXLиG __init__(self) PɧLɧQXϰSGжEGPEWW
,ɧQRɧ]WЌчšвGKМMQЦMOLMGɹQШXSFNIGXQЪMчšвG
XϰS XкQШXGPEWW KМMPɧUYɨXVɳRLXϰSMRWXERGI
show() run() Zɧ go() PɧTLš˜RKXLиGGжEGPEWW
/LMOLEMFɨSTLš˜RKXLиGGɹOɯQXLEQWР self HɽRK
чВXVY]GϼTRKšвGPϰMSFNIGXчERKKМM0ɾGKМMTLš˜RK
XLиGXLɳOLɺRKG϶RXVY]АRXLEQWРRɧ]
4Lš˜RKXLиG run() GжEGPEWW dog KМMPɧ override
GжETLš˜RKXLиG run() GжEGPEWW animal 'Lš˜RK8LESXɨGXVɱRXϼTXMR
Zɧ8LšQдG
2ШMHYRKGLš˜RKRɧ]WЌLšЪRKHϺRGɨGXLESXɨGPMɱRUYER
чЎRXϼTXMRZɧXLšQдG
8ϼTXMR *MPI
1ЮJMPI
8VšЪGOLMQYРRчМGLSІGKLMJMPIFϰRG϶RGɹXLESXɨGQЮ
JMPIXLISGɾTLɨT
fh = open(filepath, mode)
8VSRKчɹ filepath PɧчšЬRKHϺRGжEJMPIWЌQЮZɧ mode
PɧGLЎчШчВQЮ'ɹQШXWРGLЎчШPɧ
r QЮчВчМGRШMHYRK QІGчКRL
w QЮчВKLMRШMHYRK
a QЮчВKLMXLɱQRШMHYRKZɧSGYРMJMPI
r+ QЮчВчМGZɧKLM'SRXVОRЀQЮч϶YJMPI
w+ QЮчВчМGZɧKLM+LMчɯRЎYJMPIчɪXТRXϰMRЎY
JMPIGLšEXТRXϰMXLɳXϰSJMPIQЪMчВKLM
a+ QЮчВчМGZɧXLɱQZɧSGYРMJMPI'SRXVОRЀQЮ
GYРMJMPI2ЎYJMPIGLšEXТRXϰMXLɳXϰSJMPIQЪMчВKLM
1ІGчКRLPɧQЮJMPIXI\XRЎYQYРRQЮJMPIRLКTLɩR
FMREV] XLɳXLɱQ b ZɴHд rb wb ab rb+ wb+ ab+ :ɴHд
f1 = open('test.txt', 'r')
f2 = open('access_log', 'a+'
7EYOLMKМMLɧQ open() XLɧRLGɺRKXLɳWЌXVϲZАQШX
SFNIGXGɹGɨGXLYШGXɴRL
closed 8VYIRЎYJMPIчɪчɹRK
mode GLЎчШOLMQЮJMPI
name XɱRGжEJMPI
softspace GЬчɨRLHϴYWSJXWTEGIOLMHɽRKZЪMLɧQ
print
ɇМGRШMHYRKXкJMPI
7EYOLMJMPIчɪQЮЮGLЎчШчМGXLɳKМMTLš˜RKXLиG
read([count]) чВXVϲZАXSɧRFШRШMHYRKGжEJMPI:ɴHд
f1 = open('test.txt', 'r')
data = f1.read();
,ɧQ read() GɹRLϼRQШXXLEQWРPɧWРPšвRKF]XIQYРR
чМG2ЎYOLɺRKXVY]АRZɧSXLɳWЌчМGLЎXRШMHYRKGжEJMPI
:ɴHд
f2 = open('log.txt', 'r')
buffdata = f2.read(1024)
+LMRШMHYRKZɧSJMPI
2ЎYJMPIчšвGQЮЮGLЎчШGɹXLВKLMXLɳGɹXLВHɽRK
TLš˜RKXLиG write() чВKLMQШXRШMHYRKZɧSJMPI:ɴHд
f2 = open('access_log', 'a+')
f2.write('Attack detected')
ɇɹRKJMPIчɪQЮ
7EYOLMLSɧRXϴXGɨGXLESXɨGчМGKLMJMPIXLɳKМMTLš˜RK
XLиG close() чВчɹRKJMPIчɪQЮ:ɴHд
f1.close()
f2.close()
ɇФMXɱRJMPI
7мHдRKTLš˜RKXLиG os.rename(old, new) чВчФMXɱR
QШXJMPI:ɴHд
import os
os.rename('test.txt', 'test_new.txt')
<ɹEJMPI
7мHдRKTLš˜RKXLиG os.remove(file) чВ\ɹEQШXJMPI
OLОMLЖXLРRK:ɴHд
import os
os.remove('test.txt')
8LšQдG (MVIGXSV]
8ϰSXLšQдG
7мHдRKTLš˜RKXLиG os.mkdir(dir) чВXϰSXLšQдG:ɴ
Hд
import os
os.mkdir('test')
<ɹEXLšQдG
7мHдRKTLš˜RKXLиG os.rmdir(dir) чВ\ɹEQШXXLšQдG
:ɴHд
import os
os.rmdir('test')
ɇМGRШMHYRKXLšQдG
7мHдRKTLš˜RKXLиG os.listdir(dir) чВPϴ]HERLWɨGL
XϼTXMRXLšQдGGжEXLšQдG dir /LMKМMWЌXVϲZАQШX
QϲRKHERLWɨGLGɨGXϼTXMRXLšQдG:ɴHд
import os
allfiles = os.listdir('/root/downloads')
print allfiles
1SHYPI os
1SHYPI os PɧQШXQSHYPIGɹRLMАYTLš˜RKXLиGLоYɴGL
XVSRKZMЖGPɧQZMЖGZЪMGɨGJMPIZɧHMVIGXSV]RLš
os.chdir(path) чФMXLšQдGLMЖRLɧRL
os.getcwd() XVϲZАXLšQдGLMЖRLɧRL
os.chmod(path, mode) ',13(QШXчšЬRKHϺR
os.chown(path, uid, gid) ',3;2QШXчšЬRKHϺR
os.makedirs(path[, mode]) XϰSчšЬRKHϺR Gɹ
VIGYVWMZI
os.removedirs(path) \ɹEQШXчšЬRKHϺR Gɹ
VIGYVWMZI
<IQXLɱQXϰMLXXTWHSGWT]XLSRSVKPMFVEV]SWLXQP
1SHYPI os.path
1SHYPI os.path LЦXVвGɨGTLš˜RKXLиGKMɾTXLESXɨG
RLERLGLɹRKZɧXLYϼRXMЖRL˜RXVɱRчšЬRKHϺR
os.path.exists(path) OMВQXVEчšЬRKHϺRGɹXТR
XϰMLE]OLɺRK
os.path.getsize(path) Pϴ]JMPIWM^I F]XI
os.path.isfile(path) OMВQXVE\IQGɹTLϲMPɧQШX
JMPIXLɺRKXLšЬRK
os.path.isdir(path) OMВQXVE\IQGɹTLϲMPɧQШX
XLšQдG
os.path.dirname(path) XVϲZАXɱRXLšQдGGжETEXL
os.path.getatime(path) XVϲZАXLЬMKMERXVY]GϼT
QЪMRLϴX
os.path.getmtime(path) XVϲZАXLЬMKMERGLИRLWмE
GYРMGɽRK
os.path.getctime(path) XVϲZАXLЬMKMERGLИRLWмE
GYРMGжEQIXEHEXEXVɱRQШXWРLЖXLРRK,SІGXVϲZА
XLЬMKMERXϰSJMPIXVɱR;MRHS[W
<IQXLɱQXϰM
LXXTWHSGWT]XLSRSVKPMFVEV]SWTEXLLXQP
'Lš˜RK<мPʁLɳRLϲRL
7мHдRKXLšZMЖR4MPPS[ 4-0*SVO чВXMЎRLɧRLGɨGXLES
XɨG\мPʁLɳRLϲRLч˜RKMϲRRLšVIWM^IGVSTVSXEXIŷ
'ɧMчІX4-0
:ɧSXVERK[IFWEYчВHS[RPSEHGɧMчІXTEGOEKI4-0GLS
T]XLSRGжEFϰR
LXXTTMPPS[VIEHXLIHSGWSVKIRPEXIWXMRWXEPPEXMSRLXQP
7EYOLMGɧMчІXXLɳGɹXLВWмHдRKGɨGQSHYPIXVSRK
TEGOEKI-40
from PIL import Image
1ЮJMPI
from PIL import Image
im = Image.open("photo.jpg")
7EYOLMQЮJMPILɳRLXLɧRLGɺRKXLɳGɹXLВXLESXɨGXVɱRчРM
XšвRK im +LMJMPI
8кчРMXšвRK Image GɹXLВPšYJMPI\YРRKQɨ]XɴRLFЀRK
TLš˜RKXLиG save(path, type) :ɴHд
...
im.save('photo_new.jpg', 'JPEG')
8ϰSXLYQFREMP
7мHдRKTLš˜RKXLиG thumbnail RLšWEY
from PIL import Image
im = Image.open('photo.jpg')
im.thumbnail((100, 100))
im.save('photo_thumbnail.jpg', 'JPEG')
thumbnail OLɺRKXVϲZАMQEKIQЪMQɧXLрGLMЖRXVɱR
SFNIGXMQEKIчERKKМM
'ɨGXLESXɨG\мPʁLɳRLϲRL
8LEQOLϲSXLɱQXLšZMЖR4-0XϰM
LXXTTMPPS[VIEHXLIHSGWSVKIRPEXIWXMRHI\LXQP
'Lš˜RK<мPʁJMPI.732
.732PɧQШXXVSRKRLоRKчКRLHϰRKJMPIXVESчФMHоPMЖY
XLɺRKHдRKRLϴXLMЖRRE]:ЪMOMЎRXVɾGч˜RKMϲRZɧXš˜RK
чТRKZЪMGϴYXVɾGGжE4]XLSRRɱRZMЖGXLESXɨG.732XVɱR
4]XLSRVϴXHДLMВY
0SEHJMPIXк-RXIVRIX
8LɺRKXLšЬRKHоPMЖY.732чšвGPϴ]XкRKYТROLɨG RLš
JMPIMRXIVRIX RɱRGLš˜RKRɧ]WЌFϾXч϶YFЀRKGɨGL
LšЪRKHϺRHS[RPSEHQШXJMPI.732Xк-RXIVRIXZɧWEYчɹ
QЪMTEVWMRKRШMHYRK.732HS[RPSEH
7мHдRKQSHYPI urllib2 чВHS[RPSEHJMPIZɧQSHYPI
json чВIRGSHIHIGSHI.732HEXE:ɴHд
import urllib2
import json
response = urllib2.urlopen('https://api.github.com/
users/voduytuan/repos')
data = json.load(response)
print data
:ɴHдXVɱRWЌXVY]ZϴRчšЬRKHϺR
LXXTWETMKMXLYFGSQYWIVWZSHY]XYERVITSWчВPϴ]HERL
WɨGL6ITSWMXSV]XVɱR+MXLYFGжEQɳRLHšЪMчКRLHϰRK
.7327EYчɹWЌчšвG
4EVWMRK.732(EXE
2ЎYRLšFϰRчɪGɹ.732HEXEHšЪMHϰRKGLYЦMQYРR
TEVWMRKGLYЦMRɧ]XLɧRL(EXEXLɳWмHдRKRLšGɨGLHšЪM
чɩ]
import json
mystring = '{"a":1,"b":2,"c":3,"d":4,"e":5}'
data = json.loads(mystring)
print data
(HiӅn thӍ: {u'a': 1, u'c': 3, u'b': 2, u'e': 5, u'd
': 4})
)RGSHMRK.732(EXE
2ЎYRLšFϰRчɪGɹQШXFMЎRZɧQYРRIRGSHIXLɧRL.732
WXVMRKXLɳGɹXLВHɽRKXLISGɨGLWEY
import json
mydata = {
'name': 'John',
'age': 10
}
jsonstring = json.dumps(mydata)
print jsonstring
(hiӅn thӍ: {"age": 10, "name": "John"})
'Lš˜RK<мPʁJMPI<10
8VSRKTL϶RRɧ]GLɾRKXEWЌTEVWMRKRШMHYRK<10XLɧRL
HоPMЖYчВ\мPʁɇВ\мPʁ<10XEWЌWмHдRKXLšZMЖR
&IEYXMJYPWSYTɇɩ]PɧQШXXLšZMЖRKMɾTZMЖGXVMВROLEM
ZMЖGTEVWMRKLXQP\QPчšвGRLERLGLɹRKZɧXMЖRPвM
'ɧMчІX&IEYXMJYPWSYT
&ϰRGɹXLВXLEQOLϲSLšЪRKHϺRGɨGLGɧMчІXXϰM[IFWMXI
LXXT[[[GVYQQ]GSQWSJX[EVI&IEYXMJYP7SYTFWHSGMRW
FIEYXMJYPWSYT
8VɱR1EG37GɹXLВGɧMFЀRK pip RLšWEY
$ sudo pip install beautifulsoup4
'ɧMчІX lxml TEVWIV
ɇВTEVWMRK xml XкFIEYXMJYPWSYTXESWмHдRKFШTEVWIV
\QPGɹXɱRPɧ lxml <IQLšЪRKHϺRGɧMчІXXϰM
LXXT[[[GVYQQ]GSQWSJX[EVI&IEYXMJYP7SYTFWHSGMRW
ETEVWIV
8VɱR1EG37GɹXLВGɧMFЀRK pip RLšWEY
sudo pip install lxml
:ɴHдZАTEVWMRK<10
'LSZɴHдWEY
from bs4 import BeautifulSoup as Soup
note = '''
<?xml version="1.0" encoding="UTF-8"?>
<breakfast_menu>
<food>
<name>Belgian Waffles</name>
<price>$5.95</price>
<description>Two of our famous Belgian Waff
les with plenty of real maple syrup</description>
<calories>650</calories>
</food>
<food>
<name>Strawberry Belgian Waffles</name>
<name>Strawberry Belgian Waffles</name>
<price>$7.95</price>
<description>Light Belgian waffles covered
with strawberries and whipped cream</description>
<calories>900</calories>
</food>
</breakfast_menu>
'''
soup = Soup(note, 'xml')
foods = soup.findAll('food')
for x in foods:
print x.find('name').string, ': ', x.price.stri
ng
/LMGLϰ]XLɳWЌLMВRXLКVEQɧRLɳRLRLšWEY
Belgian Waffles : $5.95
Strawberry Belgian Waffles :
$7.95
ɇРMXšвRKXLYШGGPEWW Soup &IEYXMJYP7SYT WЌKMɾTXVY]
\YϴXGɨGXLɧRLTL϶RGжEJMPI\QPRLERLGLɹRKZɧXMЖRPвM
8VSRKZɴHдGɹQШXWРGɨGLXVY]\YϴXчЎRGɨGTL϶RXмRLš
findAll() XVϲZАQϲRKGɨGXLЊGɹXɱRG϶RXɳQ
find() XVϲZАTL϶RXмч϶YXMɱRGɹXɱRG϶RXɳQ
8VY]\YϴXXVрGXMЎTXLɺRKUYEXɱRXLЊRLš
x.price.string
4EVWMRK,810
8š˜RKXрRLš xml &IEYXMJYP7SYTGɹXLВTEVWMRKRШMHYRK
,810XLɺRKUYELɧQOLЮMXϰSZɧGLМR html ЮXLEQWР
XLи
...
soup = Soup(websitehtml, 'html')
'Lš˜RK/ЎXRРM1]750
1]750PɧQШXLЖG˜WЮHоPMЖYUYERLЖTLФFMЎRRLϴXLMЖR
RE]6ϴXRLMАYRKɺRRKоGɹXLВOЎXRРMчЎR1]750Zɧ
4]XLSRGˢRKOLɺRKRKSϰMPЖ
1ІGчКRL4]XLSROLɺRKGɹXLšZMЖRчВOЎXRРMчЎR1]750
WIVZIV8VSRKTL϶RRɧ]чВOЎXRРMчЎR1]7507IVZIVXк
4]XLSRGLɾRKXEWЌWмHдRKQSHYPI MySQLdb
'ɧMчІX1]750HF
'ɧMчІXXLɺRKUYE pip RLšWEY
$ sudo pip install MySQL-python
8LEQOLϲSXLɱQXϰMLXXTWT]TMT]XLSRSVKT]TM1]750
T]XLSR
/LEMFɨSQSHYPI1]750HFPɧGɹXLВWмHдRK
import MySQLdb
8VSRKQШXWРXVšЬRKLвTчɪGɧM1]750HFRLšRKMQTSVX
FɨSPЦMXLMЎYJMPI libmysqlclient.18.dylib 2KY]ɱRRLɩR
GɹXLВPɧHSLMЖRXϰMчšЬRKHϺRчЎRJMPIOLɺRKXТRXϰM8Lм
XϰSW]QPMROLSІGWмHдRKGɩYPЖRLWEYчВXϰSW]QPMROXк
JMPI libmysqlclient.18.dylib чЎRXLšQдG /usr/lib/
$ sudo ln -s /usr/local/mysql/lib/libmysqlclient.18
.dylib /usr/lib/libmysqlclient.18.dylib
/ЎXRРMчЎR1]7507IVZIV
&ϰRG϶RGɹQШX1]750WIVZIVчERKGLϰ]ZɧGLSOЎXRРM
чЎR8VSRKXVšЬRKLвTRɧ]PɧPSGEPLSWXRɱROLɺRKG϶RGϴY
LɳRLчІGFMЖXGLИG϶RGYRKGϴTYWIVREQIZɧTEWW[SVHPɧ
GɹXLВOЎXRРMчЎR1]7507IVZIV
8LрGLMЖRKМMLɧQRLšWEYчВXVϲZАOЎXRРM
import MySQLdb
dbcon = MySQLdb.connect(host = 'localhost', user =
'myusername', passwd = 'mypassword', db = 'mydbname
')
2ЎYOЎXRРMOLɺRKXLɧRLGɺRKXLɳWЌFɨSPЦMZɧRKšRK
GLš˜RKXVɳRL'ɨGLOЎXRРMERXSɧRPɧчšEZɧSXVSRK try
чВFϾXPЦMRLšWEY
import MySQLdb
db = None
try:
db = MySQLdb.connect(host = 'localhost', user =
'root', passwd = 'root', db = 'mysql')
except MySQLdb.Error, e:
print "Error %d: %s" % (e.args[0],e.args[1])
sys.exit(1)
if db:
cur = db.cursor()
cur.execute("SELECT VERSION()")
ver = cur.fetchone()
print "Database version : %s " % ver
/ЎXRРMZЪM charset utf8
1ІGчКRLOЎXRРMчЎR1]750WIVZIVPɧGLEVWIX latin RɱR
OLMPϴ]HоPMЖYYRMGSHIXLɳLMВRXLК8MЎRK:MЖXOLɺRKчɾRK
FϰRG϶RTLϲMGLМRGLEVWIXPɧ utf8 OLMXϰSOЎXRРM'ɾTLɨT
RLšWEY
...
db = MySQLdb.connect(host = 'localhost', user = 'ro
ot', passwd = 'root', db = 'test', charset = 'utf8'
)
5YIV]HоPMЖY
ɇВXVY]ZϴRHоPMЖY GLϰ]GɩYPЖRL750 XLɳWмHдRK cursor
GжE1]750HF:ɴHд
import MySQLdb
db = MySQLdb.connect(host = 'localhost', user = 'ro
ot', passwd = 'root', db = 'mysql');
cursor = db.cursor()
sql = 'SELECT * FROM user'
cursor.execute(sql)
myusers = cursor.fetchall()
:ɴHдHоPMЖYFMЎR myusers Pɧ ((1, 'John'), (2, 'Doe'))
1ІGчКRL cursor WЌXVϲZАQЦMHɸRKHоPMЖYXк1]750
XLISOMВY tuple XиGPɧOLɺRKGɹOI]2ЎYFϰRQYРRXVϲZА
OMВY Dictionary XLɳGɹXLВOLEMFɨS
import MySQLdb
db = MySQLdb.connect(host = 'localhost', user = 'ro
ot', passwd = 'root', db = 'mysql')
cursor = db.cursor(MySQLdb.cursors.DictCursor)
...
*IXGLHоPMЖY
'ɹQШXWРGɨGLчВJIXGLHоPMЖYXLɺRKHдRKXк cursor WEY
OLMчɪ exectute(sql) Pɧ fetchone() Zɧ fetchall() fetchone() GLИJIXGLQШXHɸRKHоPMЖY2ЎYQYРR
JIXGLRLMАYHɸRKHоPMЖYXLɳGɹXLВKМMRLMАYP϶RQЦM
P϶RWЌXVϲZАQШXHɸRKHоPMЖY8РXGLSXVšЬRKLвTXVY]
ZϴRVϴXRLMАYHоPMЖYQШXPɾG2ЎYXVϲZА None XиGPɧ
чɪJIXGLLЎXHоPMЖYXкGɩYXVY]ZϴR
fetchall() JIXGLXSɧRFШHоPMЖYXVY]ZϴRчšвGXк
GɩYXVY]ZϴRZɧXVϲZАQШXXYTPIGLиEGɨGHɸRKHо
PMЖY1ЦMTL϶RXмGжE8YTPIGɹXLВPɧQШX8YTPIOLɨG
LSІGPɧQШX(MGXMSREV]Xɽ]XLISGɧMчІXЮFšЪGPϴ]
GYVWSV <IQTL϶R fetchmany(size) RЀQЮKMоEOMВYJIXGLXVɱRGɹXLВ
UY]чКRLWРPšвRKVS[XVSRKQЦMP϶RJIXGL2ЎYJIXGL
LЎXXLɳXVϲZА8YTPIVЦRK
ɇɹRKOЎXRРM
7EYOLMOЎXRРMZɧXVY]ZϴRXLɳGɹXLВчɹRKOЎXRРMXLISZɴ
HдWEY
import MySQLdb
db = MySQLdb.connect(...)
db.close()
2KSɧMVEFϰRGˢRKRɱRчɹRK cursor OLMOLɺRKGɸRWм
HдRKXLISZɴHд
import MySQLdb
db = MySQLdb.connect(...)
cursor = db.cursor()
cursor.close()
db.close()
4VITEVIH7XEXIQIRX
4VITEVIHWXEXIQIRXPɧOцXLYϼXXLEQWРLɹEGɨGHоPMЖY
XVY]АRZɧSGɩYXVY]ZϴRXLE]ZɳRРMGLYЦMXVрGXMЎTчВ\ɩ]
HрRKQШXGLYЦMXVY]ZϴRHɧM/цXLYϼXRɧ]чšвGɨTHдRK
RLMАYZɧKMɾTXʆRKLMЖYUYϲZɧXɴRLFϲSQϼXGжEGɩYXVY]
ZϴR:ɴHд
...
cur.execute("UPDATE Writers SET Name = %s WHERE Id
= %s", ("John", "4"))
...
1ЦMXLEQWРXVY]ZϴRWЌчšвGXLE]XLЎFЀRK %s ZɧTLš˜RK
XLиG execute() WЌGɹXLEQWРXLиPɧQШX8YTPIGɹKMɨXVК
Xš˜RKиRKZЪMXLиXр\YϴXLMЖRGжEGɨGXLɧRLTL϶R %s
'Lš˜RK/ЎXRРM6IHMW
6IHMWPɧQШXQIQSV]GEGLIWIVZIVLЦXVвTIVWMWXERXHEXE
XLɺRKHдRKRLϴXLMЖRRE]2ШMHYRKGLš˜RKRɧ]WЌLšЪRK
HϺRFϰROЎXRРMчЎRQШX6IHMWWIVZIV чɪчšвGGɧMчІX
WЄR XLɺRKUYEXLšZMЖRVIHMWT]
'ɧMчІX
'ɹXLВ\IQXLɱQZАLšЪRKHϺRGɧMчІXXLšZMЖRRɧ]XϰM
LXXTWKMXLYFGSQERH]QGGYVH]VIHMWT]
ɇ˜RKMϲRGɧMXLɺRKUYE pip Pɧ
$ sudo pip install redis
/ЎXRРMчЎR6IHMW
ɇВOЎXRРMчЎR6IHMWWIVZIVXLɳFϰRGɹXLВ\IQZɴHдWEY
import redis
r = redis.StrictRedis(host='localhost', port=6379,
db=0)
8LрGLMЖRPЖRL
8LрGLMЖRGɨGPЖRLFɳRLXLšЬRKXVɱRчРMXšвRKVIHMW:ɴHд
import redis
r = redis.StrictRedis(...)
r.set('foo', 'bar')
print r.get('foo')
(HiӅn thӍ 'bar')
4MTIPMRI
4MTIPMRIPɧOцXLYϼXчšвGHɽRKXVSRKXVšЬRKLвTFϰRQYРR
XʆRKTIVJSVQERGIFЮMKШTRLMАYPЖRLZɧSQШXVIUYIWXXLE]
ZɳQЦMPЖRLPɧQШXVIUYIWXRLšXLɺRKXLšЬRK<IQZɴHд
WEYчВLMВYGɨGLWмHдRKTMTIPMRIFЀRK redis-py import redis
r = redis.StrictRedis(...)
r.set('foo', 'bar')
pipe = r.pipeline()
pipe.set('a', 1)
pipe.set('b', 2)
pipe.set('c', 3)
pipe.get('foo')
pipe.execute()
7EYOLMKМMTLš˜RKXLиG execute() XLɳWЌXVϲZА0MWXXš˜RK
иRKZЪMGɨGOЎXUYϲGжEXкRKPЖRL:ɴHдOЎXUYϲXкчSϰR
GSHIXVɱR
[True, True, True, 'bar']
'Lš˜RK/ЎXRРM
1IQGEGLIH
1IQGEGLIHPɧQШXQIQSV]GEGLIWIVZIVXLɺRKHдRKLMЖR
RE]2ШMHYRKGLš˜RKRɧ]WЌLšЪRKHϺRFϰROЎXRРMчЎR
QШX1IQGEGLIHWIVZIV чɪчšвGGɧMчІXWЄR XLɺRKUYE
XLšZMЖR pylibmc 'ɧMчІX
'ɹXLВ\IQXLɱQZАLšЪRKHϺRGɧMчІXXLšZMЖRRɧ]XϰM
LXXTWIRHETEXGLWITVSNIGXWT]PMFQGMRWXEPPLXQP
ɇ˜RKMϲRGɧMXLɺRKUYE pip Pɧ
$ sudo pip install pylibmc
/ЎXRРMчЎR1IQGEGLIH7IVZIV
ɇВOЎXRРMчЎR1IQGEGLIHWIVZIVXLɳFϰRGɹXLВ\IQZɴHд
WEY
import pylibmc
mc = pylibmc.Client(["127.0.0.1"], binary=True, beh
aviors={"tcp_nodelay": True, "ketama": True})
8LрGLMЖRPЖRL
8LрGLMЖRGɨGPЖRLFɳRLXLšЬRKXVɱRчРMXšвRKQIQGEGLI
:ɴHд
import pylibmc
mc = pylibmc.Client(...)
mc.set('foo', 'bar')
print mc.get('foo')
(HiӅn thӍ 'bar')
'Lš˜RK/ЎXRРM6EFFMX15
6EFFMX15PɧQШXTL϶RQАQGLSTLɰT\ɩ]HрRK1IWWEKI
5YIYIXLISTVSXSGSP%154ZɧOLɨXLɺRKHдRKXVɱRXLЎ
KMЪMɇВOЎXRРMчЎR6EFFMX15XVɱR4]XLSRXEWЌWмHдRK
XLšZMЖR pika 'ɧMчІX
'ɹXLВ\IQXLɱQZАLšЪRKHϺRGɧMчІXXLšZMЖRRɧ]XϰM
LXXTWTMOEVIEHXLIHSGWSVKIR
ɇ˜RKMϲRGɧMXLɺRKUYE pip Pɧ
$ sudo pip install pika
+ЮMQШXQIWWEKIчЎR7IVZIV
4VSZMHIV
:ɴHдчВKЮMQШXQIWWEKIчЎRWIVZIV
import pika
connection = pika.BlockingConnection(pika.Connectio
nParameters('localhost'))
channel = connection.channel()
channel.queue_declare(queue='hello')
channel.basic_publish(exchange='', routing_key='hel
lo', body='Hello World!')
print " [x] Sent 'Hello World!'"
connection.close()
ɇВKЮMQШXQIWWEKIGLɾRKXEG϶ROЎXRРMчЎRWIVZIVZɧ
OLEMFɨSQШXGLERRIPЮчɩ]PɧGLERRIPGɹXɱRPɧ hello 7EYOLMOLEMFɨSGLERRIPXESXMЎRLɧRLKЮMQIWWEKIGɹ
RШMHYRK Hello World! XLɺRKUYEGLERRIPRɧ]OɯQXLIS
OLEMFɨS routing_key Pɧ hello 6SYXMRK/I]WЌKMɾTчMАY
LšЪRKQIWWEKIRɧ]чЎRчɾRKGɨG[SVOIVчšвGOLEMFɨS
RLϼRQIWWEKIXLISVSYXMRKOI] 'SRWYQIV
2LϼRQIWWEKI'SRWYQIV
ЭFšЪGXVšЪGXEчɪXϰSQШXQIWWEKIPɱRUYIYIЭFšЪG
Rɧ]XEWЌOLEMFɨSQШX[SVOIV\мPʁGɨGQIWWEKIRLϼR
чšвGXкGLERRIP hello import pika
connection = pika.BlockingConnection(pika.Connectio
nParameters(host='localhost'))
channel = connection.channel()
channel.queue_declare(queue='hello')
print ' [*] Waiting for messages. To exit press CTR
L+C'
def callback(ch, method, properties, body):
print " [x] Received %r" % (body,)
channel.basic_consume(callback, queue='hello', no_a
ck=True)
channel.start_consuming()
ɇSϰRGSHIRɧ]GˢRKGɹTL϶ROLEMFɨS connection channel 8Y]RLMɱRZɳPɧGSRWYQIVRɱRWЌWмHдRK
TLš˜RKXLиG basic_consume чВPϾRKRKLIXVɱRUYIYI
hello OLMGɹQIWWEKIчЎRWЌKМMLɧQ callback() чВ\м
Pʁ8VSRKXVšЬRKLвTZɴHдRɧ]XLɳGEPPFEGOGLИч˜RKMϲRPɧ
LMВRXLКGLYЦMXLɺRKFɨSчɪRLϼRчšвGQIWWEKI
8ɳQLMВYXLɱQZА6EFFMX15Zɧ4MOE
2ШMHYRKGLš˜RKRɧ]OLɺRKGɹʁчКRLKMЪMXLMЖYXϴXGϲOLɨM
RMЖQGжE%154GˢRKRLš6EFFMX15QɧGLж]ЎYKMЪMXLMЖY
XLšZMЖR pika чВPɧQZMЖGZЪM6EFFMX15&ϰRGɹXLВXMЎT
XдGXLISHɻMGɨGLšЪRKHϺRZАOLɨMRMЖQGжE6EFFMX15Zɧ
4MOEXϰM[IFWMXIGLɴRLXLиGGжE6EFFMX15
LXXTW[[[VEFFMXQUGSQXYXSVMEPWXYXSVMEPSRI
T]XLSRLXQP
'Lš˜RK6IWXJYPGPMIRX
2Kɧ]RE]ZЪMWрTLSRKTLɾGжEGɨGиRKHдRKZɧRLYG϶Y
OЎXRРMRKɧ]GɧRKPЪRXLɳ6IWXJYPPɧQШXXVSRKRLоRKQɺ
LɳRL[IFWIVZMGIчšвGRLMАYGɺRKX]WмHдRK(SчɹZMЖG
GɹXLВOЎXRРMчЎRGɨG6IWXJYP[IFWIVZMGIPɧQШXOцRʆRK
G϶RXLMЎXGLSGɨGPϼTXVɳRLZMɱR
'Lš˜RKRɧ]WЌKMЪMXLMЖYZАQШXXVSRKRLоRKXLšZMЖRRФM
XMЎRKRLϴXXVSRK4]XLSRчВPɧQZMЖGZЪMGɨG6IWXJYP[IF
WIVZMGIчɹPɧ requests ;IFWMXIGLɴRLXLиGZɧGɨGQɺXϲч϶]чжчАYчšвGчАGϼT
XϰMLXXT[[[T]XLSRVIUYIWXWSVK
'ɧMчІX
'ɧMчІXRLERLGLɹRKXLɺRKUYE pip RLšWEY
$ sudo pip install requests
6IUYIWX
,ЦXVвWЄRGɨGTLš˜RKXLиGXš˜RKиRKGLS,XXTVIUYIWX
RLš+)84378498()0)8)ŷ
import requests
r = requests.get('https://api.github.com/events')
r = requests.post("http://httpbin.org/post")
r = requests.put("http://httpbin.org/put")
r = requests.delete("http://httpbin.org/delete")
r = requests.head("http://httpbin.org/get")
r = requests.options("http://httpbin.org/get")
+)85YIV]WXVMRK
ɇРMZЪMGɨGVIUYIWX GET GɹXLВXVY]АRXLEQWРчšЬRKHϺR
XLɺRKUYEXLEQWР params OLMKМMTLš˜RKXLиG get() :ɴ
Hд
import requests
payload = {'key1': 'value1', 'key2': 'value2'}
r = requests.get("http://httpbin.org/get", params =
payload)
print(r.url)
(HiӅn thӍ: http://httpbin.org/get?key2=value2&key1=
value1)
6IUYIWX&SH]
8VSRKL϶YLЎXXVšЬRKLвTGɨGVIUYIWXRLš4378498
XLš˜RKG϶RXVY]АRHоPMЖYOLMVIUYIWXGɹXLВWмHдRKXLEQ
WР data чВXVY]АRHEXEPɱROɯQVIUYIWX:ɴHд
import requests
payload = {'key1': 'value1', 'key2': 'value2'}
r = requests.post("http://httpbin.org/post", data =
payload)
9TPSEHJMPI
'ɹXLВKЮMXLɱQXLEQWР files чВYTPSEHJMPIOɯQXLIS
VIUYIWX:ɴHд
import requests
url = 'http://httpbin.org/post'
files = {'file': open('report.xls', 'rb')}
r = requests.post(url, files=files)
6IWTSRWI
7EYOLMKМMGɨGTLš˜RKXLиGXš˜RKиRKчВVIUYIWXFϰRWЌ
GɹчРMXšвRKXLYШGGPEWW Response ɇРMXšвRKRɧ]GɹQШX
WРXLɺRKXMRRLšWEY
status_code ,8847XEXYWWIVZIVXVϲZА
headers 'ɨGXLɺRKXMRLIEHIVQɧWIVZIVXVϲZАHšЪM
HϰRK(MGXMSREV]
cookies 2ЎYWIVZIVGɹXVϲZАGSSOMIXLɳGɹXLВWм
HдRKXLYШGXɴRLRɧ]чВPϴ]GɨGGSSOMI
text 8VϲZАRШMHYRKVIWTSRWI
8LEQOLϲSZАGɨGXɴRLRʆRKOLɨGGжEXLšZMЖR requests
XϰM[IFWMXIGLɴRLXLиGLXXTHSGWT]XLSRVIUYIWXWSVK
'Lš˜RK+ЮMIQEMPZЪM7184
7184PɧKMESXLиGKЮMQEMPXLɺRKHдRKLMЖRRE]4]XLSRLЦ
XVвQІGчКRLXLšZMЖR smtplib HɽRKчВOЎXRРMчЎRQШX
71847IVZIVZɧKЮMIQEMP8Y]RLMɱRZMЖGWмHдRKXLš
ZMЖRRɧ]WЌKɩ]OLɹOLʆRGLSZMЖGчКRLHϰRKZɧWмHдRK
RɱRGLɾRKXEWЌWмHдRKXLšZMЖR sender PɧQШXXLšZMЖR
KMɾTчКRLHϰRKZɧKЮMIQEMPч˜RKMϲRL˜R
'ɧMчІX sender
'ɧMчІXXк pip RLšWEY
$ sudo pip install sender
+ЮMIQEMPч˜RKMϲR
ɇВKЮMIQEMPZЪM sender FϰRG϶RGɹXɧMOLSϲRZɧQШXWР
XLɺRKXMRGжE71847IVZIVXVšЪGOLMKЮM:ɴHдчSϰRGSHI
чВKЮMIQEMPXк71847IVZIVGжE%QE^SR
from sender import Mail, Message
mail = Mail(
"smtp.gmail.com",
port = 465,
username = "example@gmail.com",
password = "yourpassword",
use_tls = False,
use_ssl = True,
debug_level = False
)
msg = Message("msg subject")
msg.fromaddr = ("Vo Duy Tuan", "example@gmail.com")
msg.to = "destuser@gmail.com"
msg.body = "this is a msg plain text body"
msg.html = "<b>this is a msg text body</b>"
msg.reply_to = "example@gmail.com"
msg.charset = "utf-8"
msg.extra_headers = {}
msg.mail_options = []
msg.rcpt_options = []
# Send message
mail.send(msg)
+ЮMIQEMPGɹчɴRLOɯQJMPI
&ϰRG϶RWмHдRKXLɱQGPEWW%XXEGLQIRXчВXϰS
EXXEGLQIRX
from sender import Mail, Message, Attachment
mail = Main(...)
msg = Message(..)
...
# Open attached file and create Attachment object
with open("photo01.jpg") as f:
file01 = Attachment("photo01.jpg", "image/jpeg"
, f.read())
msg.attach(file01)
# Send message
mail.send(msg)
8ɳQLMВYXLɱQ
&ϰRGɹXLВXɳQLMВYXLɱQZАXLšZMЖR sender XϰM[IFWMXI
GLɴRLXLиGXϰMчКEGLИLXXTWIRHIVVIEHXLIHSGWSVK
'Lš˜RK7SGOIX
TVSKVEQQMRK
'Lš˜RKRɧ]WЌZɴHдZMЖG\ɩ]HрRKQШXQɺMXVšЬRK'PMIRX
7IVZIVWмHдRK7SGOIX7IVZIVWЌPϾRKRKLIXVɱRQШXTSVX
ZɧOLMGPMIRXOЎXRРMZɧSWЌXLɺRKFɨSLMВRXLК
XLɺRKXMRGжEGPMIRX -4Zɧ4SVX ZɧKЮMQIWWEKI\YРRK
GLSGPMIRX
7IVZIVWMHI
8ϰSJMPI server.py ZЪMRШMHYRKFɱRHšЪM
import socket
s = socket.socket()
host = socket.gethostname()
port = 12345
s.bind((host, port))
s.listen(5)
while True:
c, addr = s.accept()
print 'Got connection from', addr
c.send('Thank you for connecting')
c.close()
ɇSϰRGSHIXVɱROLMXLрGXLMWЌGLϰ]ZɧPϾRKRKLIЮTSVX
8'41ЦMOLMGɹQШXOЎXRРMXкGPMIRXWЌLMЖRVE
XLɺRKFɨSOЎXRРMXк-4Zɧ4SVXRɧSZɴHд Got connection
from Got connection from ('192.168.1.104', 60018) 7EYчɹKЮMXVϲQШXQIWWEKIZЪMRШMHYRK Thank you for
connecting ZАGLSGPMIRX7EYчɹчɹRKOЎXRРMZЪMGPMIRX
'PMIRXWMHI
8ϰSJMPI client.py ZЪMRШMHYRKFɱRHšЪM
import socket
s = socket.socket()
host = '127.0.0.1'
port = 12345
s.connect((host, port))
print s.recv(1024)
s.close
ɇSϰRGSHIXVɱRWЌOЎXRРMчЎRQШXWSGOIXWIVZIVXLɺRK
UYELSWXREQIPϴ]чšвGXкTLš˜RKXLиG
socket.gethostname() ZɧTSVX7EYOLMOЎXRРMWЌ
LMВRXLКVEOЎXUYϲXVϲZАXкWIVZIV7EYчɹXLɳчɹRKOЎXRРM
8ɨGKMϲ
8ɱR:ɻ(Y]8YϴR
)QEMPXYERQEWXIV$KQEMPGSQ
*EGIFSSOLXXTW[[[JEGIFSSOGSQZSHY]XYER
Download