Python rat la co ban...Chương 1. Hello world Python là một ngôn ngữ phiên dịch...
Transcript of Python rat la co ban...Chương 1. Hello world Python là một ngôn ngữ phiên dịch...
GiớithiệuHiệnnay,Pythonlàmộttrongnhữngngônngữlậptrìnhđangđượcchúýbởitínhđadạngvềứngdụng,thưviệnphongphúvàcộngđồngđôngđảo.
ĐãlàmviệcvớiPHP10năm,vàcónhữngtácvụmàPHPkhómàthựchiệntốiưuđược,khiếnmìnhphảitiếpcậnvớiPythontronggiaiđoạnnày.
CuốnsáchnhỏnàyđượcviếttrongquátrìnhmìnhbắtđầuhọcPythonvàgiảiquyếtcácbàitoáncơbảntheonhucầucủamình.
HyvọngnhữngghichépcủamìnhcũngsẽgiúpíchchonhữngaiđangquantâmđếnviệcứngdụngPythonvàocôngviệcvàxửlýhiệntại.
Mụclục
Sáchđượcchialàm15chương,mỗichươngsẽtrìnhbày1khíacạnhcủaPythonmàmìnhsẽgặpphảivàsẽhữuích
khibiếtcáckiếnthứcnàytrongviệcápdụngPythonvàocôngviệctrongtươnglai.
1. Helloworld
2. Cúpháp
3. Phânchiamodule
4. Class
5. Thaotáctrêntậptin
6. Xửlýhìnhảnh
7. XửlýfileJSON
8. XửlýfileXML
9. KếtnốiMySQL
10. KếtnốiRedis
11. KếtnốiMemcached
12. KếtnốiRabbitMQ
13. RestfulClient
14. GởiemailvớiSMTP
15. SocketProgramming
Chương1.HelloworldPythonlàmộtngônngữphiêndịch(InterpreterLanguage),tứclàkhôngcầnbuildthànhfilethựcthimàchạytrựctiếpnhưPHP.
HiệntạiPythoncó2nhánhchínhlà2.xvà3.x.Ởnhánh2.xđãdừngpháttriểnvàđangđứngởphiênbản2.7.NhánhPython3.xthìvẫnđangđượctiếptụcpháttriển.
WebsitechínhthứccủaPython:www.python.org
Càiđặt
PythonhỗtrợhầuhếtcácnềntảngvàrấtdễtìmthấysẵntrênmộtsốhệđiềuhànhnhưMacOS…
ĐểbiếtlàhệthốngcủabạnđãcàiPythonchưa,cóthểvàomànhìnhcommandlinevàgõ:
$python--version
Nếuđãcàiđặtpythonthìsẽhiểnthịthôngtinphiênbảnpython.NếubáolỗithìđồngnghĩavớibạnchưacàiđặtPython.
CóthểthamkhảocáchcàiđặtPythontại:https://www.python.org/downloads/
Côngcụpháttriển
Chỉcầndùngmộttexteditorlàbạncóthểviếtđượccodepythonhoặccóthểdùngcáccôngcụcaocấphơn(IDE)nhưAptana,PyCharm…CácIDEthườnghỗtrợthêmquátrìnhphântíchcúphápdònglệnh,debug…trongphạmvicuốnsáchnhỏnàythìmìnhhướngđếncáchthựcthipythonbằngdònglệnh.
Helloworld
Tạomộtfilecótênlà helloworld.py vàcónộidungnhưsau:
print'Helloworld'
print làlệnhcơbảnnhấtđểxuấtmộtbiếnra(thườnglàmànhình)
Sauđó,vàomànhìnhcommandline,dichuyểnđếnthưmụcchứafilenàyvàgõ.
$pythonhelloworld.py
Nếuthấyxuấthiệndòngchữ Helloworld tứclàbạnđãhoànthànhviệcviếtứngdụngpythonđầutiên.
Chương2.Cúpháp2.1.Biếnsố
Khaibáobiếnbằngmộtcâulệnhgán.
a=1
bạncóthểgánnhiềuloạigiátrị(số,chuỗi)chomộtbiến.
a=1
a='HelloWorld'
a=[1,2,3]
a=[1.2,'Hello','W',2]
2.2.Toántửsốhọc
Pythoncũnghỗtrợmộtsốtoántửtoánhọcthôngdụngnhư:
+ phépcộng
- phéptrừ
* phépnhân
/ phépchia
% phépchialấydư(modulo)
2.3.BooleanvàToántửlogic
Giátrịđúngvàsaitươngứnglà True và False .
not đểđảogiátrị.
and phéptínhlogicvà(AND)
or phéptínhlogichoặc(OR)
Mộtsốphépsosánhthôngthườngnhư < (béhơn), <= (béhơnhoặcbằng), > (lớnhơn), >= (lớnhơnhoặcbằng), ==(bằng), != (khác)đểsosánh2giátrị.
Hỗtrợdạngsosánhképnhư:
x=2
1<x<3#True
10<x<20#False
3>x<=2#True
2==x<4#True
Toántửkiểmtraphầntửtrongmộttậphợp:- in kiểmtracótồntại- notin kiểmkhôngtồntại
'good'in'thisisagreateexample'#F
alse
'good'notin'thisisagreateexample'#True
2.4.Cấutrúcđiềukhiển
Pythonhỗtrợmộtsốcấutrúcđiềukhiểnthôngdụng.Hầuhếtcáccấutrúcđiềukhiểnđềudựavàothụtđầudòng(indention)đểtạothànhmộtblockxửlý,thayvìsửdụng{…} nhưcácngônngữkhác(PHP,Javascript)###2.4.1.If…elif…else
ifcondition1:
indentedStatementBlockForTrueCondition1
elifcondition2:
indentedStatementBlockForFirstTrueCondition2
elifcondition3:
indentedStatementBlockForFirstTrueCondition3
elifcondition4:
indentedStatementBlockForFirstTrueCondition4
else:
indentedStatementBlockForEachConditionFalse
2.4.2.Switch…case
Pythonkhôngcócấutrúc switch…case
2.4.3.For…in
foriterating_varinsequence:
statements(s)
Vídụ:
forletterin'Python':#FirstExample
print'CurrentLetter:',letter
fruits=['banana','apple','mango']
forfruitinfruits:#SecondExample
print'Currentfruit:',fruit
print"Goodbye!"
Kếtquảhiểnthịcủavídụtrên:
CurrentLetter:P
CurrentLetter:y
CurrentLetter:t
CurrentLetter:h
CurrentLetter:o
CurrentLetter:n
Currentfruit:banana
Currentfruit:apple
Currentfruit:mango
Goodbye!
2.4.4.While
whileexpression:
statement(s)
Vídụ:
count=0
while(count<9):
print'Thecountis:',count
count=count+1
print"Goodbye!"
Kếtquảhiểnthịcủavídụtrên:
Thecountis:0
Thecountis:1
Thecountis:2
Thecountis:3
Thecountis:4
Thecountis:5
Thecountis:6
Thecountis:7
Thecountis:8
Goodbye!
2.5.Hàm
Khaibáohàmtheocúpháp:
deffunctionname(param,param2,..):
statements(s)
HàmnếukhôngtrảdữliệuthìmặcđịnhsẽtrảvềgiátrịNone
Vídụkhaibáohàmtínhvàtrảvềgiátrịtổngcủa2thamsốđầuvào:
defsum(a,b):
return(a+b)
Cáchgọihàm:
sum(1,2)
(trảvềgiátrịlà3)
Hàmcóhỗtrợgiátrịmặcđịnhchothamsốkhikhôngtruyềnvào.Vídụhàmsau:
defplus(c,d=10):
return(c+d)
Nếugọihàmtrênnhưsau:
plus(2)
(kếtquảtrảvềlà12)
MộtkhácbiệttrongcáchgọihàmcủaPythonsovớiPHPlàchúngtacóthểthayđổithứtựthamsốtruyềnvàobằng
cáchđặttênthamsốkhigọihàm.Vídụtacóthểgọihàmsum(a,b) ởvídụtrênbằngcáchtruyềnthamsố b trước anhưsau:
sum(b=1,a=10)
2.6.Xửlýchuỗi
Mộtchuỗicóthểkhaibáobằngdấunháyđôi " hoặcđơn' .Vídụcácchuỗisau:
str1="Hello"
str2='world'
Cóthểtruyxuấttừngkýtựtrongmộtchuỗitheohìnhthứcindex,vídụ: str1[0] , str1[1]…Cóthểsửdụng3dấunháy(đôihoặcđơn)đểkhaibáochuỗitrênnhiềudòng.Vídụ:
paragraph="""Thisisline1
Thisisline2
Thisisline3"""
2.6.1.Nốichuỗi
Cóthểtạomộtchuỗidàitừviệcnốicácchuỗilạitheocúpháp:
str=str1+""+str2
2.6.2.Tríchxuấtchuỗicon
Cóthểtạocácchuỗiconthôngquatoántửlấykhoản[start:end] (range).Mặcđịnh start làtừvịtríđầuchuỗi( 0 )và end làđếnvịtrícuốichuỗi.Vídụ:
str='Helloworld'
printstr[0:4]
(Hiểnthị"Hell")
printstr[:4]
(Hiểnthị"Hell")
printstr[-3:]
(Hiểnthị"rld")
printstr[6:-3]
(Hiểnthị"wo")
2.6.3.Lấyđộdàicủachuỗi
Sửdụnghàm len(...) đểtrảvềđộdàicủachuỗi.Vídụ:
count=len("Helloworld")
(countcógiátrị11)
2.6.4.Tìm&thaythếnộidung
Cóthểtìmvàthaythếtrongchuỗibằngcáchgọiphương
thức replace(search,replace[,max]) củamộtchuỗi.Vídụ:
str='Helloworld'
newstr=str.replace('Hello','Bye')
printnewstr
(Sẽhiểnthịchuỗi"Byeworld"trênmànhình)
2.6.5.Tìmvịtríchuỗicon
Cóthểtìmvịtrícủamộtchuỗicontrongchuỗilớnbằngcáchgọiphươngthức find(str,beg=0end=len(string)) .Bắtđầulàvịtrí 0 ,nếukhôngtìmrathìtrảvề -1 .Vídụ:
str='Helloworld'
printstr.find('world')
(hiểnthị6)
printstr.find('Bye');
(hiểnthị-1)
Hàm find() sẽtìmtheothứtựtừtráiquaphảicủachuỗi,
tứclàtừlầnxuấthiệnđầutiên.Cóthểdùnghàm rfind()đểtìmtheovịtrítừcuốichuỗivềphíatrước.
2.6.6.Táchchuỗi
Cóthểtáchchuỗidựatheomộtchuỗidelimeterbằngcáchgọiphươngthức split(str="",num=string.count(str)) .Vídụ:
str='Helloworld'
printstr.split('')
(Trảvềmộtmảngcó2phầntửlà2chuỗi"Hello"và
"world")
Cóthểsửdụnghàm splitlines() đểtáchchuỗitheotừnghàngvàloạibỏkýtựNEWLINE.
2.6.7.Trimkýtựkhoẳngtrắng
Cóthểloạibỏcáckýtự(mặcđịnhlàkýtựkhoảngtrắng)trướcvàsaumộtchuỗi,bằngcáchgọicácphươngthứcsau:
strip([chars]) :loạibỏtrướcvàsauchuỗi
lstrip([chars]) :loạibỏphíatrướcchuỗi
rstrip([chars]) :loạibỏphíasauchuỗi
2.6.8.Mộtsốhàmxửlýchuỗi
isnumeric() :Kiểmtramộtchuỗicóphảilàchuỗisố
lower() :Chuyểnchuỗihếtthànhchữthường
upper() :ChuyểnchuỗihếtthànhchữHOA
2.7.List
ListtrongPythonlàcấutrúcmảngvàcácphầntửcóindexcóthứtự.KhôngnhưPHP,keycủamộtmảngcóthểvừalàsố,vừalàchuỗi(associatedarray).
TrongPython,muốntạomộtmảngcókeylàchuỗithìsẽsửdụngcấutrúcDictionary(phầntiếptiếp).Trongphầnnày,chúngtasẽnóiđếnList.MộtListđượckhaibáonhưmảngtrongJSON.Sửdụng [..] đểkhaibáomộtmảng.Vídụ:
numbers=[1,2,3,4,5]
names=['Marry','Peter']
Cóthểtruyxuấttừngphầntửcủamảngbằngindex,phầntửđầutiêncóthứtựlà 0 .Vídụ:
printnumbers[0]
(Hiểnthị1)
printnumbers[-3]
(Hiểnthị3)
printnames[1]
(Hiểnthị'Peter')
Đểbiếtđượcsốlượngphầntửcủa1List,cóthểsửdụnghàm len(array) đểlấysốlượngphầntửcủamảngthamsốtruyềnvào.
2.7.1.Kiểmtrasựtồntạicủamộtphầntử
2.7.1.1.KiểmtratheoIndex
Trongnhiềutrườnghợpbạnmuốntruyxuấtmộtphầntửbấtkỳ(dựavàoindex)củamảngthìnếutruyxuấtđếnmộtphầntửkhôngtồntạithìứngdụngsẽbáolỗi.Dođó,trướckhitruyxuấtmộtphầntử,bạncầnkiểmtraxemphầntửnàyđãtồntạihaychưa.Hiệntạipythonkhônghỗtrợhàmnàođểkiểmtrasựtồntạicủamộtphầntửtrongmảng.
Có2cáchthườngthấyđểkiểmtrađólà“Lookbeforeyouleap”(LBYL)và“Easiertoaskforgivenessthanpermission”(EAFP).
Vídụvề“Lookbeforeyouleap(LBYL)”:
ifindex<len(array):
array[index]
else:
#handlethis
Vídụvề“Easiertoaskforgivenessthanpermission”(EAFP):
try:
array[index]
exceptIndexError:
#handlethis
2.7.1.2.Kiểmtratheogiátrị
Đểkiểmtramộtgiátrịcótồntại/khôngtồntạitrongmảnghaykhôngthìcóthểsửdụngtoántử in / notin .Vídụ:
mylist=['a','b','c']
print'a'inmylist
(HiểnthịTrue)
print'b'notinmylist
(HiểnthịFalse)
2.7.2.Tríchxuấtmảngcon
Tươngtựnhưchuỗi,tóthểtạocácmảngconthôngquatoántửlấykhoản [start:end] (range).Mặcđịnh start là
từvịtríđầuchuỗi( 0 )và end làđếnvịtrícuốichuỗi.Vídụ:
numbers=['a','b','c','d']
printnumbers[:2]
(Hiểnthị['a','b'])
printnumbers[-2:]
(Hiểnthị['c','d'])
2.7.3.Xóaphầntửcủamảng
Cóthểxóamộtphầntửthôngquatoántử del .Thứtựcủacácphầntửsẽdịchchuyểntùyvàovịtrícủaphầntửbịxóa.Vídụ:
numbers=[1,2,3,4,5]
delnumbers[0]
printnumbers
(Hiểnthị[2,3,4,5])
Bạncóthểxóamộtkhoảndựavàotoántửlấykhoản[start:end] .Vídụ:
numbers=[1,2,3,4,5,6,7]
delnumbers[2:4]
printnumbers
(Hiểnthị[1,2,5,6,7])
2.7.4.Nối2mảng
Bạncóthểsửdụngtoántử + đểnốigiátrịcủa2mảngvàtạoramộtmảnglớncósốlượngphầntửlàtổngsốlượngphầntửcủa2mảngcon.Vídụ:
a=[1,2]
b=[1,3]
printa+b
(Hiểnthị[1,2,1,3])
2.7.5.Thêmphầntửvàomảng
Nếubạnmuốnthêmphầntửvàomộtmảngđãtồntại,hãydùngphươngthức list.append(newvalue) đểthêmphầntửcógiátrị newvalue vàocuốimảng list .Vídụ:
numbers=[1,2,3]
numbers.append(4)
printnumbers
(Hiểnthị[1,2,3,4]
2.7.6.Lấyphầntửcuốimảng
Nếumuốnlấyphầntửcuốicùngcủamảngrakhỏimảng,cóthểsửdụngphươngthức list.pop() ,sẽtrảvềgiátrịcủaphầntửcuốicùngvàmảngbâygiờsẽkhôngcònphầntửnày.
numbers=[1,2,3]
mynumber=numbers.pop()
printmynumber
(Hiểnthị3)
printnumbers
(Hiểnthị[1,2])
2.7.7.Tìmmộtgiátrịtrongmảng
Nếubạnmuốntìmvịtrí(index)củamộtgiátrịtrongmột
mảng,cóthểdùngphươngthức list.index(obj) .Nếutìmthấysẽtrảvềindexcủaphầntửđầutiêntìmthấy.NếukhôngtìmthấysẽquăngException.Vídụ:
aList=[123,'xyz','zara','abc'];
print"Indexforxyz:",aList.index('xyz')
print"Indexforzara:",aList.index('zara')
Khichạysẽhiểnthịkếtquả:
Indexforxyz:1
Indexforzara:2
2.7.8.Đảongượcgiátrịcủamảng
Đểđảongượcthứtựcácgiátrịcủamộtmảng,sửdụngphươngthức list.reverse() .Phươngthứcnàykhôngtrảvềkếtquảmàthayđổitrựctiếpmảng list .Vídụ:
numbers=[1,2,3,4]
numbers.reverse()
printnumbers
(Hiểnthị[4,3,2,1])
2.7.9.Sắpxếpgiátrịcácphầntử
Đểsắpxếpthứtựcủagiátrịtrongmảng,sửdụngphươngthức list.sort([func]) đểsắpxếp.Nếuthamsốđầuvàolàhàm func khôngtruyềnvàothìmặcđịnhlàsắpxếptheogiátrịtăngdần.Phươngthứcnàykhôngtrảvềkếtquảmàthayđổitrựctiếpmảng list .Vídụ:
aList=[123,'xyz','zara','abc','xyz']
aList.sort()
print"List:",aList
(HiểnthịList:[123,'abc','xyz','xyz','zara'
])
Cáchtriểnkhaihàmcompare func() cũnggiốngnhưhàmusorttrongPHP.Hàmtrảvềcácgiátrị 0 , -1 và 1 .
2.8.Tuple
Tuplecũnglàmộtcấutrúcmảng,tươngtựnhưcấutrúcList.MộtsốđiểmkhácnhaucơbảnlàkhaibáoTuplesửdụngcặpdấungoặc (...) vàmộttupleđãđượckhaibáorồithìkhôngthayđổiđượcgiátrị(immutable)vàkhônghỗtrợcácphươngthứcnhư append() , pop()…Vídụ:
mytuple=('x','y','z')
printmytuple
(Hiểnthị('x','y','z'))
VẫnhỗtrợcáccáchđểtruyxuấtphầntửgiốngListnhưlàtruyxuấttheoindex,range,tìmkiếm…
2.9.Dictionary
Dictionarycũnglàmộtcấutrúcmảng,nhưngcácphầntửbaogồmkeyvàvalue.NếubạncóbiếtJSONthìcấutrúcDictionarytươngtựnhưmộtobjectjson.MộtDictionaryđượckhaibáobằngcặpdấungoặc {...} .Vídụ:
point={'x':1,'y':2}
Truyxuấtmộtgiátrịdựavàokeycủađốitượng.Vídụ:
point={'x':3,'y':6,'z':9}
printpoint[x]
(Hiểnthị3)
2.9.1.Thêmmộtphầntử
Đểthêmmộtphầntửvàođốitượngđãkhaibáo,sửdụngcấutrúc dict[key]=value .Vídụ:
user={'name':'Jone','age':30}
user['country']='Vietnam'
printuser
(Hiểnthị{'country':'Vietnam','age':30,'name':
'Jone'})
2.9.2.Mộtsốhàm,phươngthứcthôngdụng:
dict.clear() :Xóatoànbộdữliệubêntrongđối
tượng
dict.copy() :Trảvềmộtbảncopycủađốitượng
dict.fromkeys(seq[,value]) :Tạomộtđốitượngvới
danhsáchkeytừseqvànếucótruyền value thìlấy
đólàmgiátrịchocácphầntử.
dict.has_key(key) :kiểmtramộtkeycótồntạitrong
đốitượnghaykhông.
dict.keys() :TrảvềmộtListchứacáckey
dict.values() :TrảvềmộtListchứacácvalue
Chương3.PhânchiamoduleTấtcảvídụchođếnthờiđiểmnàyđềuđượcthựcthitrongcommandlinehoặctừmộtfilepython .py .Tuynhiên,đốivớicácứngdụnglớn,cónhiềuchứcnăngthìphânchianhỏdựánthànhcácfilekhácnhausẽgiúpdễbảotrìvàtáisửdụngcácthànhphầnđãthiếtkế.
Chươngnàysẽgiúpbạnthiếtkếcáctínhnăngtheomôhìnhcácmodulevàkhicầnthìsẽgọifiletươngứngvàsửdụng.
3.1.Cácloạimodule/thưviện
Có3loạimodulethườngthấylà:
1. ViếtbằngPython:cóphầnmởrộnglà .py
2. Cácthưviệnliênkếtđộng:cóphầnmởrộnglà .dll ,
.pyd , .so , .sl ,…
3. C-Moduleliênkếtvớitrìnhphiêndịch.
3.2.Đườngdẫntìmđểloadmodule
Đểtảimộtmodulevàoscriptcủabạn,sửdụngcúphápđơngiản:
importmodulename
khigặpcâulệnhtrênthìtrìnhbiêndịchsẽtiếnhànhtìmkiếmfilemoduletươngứngtheothứtựthưmụcsau:
1. Thưmụchiệnhànhmàscriptđanggọi
2. CácthưmụctrongPYTHONPATH(nếucóset)
3. CácthưmụccàiđặtchuẩntrênLinux/Unix..
Cóthểbiếtđượcđườngdẫnmàmộtmoduleđãđượcloadbằngđoạncodedướiđây:
importmath
math.__file__
(Vídụtrảvề'/usr/lib/python2.5/lib-dynload/math.
so')
importrandom
random.__file__
(Vídụtrảvề'/usr/lib/python2.5/random.pyc')
3.3.Lấydanhsáchthuộctínhvàphươngthứccủamộtmodule
Đểlấyđượcdanhsáchcácthuộctínhvàphươngthứcmàmodulehỗtrợ,sửdụnghàm dir(modulename) .Vídụ:
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']
Cóthểgọihàm dir() khôngtruyềnthamsốđểlấycácthuộctínhvàphươngthứccủascopehiệntạiđangthựcthi.
3.4.Cáchkhaibáovàsửdụngmodule
Giảsửbạntạomộtfilepython mymath.py cónộidungnhưsau:
defcong(a,b):
returna+b
deftru(a,b):
returna-b
defnhan(a,b):
returna*b
Sauđó,tạomộtfilecótên myexample.py ,trongcùngthưmụcvớifile mymath.py vừatạoởtrên,cónộidungnhưsau:
importmymath
num1=1
num2=2
print'Tonghaisola:',mymath.cong(num1,num2)
Vàocommandline,thựchiệngọifilemyexamplenhưsau:
$pythonmyexample.py
Saukhithựchiệnsẽhiểnthịlênmànhìnhlà
Tonghaisola:3
3.5.Packagemodule
Cóthểgomnhiềumodule .py vàomộtthưmụcvàtênthưmụclàtêncủapackagevàtạomộtfile __init__.py trongthưmụcnày.
Nhưvậy,cấutrúcthưcủamộtpackagesẽnhưsau:
|--mypack
||--__init__.py
||--mymodule1.py
||--mymodule2.py
|
Cóthểsửdụng mymodule1 theocúphápimportsau:
importmypack.mymodule1
hoặc
importmypack.mymodule1asmymodule1
hoặc
importmypack.mymodule1asmod
Khisửdụngmộtmodulethuộcmộtpackagethìcáclệnhtrongfile __init__.py sẽđượcthựchiệntrước.Thôngthườngthìfile __init__.py sẽrỗng.
Cóthểtạocácsubpackagebêntrongmộtpackagetheođúngcấutrúcthưmục,cófile __init__.py .Vídụ:
importmypack.mysubpack.mysubsubpack.module
Chương4.ClassLậptrìnhhướngđốitượnglàmộtkháiniệmkhôngthểthiếutronghầuhếtcácngônngữthôngdụnghiệnnay.PythoncũnghỗtrợlậptrìnhhướngđốitượngvớicáckháiniệmClass,Object,Override…
4.1.KhaibáomộtClass
Khaibáomộtclasstheocúphápsau:
classmyclass([parentclass]):
assignments
def__init__(self):
statements
defmethod():
statements
defmethod2():
statements
Vídụmộtclass:
classanimal():
name=''
name=''
age=0
def__init__(self,name='',age=0):
self.name=name
self.age=age
defshow(self):
print'Mynameis',self.name
defrun(self):
print'Animalisrunning...'
defgo(self):
print'Animalisgoing...'
classdog(animal):
defrun(self):
print'Dogisrunning...'
myanimal=animal()
myanimal.show()
myanimal.run()
myanimal.go()
mydog=dog('Lucy')
mydog.show()
mydog.run()
mydog.go()
Saukhithựcthisẽchorakếtquả:
MyNameis
Animalisrunning...
Animalisgoing...
MyNameisLucy
Dogisrunning...
Animalisgoing...
Trongvídụtrênthì:
animal và dog là2class.Trongđóclass dog kếthừa
từclasschalà animal nênsẽcócácphươngthứccủa
class animal .
name và age làthuộctính(Attribute)củaclass.
Phươngthức __init__(self) làhàmtạocủaclass.
Hàmnàysẽđượcgọimỗikhicómộtobjectmớiđược
tạo(từmộtclass),gọilàquátrìnhtạoinstance.
show() , run() và go() là2phươngthứccủa2class.
Khikhaibáophươngthứccókèmthamsố self dùng
đểtruycậpngượclạiobjectđanggọi.Lúcgọiphương
thứcthìkhôngcầntruyềnthamsốnày.
Phươngthức run() củaclass dog gọilà override
củaphươngthức run() củaclass animal .
Chương5.ThaotáctrêntậptinvàThưmụcNộidungchươngnàysẽhướngdẫncácthaotácliênquanđếntậptinvàthưmục.
5.1.Tậptin(File)
5.1.1.Mởfile
Trướckhimuốnđọchoặcghifile,bạncầncóthaotácmởfiletheocúpháp:
fh=open(filepath,mode)
Trongđó, filepath làđườngdẫncủafilesẽmởvà modelàchếđộđểmở.Cómộtsốchếđộlà:
r :mởđểđọcnộidung(mặcđịnh)
w :mởđểghinộidung
a :mởđểghithêmnộidungvàocuốifile.
r+ :mởđểđọcvàghi.Contrỏnằmởđầufile.
w+ :mởđểđọcvàghi.Ghiđènếufileđãtồntại,nếu
filechưatồntạithìtạofilemớiđểghi.
a+ :mởđểđọcvàthêmvàocuốifile.Contrỏnằmở
cuốifile.Nếufilechưatồntạithìtạofilemớiđểghi.
Mặcđịnhlàmởfiletext,nếumuốnmởfilenhịphân(binary)thìthêm b ,vídụ: rb , wb , ab , rb+ , wb+ , ab+ .
Vídụ:
f1=open('test.txt','r')
f2=open('access_log','a+'
Saukhigọihàm open() thànhcôngthìsẽtrảvềmộtobjectcócácthuộctính:
closed :Truenếufileđãđóng
mode :chếđộkhimởfile
name :têncủafile
softspace :cờđánhdấusoftspacekhidùngvớihàm
5.1.2.Đọcnộidungtừfile
Saukhifileđãmởởchếđộđọcthìgọiphươngthứcread([count]) đểtrảvềtoànbộnộidungcủafile.Vídụ:
f1=open('test.txt','r')
data=f1.read();
Hàm read() cónhậnmộtthamsốlàsốlượngbytemuốnđọc.Nếukhôngtruyềnvàothìsẽđọchếtnộidungcủafile.Vídụ:
f2=open('log.txt','r')
buffdata=f2.read(1024)
5.1.3.Ghinộidungvàofile
Nếufileđượcmởởchếđộcóthểghithìcóthểdùngphươngthức write() đểghimộtnộidungvàofile.Vídụ:
f2=open('access_log','a+')
f2.write('Attackdetected')
5.1.4.Đóngfileđãmở
Saukhihoàntấtcácthaotácđọcghifilethìgọiphươngthức close() đểđóngfileđãmở.Vídụ:
f1.close()
f2.close()
5.1.5.Đổitênfile
Sửdụngphươngthức os.rename(old,new) đểđổitênmộtfile.Vídụ:
importos
os.rename('test.txt','test_new.txt')
5.1.6.Xóafile
Sửdụngphươngthức os.remove(file) đểxóamộtfile
khỏihệthống.Vídụ:
importos
os.remove('test.txt')
5.2.Thưmục(Directory)
5.2.1.Tạothưmục
Sửdụngphươngthức os.mkdir(dir) đểtạothưmục.Vídụ:
importos
os.mkdir('test')
5.2.2.Xóathưmục
Sửdụngphươngthức os.rmdir(dir) đểxóamộtthưmục.Vídụ:
importos
os.rmdir('test')
5.2.3.Đọcnộidungthưmục
Sửdụngphươngthức os.listdir(dir) đểlấydanhsáchtậptin,thưmụccủathưmục dir .Khigọisẽtrảvềmộtmảngdanhsáchcáctậptin,thưmục.Vídụ:
importos
allfiles=os.listdir('/root/downloads')
printallfiles
5.3.Moduleos
Module os làmộtmodulecónhiềuphươngthứchữuíchtrongviệclàmviệcvớicácfilevàdirectory,như:
os.chdir(path) :đổithưmụchiệnhành
os.getcwd() :trảvềthưmụchiệnhành
os.chmod(path,mode) :CHMODmộtđườngdẫn
os.chown(path,uid,gid) :CHOWNmộtđườngdẫn
os.makedirs(path[,mode]) :tạođườngdẫn(có
recursive)
os.removedirs(path) :xóamộtđườngdẫn(có
recursive)
Xemthêmtạihttps://docs.python.org/2/library/os.html
5.4.Moduleos.path
Module os.path hỗtrợcácphươngthứcgiúpthaotácnhanhchóngvàthuậntiệnhơntrênđườngdẫn.
os.path.exists(path) :kiểmtra1đườngdẫncótồn
tạihaykhông
os.path.getsize(path) :lấyfilesize(byte)
os.path.isfile(path) :kiểmtraxemcóphảilàmột
filethôngthường
os.path.isdir(path) :kiểmtraxemcóphảilàmột
thưmục
os.path.dirname(path) :trảvềtênthưmụccủapath
os.path.getatime(path) :trảvềthờigiantruycập
mớinhất
os.path.getmtime(path) :trảvềthờigianchỉnhsửa
cuốicùng
os.path.getctime(path) :trảvềthờigianchỉnhsửa
cuốicủametadatatrênmộtsốhệthống.Hoặctrảvề
thờigiantạofiletrênWindows.
Xemthêmtạihttps://docs.python.org/2/library/os.path.html
Chương6.XửlýhìnhảnhSửdụngthưviệnPillow(PILFork)đểtiếnhànhcácthaotácxửlýhìnhảnhđơngiảnnhưresize,crop,rotate…
6.1.CàiđặtPIL
Vàotrangwebsauđểdownload/càiđặtpackagePILchopythoncủabạnhttp://pillow.readthedocs.org/en/latest/installation.html
SaukhicàiđặtthìcóthểsửdụngcácmoduletrongpackageIPL
fromPILimportImage
6.2.Mởfile
fromPILimportImage
im=Image.open("photo.jpg")
Saukhimởfilehìnhthànhcôngthìcóthểthaotáctrênđốitượng im .
6.3.Ghifile
Từđốitượng Image cóthểlưufilexuốngmáytínhbằngphươngthức save(path,type) .Vídụ:
...
im.save('photo_new.jpg','JPEG')
6.4.Tạothumbnail
Sửdụngphươngthức thumbnail nhưsau:
fromPILimportImage
im=Image.open('photo.jpg')
im.thumbnail((100,100))
im.save('photo_thumbnail.jpg','JPEG')
thumbnail khôngtrảvềimagemớimàthựchiệntrênobjectimageđanggọi.
6.5.Cácthaotácxửlýhìnhảnh
ThamkhảothêmthưviệnPILtại:http://pillow.readthedocs.org/en/latest/index.html
Chương7.XửlýfileJSONJSONlàmộttrongnhữngđịnhdạngfiletraođổidữliệuthôngdụngnhấthiệnnay.VớikiếntrúcđơngiảnvàtươngđồngvớicấutrúccủaPythonnênviệcthaotácJSONtrênPythonrấtdễhiểu.
7.1.LoadfiletừInternet
ThôngthườngdữliệuJSONđượclấytừnguồnkhác(nhưfile,internet..)nênchươngnàysẽbắtđầubằngcáchhướngdẫndownloadmộtfileJSONtừInternetvàsauđómớiparsingnộidungJSONdownload.
Sửdụngmodule urllib2 đểdownloadfilevàmodulejson đểencode/decodeJSONdata.Vídụ:
importurllib2
importjson
response=urllib2.urlopen('https://api.github.com/
users/voduytuan/repos')
data=json.load(response)
printdata
Vídụtrênsẽtruyvấnđườngdẫnhttps://api.github.com/users/voduytuan/reposđểlấydanhsáchRepositorytrênGithubcủamìnhdướiđịnhdạngJSON.Sauđó,sẽđược
7.2.ParsingJSONData
NếunhưbạnđãcóJSONdatadướidạngchuỗi,muốnparsingchuỗinàythànhDatathìsửdụngnhưcáchdướiđây:
importjson
mystring='{"a":1,"b":2,"c":3,"d":4,"e":5}'
data=json.loads(mystring)
printdata
(Hiểnthị:{u'a':1,u'c':3,u'b':2,u'e':5,u'd
':4})
7.3.EncodingJSONData
NếunhưbạnđãcómộtbiếnvàmuốnencodethànhJSONstringthìcóthểdùngtheocáchsau:
importjson
mydata={
'name':'John',
'age':10
}
jsonstring=json.dumps(mydata)
printjsonstring
(hiểnthị:{"age":10,"name":"John"})
Chương8.XửlýfileXMLTrongphầnnày,chúngtasẽparsingnộidungXMLthànhdữliệuđểxửlý.ĐểxửlýXML,tasẽsửdụngthưviệnBeautifulsoup4.Đâylàmộtthưviệngiúpviệctriểnkhaiviệcparsinghtml,xmlđượcnhanhchóngvàtiệnlợi.
8.1.CàiđặtBeautifulsoup
Bạncóthểthamkhảohướngdẫncáchcàiđặttạiwebsitehttp://www.crummy.com/software/BeautifulSoup/bs4/doc/#installing-beautiful-soup.
TrênMacOS,cóthểcàibằng pip nhưsau:
$sudopipinstallbeautifulsoup4
8.2.Càiđặtlxml parser
Đểparsing xml từbeautifulsoup,taosửdụngbộparserxmlcótênlà lxml .Xemhướngdẫncàiđặttại
http://www.crummy.com/software/BeautifulSoup/bs4/doc/#installing-a-parser
TrênMacOS,cóthểcàibằng pip nhưsau:
sudopipinstalllxml
8.3.VídụvềparsingXML
Chovídụsau:
frombs4importBeautifulSoupasSoup
note='''
<?xmlversion="1.0"encoding="UTF-8"?>
<breakfast_menu>
<food>
<name>BelgianWaffles</name>
<price>$5.95</price>
<description>TwoofourfamousBelgianWaff
leswithplentyofrealmaplesyrup</description>
<calories>650</calories>
</food>
<food>
<name>StrawberryBelgianWaffles</name>
<name>StrawberryBelgianWaffles</name>
<price>$7.95</price>
<description>LightBelgianwafflescovered
withstrawberriesandwhippedcream</description>
<calories>900</calories>
</food>
</breakfast_menu>
'''
soup=Soup(note,'xml')
foods=soup.findAll('food')
forxinfoods:
printx.find('name').string,':',x.price.stri
ng
Khichạythìsẽhiểnthịramànhìnhnhưsau:
BelgianWaffles:$5.95
StrawberryBelgianWaffles:$7.95
Đốitượngthuộcclass Soup (BeautifulSoup)sẽgiúptruyxuấtcácthànhphầncủafilexmlnhanhchóngvàtiệnlợi.
Trongvídụcómộtsốcáchtruyxuấtđếncácphầntửnhư:
findAll() :trảvềmảngcácthẻcótêncầntìm
find() :trảvềphầntửđầutiêncótêncầntìm
Truyxuấttrựctiếpthôngquatênthẻnhư
x.price.string
8.4.ParsingHTML
Tươngtựnhư xml ,BeautifulSoupcóthểparsingnộidungHTMLthôngquahàmkhởitạovàchọn html ởthamsốthứ2.
...
soup=Soup(websitehtml,'html')
Chương9.KếtnốiMySQLMySQLlàmộthệcơsởdữliệuquanhệphổbiếnnhấthiệnnay.RấtnhiềungônngữcóthểkếtnốiđếnMySQLvàPythoncũngkhôngngoạilệ.
MặcđịnhPythonkhôngcóthưviệnđểkếtnốiđếnMySQLserver.Trongphầnnày,đểkếtnốiđếnMySQLServertừPython,chúngtasẽsửdụngmodule MySQLdb
9.1.CàiđặtMySQLdb
Càiđặtthôngqua pip nhưsau:
$sudopipinstallMySQL-python
Thamkhảothêmtại:https://pypi.python.org/pypi/MySQL-python/1.2.5
KhaibáomoduleMySQLdblàcóthểsửdụng.
importMySQLdb
TrongmộtsốtrườnghợpđãcàiMySQLdbnhưngimportbáolỗithiếufile libmysqlclient.18.dylib .Nguyênnhâncóthểlàdohiệntạiđườngdẫnđếnfilekhôngtồntại.Thửtạosymlinkhoặcsửdụngcâulệnhsauđểtạosymlinktừfile libmysqlclient.18.dylib đếnthưmục /usr/lib/
$sudoln-s/usr/local/mysql/lib/libmysqlclient.18
.dylib/usr/lib/libmysqlclient.18.dylib
9.2.KếtnốiđếnMySQLServer
BạncầncómộtMySQLserverđangchạyvàchokếtnốiđến.Trongtrườnghợpnàylàlocalhostnênkhôngcầncấuhìnhđặcbiệt,chỉcầncungcấpusernamevàpasswordlàcóthểkếtnốiđếnMySQLServer.
Thựchiệngọihàmnhưsauđểtrảvềkếtnối:
importMySQLdb
dbcon=MySQLdb.connect(host='localhost',user=
'myusername',passwd='mypassword',db='mydbname
')
Nếukếtnốikhôngthànhcôngthìsẽbáolỗivàngưngchươngtrình.Cáchkếtnốiantoànlàđưavàotrong tryđểbắtlỗinhưsau:
importMySQLdb
db=None
try:
db=MySQLdb.connect(host='localhost',user=
'root',passwd='root',db='mysql')
exceptMySQLdb.Error,e:
print"Error%d:%s"%(e.args[0],e.args[1])
sys.exit(1)
ifdb:
cur=db.cursor()
cur.execute("SELECTVERSION()")
ver=cur.fetchone()
print"Databaseversion:%s"%ver
9.3.Kếtnốivớicharsetutf8
MặcđịnhkếtnốiđếnMySQLserverlàcharset latin nênkhilấydữliệuunicodethìhiểnthịTiếngViệtkhôngđúng,bạncầnphảichọncharsetlà utf8 khitạokếtnối.Cúphápnhưsau:
...
db=MySQLdb.connect(host='localhost',user='ro
ot',passwd='root',db='test',charset='utf8'
)
9.4.Querydữliệu
Đểtruyvấndữliệu(chạycâulệnhSQL)thìsửdụng cursorcủaMySQLdb.Vídụ:
importMySQLdb
db=MySQLdb.connect(host='localhost',user='ro
ot',passwd='root',db='mysql');
cursor=db.cursor()
sql='SELECT*FROMuser'
cursor.execute(sql)
myusers=cursor.fetchall()
Vídụdữliệubiến myusers là: ((1,'John'),(2,'Doe'))
Mặcđịnh, cursor sẽtrảvềmỗidòngdữliệutừMySQLtheokiểu tuple ,tứclàkhôngcókey.Nếubạnmuốntrảvề
kiểu Dictionary thìcóthểkhaibáo:
importMySQLdb
db=MySQLdb.connect(host='localhost',user='ro
ot',passwd='root',db='mysql')
cursor=db.cursor(MySQLdb.cursors.DictCursor)
...
9.5.Fetchdữliệu
Cómộtsốcáchđểfetchdữliệuthôngdụngtừ cursor saukhiđã exectute(sql) là fetchone() và fetchall() .
fetchone() :chỉfetchmộtdòngdữliệu.Nếumuốn
fetchnhiềudòngdữliệuthìcóthểgọinhiềulần,mỗi
lầnsẽtrảvềmộtdòngdữliệu.Tốtchotrườnghợptruy
vấnrấtnhiềudữliệumộtlúc.Nếutrảvề None tứclà
đãfetchhếtdữliệutừcâutruyvấn.
fetchall() :fetchtoànbộdữliệutruyvấnđượctừ
câutruyvấnvàtrảvềmộttuplechứacácdòngdữ
liệu.MỗiphầntửcủaTuplecóthểlàmộtTuplekhác
hoặclàmộtDictionarytùytheocàiđặtởbướclấy
cursor(Xemphần9.4).
fetchmany(size) :nằmởgiữa2kiểufetchtrên,cóthể
quyđịnhsốlượngrowtrongmỗilầnfetch.Nếufetch
hếtthìtrảvềTuplerỗng.
9.6.Đóngkếtnối
Saukhikếtnốivàtruyvấnthìcóthểđóngkếtnốitheovídụsau:
importMySQLdb
db=MySQLdb.connect(...)
db.close()
Ngoàira,bạncũngnênđóng cursor khikhôngcònsửdụngtheovídụ:
importMySQLdb
db=MySQLdb.connect(...)
cursor=db.cursor()
cursor.close()
db.close()
9.7.PreparedStatement
Preparedstatementlàkỹthuậtthamsốhóacácdữliệutruyềnvàocâutruyvấnthayvìnốichuỗitrựctiếpđểxâydựngmộtchuỗitruyvấndài.Kỹthuậtnàyđượcápdụngnhiềuvàgiúptănghiệuquảvàtínhbảomậtcủacâutruyvấn.Vídụ:
...
cur.execute("UPDATEWritersSETName=%sWHEREId
=%s",("John","4"))
...
Mỗithamsốtruyvấnsẽđượcthaythếbằng %s vàphươngthức execute() sẽcóthamsốthứ2làmộtTuplecógiátrị
tươngứngvớithứtựxuấthiệncủacácthànhphần %s
Chương10.KếtnốiRedisRedislàmộtmemorycacheserverhỗtrợpersistantdatathôngdụngnhấthiệnnay.NộidungchươngnàysẽhướngdẫnbạnkếtnốiđếnmộtRedisserver(đãđượccàiđặtsẵn)thôngquathưviệnredis-py.
10.1.Càiđặt
Cóthểxemthêmvềhướngdẫncàiđặtthưviệnnàytạihttps://github.com/andymccurdy/redis-py
Đơngiảncàithôngqua pip là:
$sudopipinstallredis
10.2KếtnốiđếnRedis
ĐểkếtnốiđếnRedisserverthìbạncóthểxemvídụsau:
importredis
r=redis.StrictRedis(host='localhost',port=6379,
db=0)
10.3.Thựchiệnlệnh
Thựchiệncáclệnhbìnhthườngtrênđốitượngredis.Vídụ:
importredis
r=redis.StrictRedis(...)
r.set('foo','bar')
printr.get('foo')
(Hiểnthị'bar')
10.4.Pipeline
Pipelinelàkỹthuậtđượcdùngtrongtrườnghợpbạnmuốntăngperformancebởigộpnhiềulệnhvàomộtrequestthayvìmỗilệnhlàmộtrequestnhưthôngthường.Xemvídụsauđểhiểucáchsửdụngpipelinebằng redis-py :
importredis
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()
Saukhigọiphươngthức execute() thìsẽtrảvềListtươngứngvớicáckếtquảcủatừnglệnh.Vídụkếtquảtừđoạncodetrên:
[True,True,True,'bar']
Chương11.KếtnốiMemcachedMemcachedlàmộtmemorycacheserverthôngdụnghiệnnay.NộidungchươngnàysẽhướngdẫnbạnkếtnốiđếnmộtMemcachedserver(đãđượccàiđặtsẵn)thôngquathưviện pylibmc .
11.1.Càiđặt
Cóthểxemthêmvềhướngdẫncàiđặtthưviệnnàytạihttp://sendapatch.se/projects/pylibmc/install.html
Đơngiảncàithôngqua pip là:
$sudopipinstallpylibmc
11.2KếtnốiđếnMemcachedServer
ĐểkếtnốiđếnMemcachedserverthìbạncóthểxemvídụsau:
importpylibmc
mc=pylibmc.Client(["127.0.0.1"],binary=True,beh
aviors={"tcp_nodelay":True,"ketama":True})
10.3.Thựchiệnlệnh
Thựchiệncáclệnhbìnhthườngtrênđốitượngmemcache.Vídụ:
importpylibmc
mc=pylibmc.Client(...)
mc.set('foo','bar')
printmc.get('foo')
(Hiểnthị'bar')
Chương12.KếtnốiRabbitMQRabbitMQlàmộtphầnmềmchophépxâydựngMessageQueuetheoprotocolAMQPvàkháthôngdụngtrênthếgiới.ĐểkếtnốiđếnRabbitMQtrênPython,tasẽsửdụngthưviện pika .
12.1.Càiđặt
Cóthểxemthêmvềhướngdẫncàiđặtthưviệnnàytạihttps://pika.readthedocs.org/en/0.10.0/
Đơngiảncàithôngqua pip là:
$sudopipinstallpika
12.2GởimộtmessageđếnServer-Provider
Vídụđểgởimộtmessageđếnserver
importpika
connection=pika.BlockingConnection(pika.Connectio
nParameters('localhost'))
channel=connection.channel()
channel.queue_declare(queue='hello')
channel.basic_publish(exchange='',routing_key='hel
lo',body='HelloWorld!')
print"[x]Sent'HelloWorld!'"
connection.close()
Đểgởimộtmessage,chúngtacầnkếtnốiđếnservervàkhaibáomộtchannel,ởđâylàchannelcótênlà hello .Saukhikhaibáochannel,taotiếnhànhgởimessagecónộidung HelloWorld! thôngquachannelnày,kèmtheokhaibáo routing_key là hello .RoutingKeysẽgiúpđiềuhướngmessagenàyđếnđúngcácworkerđượckhaibáonhậnmessagetheoroutingkey(Consumer)
12.3.Nhậnmessage-Consumer
Ởbướctrước,tađãtạomộtmessagelênqueue.Ởbướcnày,tasẽkhaibáomộtworkerxửlýcácmessagenhậnđượctừchannel hello .
importpika
connection=pika.BlockingConnection(pika.Connectio
nParameters(host='localhost'))
channel=connection.channel()
channel.queue_declare(queue='hello')
print'[*]Waitingformessages.ToexitpressCTR
L+C'
defcallback(ch,method,properties,body):
print"[x]Received%r"%(body,)
channel.basic_consume(callback,queue='hello',no_a
ck=True)
channel.start_consuming()
Đoạncodenàycũngcóphầnkhaibáo connection ,
channel .Tuynhiên,vìlàconsumernênsẽsửdụngphươngthức basic_consume đểlắngnghetrênqueuehello ,khicómessageđếnsẽgọihàm callback() đểxửlý.Trongtrườnghợpvídụnàythìcallbackchỉđơngiảnlàhiểnthịchuỗithôngbáođãnhậnđượcmessage.
12.4.TìmhiểuthêmvềRabbitMQvàPika
NộidungchươngnàykhôngcóýđịnhgiớithiệutấtcảkháiniệmcủaAMQPcũngnhưRabbitMQmàchủyếugiớithiệuthưviện pika đểlàmviệcvớiRabbitMQ.BạncóthểtiếptụctheodõicáchướngdẫnvềkháiniệmcủaRabbitMQvàPikatạiwebsitechínhthứccủaRabbitMQ.
https://www.rabbitmq.com/tutorials/tutorial-one-python.html
Chương13.RestfulclientNgàynay,vớisựphongphúcủacácứngdụngvànhucầukếtnốingàycànglớnthìRestfullàmộttrongnhữngmôhìnhwebserviceđượcnhiềucôngtysửdụng.Dođó,việccóthểkếtnốiđếncácRestfulwebservicelàmộtkỹnăngcầnthiếtchocáclậptrìnhviên.
ChươngnàysẽgiớithiệuvềmộttrongnhữngthưviệnnổitiếngnhấttrongPythonđểlàmviệcvớicácRestfulwebservice,đólà requests .
Websitechínhthứcvàcácmôtảđầyđủđềuđượcđềcậptạihttp://www.python-requests.org/
13.1.Càiđặt
Càiđặtnhanhchóngthôngqua pip nhưsau:
$sudopipinstallrequests
13.2.Request
HỗtrợsẵncácphươngthứctươngứngchoHttprequestnhưGET,POST,PUT,DELETE…
importrequests
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")
13.2.1.GETQuerystring
Đốivớicácrequest GET ,cóthểtruyềnthamsốđườngdẫnthôngquathamsố params khigọiphươngthức get() .Vídụ:
importrequests
payload={'key1':'value1','key2':'value2'}
r=requests.get("http://httpbin.org/get",params=
payload)
print(r.url)
(Hiểnthị:http://httpbin.org/get?key2=value2&key1=
value1)
13.2.2.RequestBody
TronghầuhếttrườnghợpcácrequestnhưPOST,PUTthươngcầntruyềndữliệukhirequest,cóthểsửdụngthamsố data đểtruyềndatalênkèmrequest.Vídụ:
importrequests
payload={'key1':'value1','key2':'value2'}
r=requests.post("http://httpbin.org/post",data=
payload)
13.2.3.Uploadfile
Cóthểgởithêmthamsố files đểuploadfilekèmtheorequest.Vídụ:
importrequests
url='http://httpbin.org/post'
files={'file':open('report.xls','rb')}
r=requests.post(url,files=files)
13.3.Response
Saukhigọicácphươngthứctươngứngđểrequest,bạnsẽcóđốitượngthuộcclass Response .Đốitượngnàycómộtsốthôngtinnhưsau:
status_code :HTTPStatusservertrảvề
headers :Cácthôngtinheadermàservertrảvềdưới
dạngDictionary.
cookies :Nếuservercótrảvềcookiethìcóthểsử
dụngthuộctínhnàyđểlấycáccookie.
text :Trảvềnộidungresponse
Thamkhảovềcáctínhnăngkháccủathưviện requeststạiwebsitechínhthức.http://docs.python-requests.org
Chương14.GởiemailvớiSMTPSMTPlàgiaothứcgởimailthôngdụnghiệnnay.Pythonhỗtrợmặcđịnhthưviện smtplib dùngđểkếtnốiđếnmộtSMTPServervàgởiemail.Tuynhiên,việcsửdụngthưviệnnàysẽgâykhókhănchoviệcđịnhdạngvàsửdụngnênchúngtasẽsửdụngthưviện sender ,làmộtthưviệngiúpđịnhdạngvàgởiemailđơngiảnhơn.
14.1.Càiđặtsender
Càiđặttừ pip nhưsau:
$sudopipinstallsender
14.2.Gởiemailđơngiản
Đểgởi1emailvới sender ,bạncầncótàikhoảnvàmộtsốthôngtincủaSMTPServertrướckhigởi.Vídụđoạncodeđểgởi1emailtừSMTPServercủaAmazon.
fromsenderimportMail,Message
mail=Mail(
"smtp.gmail.com",
port=465,
username="[email protected]",
password="yourpassword",
use_tls=False,
use_ssl=True,
debug_level=False
)
msg=Message("msgsubject")
msg.fromaddr=("VoDuyTuan","[email protected]")
msg.to="[email protected]"
msg.body="thisisamsgplaintextbody"
msg.html="<b>thisisamsgtextbody</b>"
msg.reply_to="[email protected]"
msg.charset="utf-8"
msg.extra_headers={}
msg.mail_options=[]
msg.rcpt_options=[]
#Sendmessage
mail.send(msg)
14.3.Gởiemailcóđínhkèmfile
BạncầnsửdụngthêmclassAttachmentđểtạoattachment.
fromsenderimportMail,Message,Attachment
mail=Main(...)
msg=Message(..)
...
#OpenattachedfileandcreateAttachmentobject
withopen("photo01.jpg")asf:
file01=Attachment("photo01.jpg","image/jpeg"
,f.read())
msg.attach(file01)
#Sendmessage
mail.send(msg)
14.4.Tìmhiểuthêm
Bạncóthểtìmhiểuthêmvềthưviện sender tạiwebsite
chínhthứctạiđịachỉhttp://sender.readthedocs.org/
Chương15.SocketprogrammingChươngnàysẽvídụviệcxâydựngmộtmôitrườngClient-ServersửdụngSocket.Serversẽlắngnghetrênmộtport(12345)vàkhiclientkếtnốivàosẽthôngbáohiểnthịthôngtincủaclient(IPvàPort)vàgởi1messagexuốngchoclient.
15.1.Serverside
Tạofile server.py vớinộidungbêndưới.
importsocket
s=socket.socket()
host=socket.gethostname()
port=12345
s.bind((host,port))
s.listen(5)
whileTrue:
c,addr=s.accept()
print'Gotconnectionfrom',addr
c.send('Thankyouforconnecting')
c.close()
ĐoạncodetrênkhithựcthisẽchạyvàlắngngheởportTCP12345.MỗikhicómộtkếtnốitừclientsẽhiệnrathôngbáokếtnốitừIPvàPortnào,vídụ: GotconnectionfromGotconnectionfrom('192.168.1.104',60018) .Sauđó,gởitrảmộtmessagevớinộidung Thankyouforconnecting vềchoclient.Sauđó,đóngkếtnốivớiclient.
15.2.Clientside
Tạofile client.py vớinộidungbêndưới.
importsocket
s=socket.socket()
host='127.0.0.1'
port=12345
s.connect((host,port))
prints.recv(1024)
s.close
Đoạncodetrênsẽkếtnốiđếnmộtsocketserverthôngquahostnamelấyđượctừphươngthứcsocket.gethostname() vàport12345.Saukhikếtnối,sẽhiểnthịrakếtquảtrảvềtừserver.Sauđóthìđóngkếtnối.