You are on page 1of 57

Ti liu hng dn nhanh v ngn gn v s dng ngn ng Python

Norman Matloff University of California, Davis c 2003-2006, N. Matloff 26 thng 1 nm 2006

Mc lc
1 Khi qut chung 1.1 1.2 2 Cc ngn ng script l g . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Ti sao nn dng Python? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2 2 2 3 3 3 3 4 4 5 5 6 8 8 8

Hng dn s dng ti liu 2.1 2.2 2.3 Kin thc c bn cn c . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Hng tip cn . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Nhng phn no cn c v c khi no . . . . . . . . . . . . . . . . . . . . . . . . . . . .

Mt v d hng dn trong 5 pht 3.1 3.2 3.3 3.4 3.5 M lnh ca chng trnh v d . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Kiu d liu dng danh sch (list) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Khi lnh trong Python . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Python cng c ch g lnh tng tc . . . . . . . . . . . . . . . . . . . . . . . . . . . . Dng Python nh mt my tnh b ti . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

Mt v d hng dn trong 10 pht 4.1 4.2 M lnh ca v d . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

Gii thiu v x l file . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10 10

Khai bo hay khng khai bo, Phm vi, Hm, v.v... 5.1 5.2

Khng c phn khai bo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10 Bin ton cc v bin cc b . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11 11

Mt s hm c sn trong Python 6.1 6.2

Cc chui so vi cc gi tr s . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12 Danh sch (mng) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13 6.2.1 6.2.2 6.2.3 6.2.4 Cc Tuple . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15 Chui k t . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15 Sp xp . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16 Tc dng ca __name__ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 18 20

Lp trnh hng i tng (Object-Oriented Programming), OOP 1

7.1 7.2

T kha self . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 21 Cc bin thc th . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 21 7.2.1 To lp v xa lp . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 22

7.3 7.4 7.5 7.6 7.7 8 9

Cc phng thc vi thc th . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 22 Docstring . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 23 Cc phng thc lp . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 23 Cc lp suy din . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 24 Mt lu v lp . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 24 24 26 27

Tm quan trng ca vic hiu c tham chiu i tng So snh cc i tng

10 Cc m-un v gi chng trnh

10.1 M-un . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 27 10.1.1 V d m lnh chng trnh . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 27 10.1.2 Lnh import lm vic th no? . . . . . . . . . . . . . . . . . . . . . . . . . . . . 28 10.1.3 M lnh c bin dch . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 29 10.1.4 Cc vn hn hp . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 29 10.1.5 Ch v bin ton cc . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 29 10.2 Che giu d liu . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 30 10.3 Cc gi chng trnh . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 31 11 X l li 12 Phn hn hp 32 32

12.1 Chy m lnh Python m khng c trc tip m b thng dch . . . . . . . . . . . . . . . . 32 12.2 In kt qu khng c du xung dng hoc du trng . . . . . . . . . . . . . . . . . . . . . . 33 12.3 nh dng chui . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 33 12.4 Cc tham bin c tn trong hm . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 34 13 V d v cc cu trc d liu trong Python 35

13.1 S dng cc kiu c php c bit . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 37 14 Cc c im ca lp trnh hm 2 38

14.1 Cc hm Lambda . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 38 14.2 Mapping . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 38 14.3 Lc . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 40 14.4 List Comprehension . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 40 14.5 Chit gim . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 40 15 Cc biu thc pht sinh A G li 41 42

A.1 Cng c g li sn c trong Python, PDB . . . . . . . . . . . . . . . . . . . . . . . . . . . 42 A.1.1 Dng c bn . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 42 A.1.2 Lu v cc lnh Next v Step . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 44 A.1.3 S dng Macro ca PDB . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 44 A.1.4 S dng __dict__ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 45 A.2 S dng PDB vi DDD . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 45 A.2.1 Chun b . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 46 A.2.2 Khi ng DDD v m chng trnh . . . . . . . . . . . . . . . . . . . . . . . . . . 46 A.2.3 Cc im dng . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 46 A.2.4 Chy chng trnh ngun ca bn . . . . . . . . . . . . . . . . . . . . . . . . . . . 47 A.2.5 Theo di cc bin . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 47 A.2.6 Cc vn hn hp . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 47 A.2.7 Mt s h tr g li c sn trong Python . . . . . . . . . . . . . . . . . . . . . . . . 47 A.2.8 Thuc tnh __dict__ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 48 A.2.9 Hm id() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 48 A.2.10 Cc cng c / IDE g li khc . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 48 A.3 Ti liu trc tuyn . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 49 A.3.1 Hm dir() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 49 A.3.2 Hm help() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 50 A.4 Gii thch v bin php x l bin ca lp c . . . . . . . . . . . . . . . . . . . . . . . . . . 51 A.5 a tt c cc bin ton cc vo trong mt lp . . . . . . . . . . . . . . . . . . . . . . . . . 53

1
1.1

Khi qut chung


Cc ngn ng script l g

Cc ngn ng lp trnh nh C v C++ cho php lp trnh vin vit m lnh mc rt chi tit v mang li tc thc hin nhanh chng. Tuy nhin trong hu ht cc ng dng thc tin, tc thc hin khng phi l yu t quan trng, v trong nhiu trng hp, ngi s dng sn sng vit m lnh bng mt ngn ng cp cao hn. Chng hn, vi cc chng trnh x l file vn bn, n v c bn trong C/C++ l k t, cn vi nhng ngn ng nh Perl v Python th l cc dng vn bn v cc t trong mi dng. D nhin l c th x l cc dng vn bn v cc t trong C/C++, nhng ta cn c gng nhiu hn nu mun t c mt kt qu tng t. Thc ra thut ng scripting language (ngn ng kch bn) cha tng c nh ngha chnh thc, nhng sau y l mt s c im ca n: c s dng thng xuyn trong lnh vc qun tr h thng, lp trnh Web v m hnh ho h thng v tinh chnh phn mm theo yu cu ngi s dng ngay trong qu trnh sn xut phn mm. khai bo bin mt cch t nhin (vi cc bin nguyn, du phy ng v chui k t thng rt t hoc khng c s khc bit). Cc mng c th trn ln cc kiu bin khc nhau, chng hn kiu nguyn v kiu chui k t. Cc hm c th tr gi tr kiu mng (thay v scalar). Cc kiu mng ny c th dng lm ch s m trong cc vng lp v.v... nhiu cc php tnh cp cao c xy dng sn trong ngn ng, chng hn kt ni chui k t v push/pop cc stack. c thng dch thay v bin dch thnh cc ngn ng my.

1.2

Ti sao nn dng Python?

Ngy nay ngn ng kch bn ph bin nht c l l Perl. Tuy vy, vn c nhiu ngi, trong c tc gi, a chung Python hn v ngn ng ny r rng v tinh t hn. i vi nhng ngi pht trin h thng Google th Python l ngn ng rt quen thuc. Nhng ngi ng h Python, thng c gi l cc Pythonista, cho rng ngn ng ny trong sng v tin dng n mc ta c th dng n cho mi khu lp trnh ch khng ring g vit script. H tin rng Python hay hn C v C++.1 C nhn ti cho rng ngi ta cao C++; mt s thnh phn ca ngn ng ny khng khp vi nhau. Java l ngn ng hay hn, nhng n yu cu mi bin phi c mt kiu nht nh. c im ny, theo ti, tng phc tp trong vic lp trnh. Ti rt vui khi thy Eric Raymond, mt ngi ni ting trong gii pht trin phn mm m ngun m cng khng nh nhng iu tng t v C++, Java v Python.
1

Mt ngoi l cn nhc li l ta khng xt n chng trnh yu cu tc cao.

2
2.1

Hng dn s dng ti liu


Kin thc c bn cn c

Bt k ai vi mt cht kinh nghim lp trnh u c th tip cn c nhng ni dung c trnh by trong ti liu. Ti liu m u vi phn Hng i tng 7, thun tin cho ngi c kin thc c bn v ngn ng lp trnh hng i tng nh C++ hoc Java. Nu thiu phn kin thc ny, bn vn c th c cc phn ny, mc d c th phi chm hn so vi nhng ngi bit C++ hoc Java; bn ch cn nm chc nhng v d thay v cc thut ng. S c mt i ch ti s trnh by ring nu my bn s dng h iu hnh Unix. Nhng thc t kin thc Unix cng khng cn thit v bn c th dng Python trn c Windows v Macintosh ch khng ring g Unix.

2.2

Hng tip cn

Hng tip cn ca ta y tng i khc so vi phn ln cc sch (hay cc trang web hng dn) v Python. Cch tip cn thng thng l trnh by tng chi tit t u n cui. Chng hn nh vic lit k ht tt c cc gi tr ca mt tham s trong mt cu lnh Python. Trong ti liu ti trnh dng cch ny. Mt ln na, mc tiu l cho php ngi c c th nhanh chng nm bt c nn tng ca Python, t c th tm hiu su vo mt vn c th theo nhu cu.

2.3

Nhng phn no cn c v c khi no

Theo ti, bn nn bt u c phn key, sau s dng th Python. Trc ht th nghim thao tc vi du nhc lnh Python (Phn du nhc lnh). Sau th t tay vit mt s chng trnh ngn; c th l cc chng trnh hon ton mi, hoc ch thay i mt cht t nhng chng trnh trong cc phn tip theo ca ti liu. 2 iu ny s gip bn hiu cch dng ngn ng mt cch c th hn. Nu mc ch chnh ca bn khi s dng Python l vit nhng on m ngn m khng cn s dng th vin Python, Nh vy c l cng . Tuy vy, phn ln ngi c cn nghin cu thm vi kiu thc c bn v cc c im lp trnh hng i tng v cc m-un/gi chng trnh Python. V vy tip theo bn nn c Phn 12 l nn tng rt chc bn s dng tt Python. Cui cng, bn c th s nhn thy rng nhiu lp trnh vin Python s dng nhng c im lp trnh theo hm ca Python, v bn cng mun hiu chng trnh ca ngi khc hoc c th mun chnh mnh s dng c im ny. Nu vy, phn 14 chnh l ni bn bt u. ng qun cc ph lc! Nhng ph lc quan trng l A v A.3.
File ngun ca chng trnh c th download ti a ch http://heather.cs.ucdavis.edu/~matloff/Python/ PythonIntro.tex, do d bn khng cn phi t tay g chng trnh. Bn c th son tho mt bn sao ca file ny, lu li nhng dng lnh ca chng trnh m bn cn, hoc dng chut thc hin copy-paste i vi nhng hng dn c lin quan. Nhng nu bn mun t tay g ni dung nhng chng trnh v d ny th cn m bo g chnh xc nhng g c trong ti liu, c bit l cc ch tht u dng. iu ny rt quan trng, sau ny ta s bn n.
2

Ti cng c mt s ti liu hng dn lp trnh Python theo mc ch c th chng hn: lp trnh mng, kiu lp / chui s pht sinh. . . Xem thm http://heather.cs.ucdavis.edu/~matloff/python. html.

3
3.1

Mt v d hng dn trong 5 pht


M lnh ca chng trnh v d

Di y l mt on chng trnh ngn, n gin. Gi s ta cn tnh gi tr ca hm x g (x) = 1 x2 ng vi x = 0.1, 0.2, ..., 0.9. thc hin iu ny, c th dng on chng trnh nh sau: for i in range(10): x = 0.1*i print x print x/(1-x*x) lu vo mt file, chng hn fme.py, sau chy chng trnh bng cch g lnh sau ti du nhc h thng (trong Windows, bn c th double-click vo tn file) python fme.py Kt qu cho ra c dng nh sau: 0.0 0.0 0.1 0.10101010101 0.2 0.208333333333 0.3 0.32967032967 0.4 0.47619047619 0.5 0.666666666667 0.6 0.9375 0.7 1.37254901961 0.8 2.22222222222 0.9 4.73684210526 6

3.2

Kiu d liu dng danh sch (list)

Chng trnh nu trn hot ng nh th no? Trc ht, hm range() ca Python chnh l mt v d v mt list (mng 1 chiu),3 mc d v hnh thc khng r rng lm. Vi Python, list ng vai tr c bn, cho nn khi gp phi t list ti liu ny, bn nn hiu n l cu trc d liu kiu nh mng thay v mt nh ngh a t vng trong Ting Anh. Hm range() ca Python tr li kt qu mt list gm cc s nguyn lin tip, trong trng hp v d nu trn l [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]. Ch rng y l cch vit chnh thc ca list trong Python. List gm mt chui cc i tng (c th l mi kiu ch khng ring ch kiu s, c phn cch bi cc du phy gia cp ngoc vung. Nh vy, cu lnh for trong v d k trn tng t vi: for i in [0,1,2,3,4,5,6,7,8,9]: Chc bn cng on c, lnh ny thc hin mi vng lp 10 ln, ln u tin i = 0, sau l i = 1,... Python cng c cu trc lp while (cho d khng cuntil). Ngoi ra, lnh break ging nh trong C/C++ cho php sm thot khi vng lp. Chng hn: >>> x = 5 >>> while 1: ... x += 1 ... if x == 8: ... print x ... break ... 8

3.3

Khi lnh trong Python

By gi hy ch n du hai chm tng nh v dng cui dng lnh for, ni bt u ca mi khi lnh. Khc vi cc ngn ng kiu nh C/C++ v ngay c Perl u s dng cp ngoc nhn gii hn khi lnh, Python s dng du hai chm v cch vit tht u dng tip theo lm vic ny. Gi ti s dng du hai chm thng tin n b dch lnh Python, Cho b dch lnh Python, bn kho ch? Ti mun bo cho bn bin rng, bng cch thm vo du hai chm ny, mt khi lnh mi c bt u dng tip theo. Ti tht u dng cng nh hai dng tip theo, bo cho bn bin rng ba dng ny hp thnh mt khi lnh. Trong ti liu ny ti vit tht dng mt khong cch bng 3 ch ci (khng nht thit l 3, min l thng nht). Chng hn, nu ti phi vit4
y c th tm gi l mng, tuy nhin sau ny bn s thy chng cn linh hot hn kiu d liu tng t ca cc ngn ng C/C++. 4 y g() l mt hm nh ngha nh v d trn.
3

for i in range(10): print 0.1*i print g(0.1*i) th b dch lnh Python s thng bo li, ni rng ti mc li c php.5 Chng ta ch c php tht ct thm mt ln na nu c mt khi lnh con thuc khi lnh khc, chng hn: for i in range(10): if i%2 == 1: print 0.1*i print g(0.1*i) y ti ch in ra nhng g tng ng vi i l s l ca % l ton tmod, ging nh trong C/C++.6 Bn cnh , cn ch nhng cu lnh Python kiu nh print a or b or c, nu biu thc a ng (tc l khc 0) th ch mnh n c in ra cn b v c th khng; iu ny thng thy Python. Cng cn nhc li, ch du hai chm cui lnh if, v hai dng lnh print c vit tht ct so vi dng lnh if. Bn cnh cng cn ch rng khc vi C/C++/Perl, khng c du hai chm cui cc cu lnh bnh thng ca Python. Mi dng l mt cu lnh mi. Nu bn cn vit mt dng di, c th dng du s ngc nh di y: x = y + \ z

3.4

Python cng c ch g lnh tng tc

Mt c im rt hay ca Python l kh nng hot ng vi ch tng tc (dng lnh). Thng th bn cng khng dng n khi lp trnh, nhng l mt cch tin li, nhanh chng th m lnh xem n hot ng ra sao. Khi bn khng chc v tc dng ca mt th g c th bn s ni Phi th n xem sao!, v ch tng tc dng lnh cho php lm vic ny nhanh chng, d dng. Trong ti liu ny, chng ta cng s dng kiu tng tc dng lnh ny nh mt cch minh ho nhanh chng cho mt c im ca Python. Thay v chy chng trnh t du nhc h thng (batch mode - chy ton b chng trnh mt ln), ta c th g lnh my thc hin di ch tng tc: % python >>> for i in range(10): ... x = 0.1*i ... print x ... print x/(1-x*x)
Hy ghi nh: Nhng ngi mi bt u s dng Python thng b mc li kiu nh th ny. Hu ht cc ton t thng dng ca C u c trong Python, k c ton t so snh bng (==) nh bn thy. Cn k hiu 0x dnh cho h s 16, v cng ging nh FORTRAN, k hiu ** dnh cho hm m. Bn cnh lnh ifc th km theo else nh thng thng, v bn c th vit gn else if thnh elif. Cc ton t Boolean gm c and, or v not.
6 5

... 0.0 0.0 0.1 0.10101010101 0.2 0.208333333333 0.3 0.32967032967 0.4 0.47619047619 0.5 0.666666666667 0.6 0.9375 0.7 1.37254901961 0.8 2.22222222222 0.9 4.73684210526 >>> y ti khi ng Python, du nhc tng tc >>> xut hin. Sau ti ch vic g cc lnh vo, tng dng mt. Bt c lc no khi ti trong mt khi lnh th du nhc c dng c bit, .... V khi ti g mt dng trng cui m lnh th my hiu rng ti nhp xong cc dng lnh v bt u chy.7 Trong khi ch tng tc lnh, bn c th tm cc cu lnh c g vo ln trc bng cc phm mi tn ln xung, khng cn g li. 8 thot khi ch dng lnh, n Ctrl-D (Ctrl-Z trong Windows). In t ng: Trong ch tng tc dng lnh, khi ta tham chiu hoc to mi mt i tng, hoc ngay c mt biu thc m cha cn gn tn bin cho n th gi tr ca biu thc s c in ra (khng cn g lnh print). Chng hn: >>> for i in range(4): ... 3*i ... 0 3 6 9
Ch tng tc lnh cho php chng ta thc hin tng dng lnh Python v tnh ton gi tr tng biu thc n l. y, chng ta g vo v thc hin mt lnh lp for. Ch tng tc lnh khng cho php chng ta g vo c mt chng trnh. V mt k thut, thc ra ta vn c th thc hin iu ny bng cch bt u bng mt dng lnh kiu nh if 1:, a c chng trnh vo mt cu lnh if ln, nhng d sao th y cng khng phi l cch thun tin g ni dung ca mt chng trnh ln. 8 Vi Pythonwin l Ctrl+mi tn.
7

Mt ln na, ch l iu ny cng ng vi i tng ni chung, khng ch vi biu thc, v d >>> open(x) <open file x, mode r at 0x401a1aa0> y ta m file x, tc l to mi mt i tng kiu file. V chng ta cha gn tn bin (chng hn f) cho n, f=open(x)( sau ny cn gi n), i tng file c in ra.

3.5

Dng Python nh mt my tnh b ti

iu ny c ngha l ngoi cc cng dng khc ra, Python c th c s dng nh mt my tnh tin dng (m ti cng thng dng nh vy). Chng hn tnh 105% ca s 88.88 l bao nhiu, ti c th g % python >>> 1.05*88.88 93.323999999999998 Ta c th chuyn i nhanh chng gia h thp phn v h m 16: >>> 0x12 18 >>> hex(18) 0x12 Nu cn cc hm ton hc, trc ht ta phi nhp (import) th vin ton ca Python. iu ny ging vi khai bo #include ca C/C++ trong m ngun kt ni th vin vi m my. Sau chng ta cn gi tn cc hm theo sau tn ca th vin. Chng hn, cc hm sqrt() and sin() phi c dn trc bi math:9 >>> import math >>> math.sqrt(88) 9.3808315196468595 >>> math.sin(2.5) 0.59847214410395655

4
4.1

Mt v d hng dn trong 10 pht


M lnh ca v d

Chng trnh ny c vo 1 file vn bn m tn file c nhp vo du nhc lnh, sau in ra s dng v s t trong file :
9

Mt phng php trnh vit t math ng trc s c trnh by trong phn 10.1.2.

10

# c vo file text c tn trong tham s dng lnh, # v bo co s dng v s t trong file import sys def checkline(): global l global wordcount w = l.split() wordcount += len(w) wordcount = 0 f = open(sys.argv[1]) flines = f.readlines() linecount = len(flines) for l in flines: checkline() print linecount, wordcount Chng hn, file chng trnh c tn l tme.py, v ta c mt file text x vi ni dung:

This is an example of a text file.

(File ny c 5 dng, trong dng u v dng cui u trng.) Nu chy chng trnh vi file ni trn, ta nhn c kt qu: python tme.py x 5 8 Nhn b ngoi, dng m lnh trng ging nh ca C/C++. Trc tin l lnh import, tng t vi #include (vi s lin kt tng ng lc bin dch), nh ni trn. Tip theo l nh ngha mt hm, sau l phn chng trnh chnh. V c bn, y l mt cch nhn d hiu nhng hy ghi nh rng b dch lnh Python s x l cc cu lnh theo th t, bt u t u chng trnh. Chng hn, khi dch lnh import, c th s km theo vic thc hin mt s cc cu lnh khc, nu nh m-un c import c mt s cu lnh t do trong (iu ny s cp sau). Vic x l cu lnh def khng thc hin lnh g ngay, thay vo ch l khai bo hm c th c thc hin. Vi v d th hai ny, ta c th thm mt s c im mi so vi v d u tin: s dng cc tham s dng lnh c ch x l file 11

thm v cc list nh ngha hm nhp th vin Phm vi ca bin Cc c im ny c gii thiu trong cc phn tip theo: Cc tham s dng lnh Trc ht, hy xt n sys.argv. Python gii thiu mt m-un (module) (th vin) tn l sys, m mt trong nhng thnh vin ca n l bin argv. Thc ra argv l mt danh sch, ging nh mt thnh phn c tn tng t trong C/C++.10 Phn t 0 ca danh sch chnh l tn file lnh, trong trng hp ny l tme.py, v cc phn t tip theo c vit theo quy tc nh C/C++. Trong v d ny, khi ta chy chng trnh vi file tn l x th sys.argv[1] chnh l chui x (cc chui trong Python thng c t trong du nhy n). Bi v th vin (m-un) sys khng c nhp t ng khi Python khi ng, ta cn phi import n. Trong c C/C++ ln Python, cc tham s dng lnh tt nhin l cc chui k t. Nu ta cn cc con s th phi dng lnh i. Chng hn, mun c s nguyn ta dng int() (vi C l atoi()).11 . Vi s thc ta i bng float().12

4.2

Gii thiu v x l file

Hm open() cng ging nh trong C/C++. N c nhim v to ra mt i tng f thuc lp file. Hm readlines() ca lp file tr v gi tr mt danh sch cha cc dng trong file . Mi dng l mt chui k t, mi chui nh vy l mt phn t ca danh sch. Bi v file ny c 5 dng nn gi tr c tr li t hm readlines() l mt danh sch gm 5 phn t [,This is an,example of a,text file,] ( cui mi chui nu trn u c mt k t xung dng, d khng c hin th c th)

5
5.1

Khai bo hay khng khai bo, Phm vi, Hm, v.v...


Khng c phn khai bo

Trong Python, cc bin khng c khai bo. Mi bin c to thnh khi c lnh gn u tin cho n. Chng hn, trong chng trnh tme.py nu trn, bin flines khng tn ti cho tn lc cu lnh: flines = f.readlines()
Tuy vy, trong Python khng c c argc nh trong C/C++. Python, mt ngn ng hng i tng, coi danh sch nh nhng i tng. Do vy, s phn t ca danh sch cng gn lun vo trong i tng . Nu cn bit s phn t ca argv, ta c th dng len(argv). 11 int() ca Python nh floor() ca C/C++ 12 Trong C/C++, dng atof, hoc sscanf()
10

12

c thc hin. Hn na, mt bin cha c gn gi tr g th n nhn gi tr None (ta c th gn None cho mt bin, hoc dng None kim tra bin bng lnh if, v.v...).

5.2

Bin ton cc v bin cc b

Thc ra Python khng h c bin ton cc theo ng ngha nh C/C++, tc l phm vi ca bin l c chng trnh. Chng ta s bn v iu ny sau trong phn 10.1.5, nhng y ta gi s m ngun ch gi gn trong mt file .py. Trong trng hp ny, Python c bin ton cc rt ging vi C/C++. Python c gng suy din phm vi ca mt bin da trn v tr ca n trong m lnh. Nu nh mt hm bao gm bt k m lnh no m gn gi tr cho mt bin, th bin c coi l cc b. Bi vy, trong on m lnh c hm checkline(), Python s cho rng l v wordcount l cc bin cc b ca checkline(), nu ta khng ni r g thm (bng t kho global, s cp sau). Vic s dng cc bin ton cc s gin ho nhng g nu ra y, v c nhn ti tin rng nhng li ch trch v cc bin ton cc l khng ng tin cy. (Xem http://heather.cs.ucdavis.edu/~matloff/ globals.html.) Trn thc t mt trong nhng lnh vc chnh ca lp trnh, threads, vic s dng cc bin ton cc rt quan trng (bt buc). Tuy vy, bn c th t nht l mun nhm li tt c cc bin ton cc thnh mt lp, nh ti lm. Xem Ph lc A.5. nh ngha hm; trong Python c kiu bin khng? D nhin t kho def dng nh ngha hm. Mt ln na bn cn ch rng du hai chm v cch vit tht u dng c s dng nhm to ra mt khi lnh trong phn ni dung ca hm. Mt hm c th tr v gi tr bng cch dng t kho return, chng hn: return 8888 Tuy nhin, ph hp vi tnh cht ca Python, hm cng khng c mt kiu xc nh cho d n c tr v mt gi tr v i tng tr v c th l bt c loi no: s nguyn, danh sch, ...

Mt s hm c sn trong Python

Hm len cho s lng cc phn t c trong mt danh sch, trong trng hp v d nu trn l s dng trong file (v readlines() tr v mt list m mi phn t l mt dng trong file ). Phng thc split() l mt thnh phn trong lp string.13 Mt trng hp thng gp l chia ct mt chui k t thnh danh sch gm nhng t n l.14 Do d nu ta c l l This is an, dng lnh checkline() th danh sch w s l [This,is,an]. (Nu trong trng hp dng u tin l dng trng th danh sch w s l danh sch trng, [].) Kiu ca bin / gi tr
13 14

Cc hm thnh phn ca mt lp c gi l phng thc. Du cch c mc nh s dng nh k t chia ct, mc d cc k t/chui khc cng c th ng vai tr ny.

13

L mt ngn ng kch bn in hnh, Python khng khai bo nhng kiu bin (nguyn, thc) nh trong C/C++. Tuy vy, b dch lnh Python cng theo di kiu ca tt c cc i tng trong b nh. Cc kiu bin trong Python gm cc k hiu s (cn gi l v hng), dy (danh sch hoc tuple) v cc t in (s c trnh by trong phn 6.2.3), cc lp, cc hm, v.v...

6.1

Cc chui so vi cc gi tr s

Khc vi Perl, Python c s phn bit gia kiu s v chui k t biu din s . Cc hm eval() v str() c th c s dng chuyn i qua li. Chng hn: >>> 2 + 1.5 Traceback (most recent call last): File "<stdin>", line 1, in ? TypeError: unsupported operand type(s) for +: int and str >>> 2 + eval(1.5) 3.5 >>> str(2 + eval(1.5)) 3.5 Ngoi ra cn c int() chuyn i t dng chui sang s nguyn, v float(), chuyn i t dng chui sang s thc. >>> n = int(32) >>> n 32 >>> x = float(5.28) >>> x 5.2800000000000002 Xem thm phn ?? Cc danh sch l trng hp c bit ca dy, chng u c kiu mng nhng cn mt s iu khc bit. Tuy vy cn ch cc im chung sau (mt s s c gii thch ngay di y) u c th c p dng cho bt k kiu dy no: vic s dng cp ngoc vung ch nh tng phn t ring l (chng hn x[i] hm c sn len() s cho s phn t c trong dy 15 cc php ton dng lt ct ( chit xut dy con). s dng + v * thc hin ghp ni v nhn bn.
15

Hm ny cng c th p dng cho kiu t in.

14

6.2

Danh sch (mng)

Nh ni trc, cc danh sch c biu th bng cp ngoc vung v cc du phy. Chng hn, Cu lnh: x = [4,5,12] s gn x cho mt mng 3 phn t xc nh. Cc mng c th iu chnh kch thc, bng cch dng cc hm append() (b sung) hoc extend() (m rng) ca lp list. Chng hn, sau cu lnh trn nu ta vit tip: x.append(-2) th x s c gi tr bng [4,5,12,-2]. Mt s ton t khc cng c th p dng cho danh sch, mt s trong c minh ho trong on lnh sau: >>> x = [5,12,13,200] >>> x [5, 12, 13, 200] >>> x.append(-2) >>> x [5, 12, 13, 200, -2] >>> del x[2] >>> x [5, 12, 200, -2] >>> z = x[1:3] # ct lt mng: cc phn t t 1 n 3-1=2 >>> z [12, 200] >>> yy = [3,4,5,12,13] >>> yy[3:] # tt c cc phn t bt u t th t 3 tr i [12, 13] >>> yy[:3] # tt c cc phn t t u cho n trc phn t th 3 [3, 4, 5] >>> yy[-1] # ngha l 1 phn t tnh t u bn phi 13 >>> x.insert(2,28) # in thm 28 vo v tr 2 >>> x [5, 12, 28, 200, -2] >>> 28 in x # kim tra phn t c thuc mng khng, 1=c, 0=khng 1 >>> 13 in x 0 >>> x.index(28) # tm v tr ca phn t c tn tng ng trong danh sch) 15

2 >>> x.remove(200) # khc so vi delete, v n v ch ra gi tr phn t cn xa thay v v tr ca n >>> x [5, 12, 28, -2] >>> w = x + [1,"ghi"] # ghp cc danh sch vi nhau >>> w [5, 12, 28, -2, 1, ghi] >>> qz = 3*[1,2,3] # lp li cc phn t ca danh sch >>> qz [1, 2, 3, 1, 2, 3, 1, 2, 3] >>> x = [1,2,3] >>> x.extend([4,5]) >>> x [1, 2, 3, 4, 5] >>> y = x.pop(0) # xo v tr li gi tr va xo khi danh sch >>> y 1 >>> x [2, 3, 4, 5] Chng ta cng c th thy ton tin trong v d trn c dng trong mt vng lp for. Mt danh sch c th bao gm cc thnh phn khc loi, thm ch c cc danh sch khc. Cch lp trnh thng dng ca Python bao gm mt smo Python lin quan n kiu dy, chng hn mt cch n gin tro i gi tr hai bin x v y: >>> >>> >>> >>> 12 >>> 5 x = 5 y = 12 [x,y] = [y,x] x y

Cc mng nhiu chiu c th c m t nh mt danh sch gm cc danh sch bn trong n, chng hn: >>> x = [] >>> x.append([1,2]) >>> x [[1, 2]] >>> x.append([3,4]) >>> x [[1, 2], [3, 4]] >>> x[1][1] 4 16

6.2.1

Cc Tuple

Tuple cng ging nh cc dy, nhng l loi khng hon v c, ngha l khng th thay i c. Chng c ngoc trn thay v ngoc vung.16 Ta c th dng cc php ton tng t nh phn trc i vi tuple, tr cc ton t gy nn s thay i tuple. Do chng hn: x = (1,2,abc) print x[1] # in s 2 print len(x) # in s 3 x.pop() # khng thc hin c do lm thay i tuple Mt hm rt hu dng l zip, cho php xu chui cc thnh phn tng ng t cc danh sch khc nhau to thnh mt tuple mi, chng hn >>> zip([1,2],[a,b],[168,168]) [(1, a, 168), (2, b, 168)] 6.2.2 Chui k t

Chui k t chnh l tuple ca cc phn t k t. Tuy nhin chng c vit gia cp du nhy kp thay v cp ngoc trn, v c kh nng linh hot hn so vi mt tuple tng ng. Chng hn: >>> x = abcde >>> x[2] c >>> x[2] = q # khng c hiu lc vi chui, v tnh khng th thay i Traceback (most recent call last): File "<stdin>", line 1, in ? TypeError: object doesnt support item assignment >>> x = x[0:2] + q + x[3:5] >>> x abqde (Bn c th hi ti sao lnh gn cui cng >>> x = x[0:2] + q + x[3:5] khng vi phm tnh khng th thay i. L do l x thc s l mt con tr v ta ch n gin l tr n n mt chui k t mi c to thnh t cc chui c. Xem thm phn 8.) Nh lu , chui c nhiu tnh nng hn l tuple gm cc k t
Cp ngoc trn ch bt buc trong trng hp trnh gy nhm ln, chng hn nh cc tham s trong hm. Mt du phy c th s dng trong trng hp tuple rng, ngha l (,).
16

17

>>> x.index(d) # nh mong i 3 >>> d in x # nh mong i 1 >>> x.index(cd) # mt bt ng th v 2 Nh vy chng ta thy c, hm index ca lp str c overload, v do linh hot hn. C nhiu cc hm tin dng khc trong lp str. Chng hn, ta thy hm split() phn trc. Hm ngc ca n l join(). Khi dng hm ny vi mt chui, v km theo mt lot cc chui tham bin khc, kt qu thu c s l mt lot cc chui k t tham bin c ni vi nhau bng chui ban u.17 >>> --- .join([abc,de,xyz]) abc---de---xyz >>> q = \\n .join((abc,de,xyz)) >>> q abc\\nde\\nxyz >>> print q abc de xyz Mt s v d tip theo:18 >>> x = abc >>> x.upper() ABC >>> abc .upper() ABC >>> abc .center(5) # cn gia chui trong mt khong rng 5 k t abc Lp str c dng sn trong cc phin bn mi ca Python. Vi cc phin bn c bn cn thm cu lnh: import string Lp string ny n gi vn tn ti, v lp mi str khng hon ton sao chp t n. 6.2.3 Sp xp

Hm sort() ca Python c th c p dng cho bt c kiu dy no. Vi cc kiu khng phi v hng, ta dng hm so snh tr li cc gi tr m, bng 0 hoc dng, bng cc k hiu <, = or >. Sau y l minh ha trong mt mng gm cc mng c sp xp theo phn t th hai.
V d di y cho thy cch dng mi ca join(). Ngy nay cc phng thc x l chui l thnh phn sn c ca Python. Xem thm so snh gia mi v c di y. 18 C rt nhiu hm x l chui k t trong m-un re (regular expression).
17

18

>>> x = [[1,4],[5,2]] >>> x [[1, 4], [5, 2]] >>> x.sort() >>> x [[1, 4], [5, 2]] >>> def g(u,v): ... return u[1]-v[1] ... >>> x.sort(g) >>> x [[5, 2], [1, 4]] (Dng hm lambda c th thc hin d dng hn. Xem thm phn 14.1.) Kiu T in T in l cc mng lin kt. Phn sau s bn n ngha k thut ca n; nhng trn quan im lp trnh thun ty, ngha l ta c th thit lp mt mng vi ch s khng cn l s nguyn. Cu lnh x = {abc:12,sailing:away} gn x cho mt mng 2 phn t vi x[abc] bng 12 v x[sailing] bng away. Ta ni rng abc v sailing l cc kha (key), cn 12 v away l cc gi tr (value). Cc kha c th l bt c i tng no thuc loi khng bin i, nh s, tuple hoc chui.19 Vic s dng kha l cc tuple tng i ph bin trong cc chng trnh Python, v bn cn ch rng ta c th tn dng kh nng ny. Xt su xa, x y c th l mt mng 4 phn t v vic thc hin lnh kiu nh w = x[sailing] s yu cu b dch lnh Python duyt qua mng tm t khoa sailing. Nu tin hnh theo cch tm kiu tuyn tnh s chm, cho nn cu trc bn trong s c dng bng hash. y l l do ti sao kiu t in ca Python (tng t Perl) thc ra c gi l hash. Sau y l cc v d s dng mt s hm thnh vin ca lp t in: >>> x = {abc:12,sailing:away} >>> x[abc] 12 >>> y = x.keys() >>> y [abc, sailing] >>> z = x.values() >>> z
By gi bn c th hiu ti sao Python li phn bit gia tuple v danh sch. Nu cho php cc kha thay i th thc s s gay go, v c th dn ti chng trnh c cha nhiu li.
19

19

[12, away] x[uv] = 2 >>> x {abc: 12, uv: 2, sailing: away} Ch cch ta b sung thm phn t mt vo x v tr gn cui. Nhp s liu t bn phm Hm raw_input() s cho hin ra du nhc v c vo gi tr m ta g t bn phm. Chng hn: name = raw_input("enter a name: ") s xut hin enter a name:, Sau c ch ta g vo, v lu ni dung ny vo bin name. Ch rng d liu ngi dng nhp vo c tr li di dng chui, v cn phi chuyn i nu nh ta mun nhp s. Trong trng hp khng mun c du nhc, ch cn khng ch nh n: >>> y = raw_input() 3 >>> y 3 6.2.4 Tc dng ca __name__

Trong mt s trng hp, ta rt cn bit mt m-un c phi c chy trc tip khng hay l thng qua import. iu ny c th xc nh c bng cch dng bin c sn __name__ ca Python nh sau. Bt c khi no b dch lnh Python ang hot ng th n c gi l chng trnh cp cao nht (top-level program). Chng hn nu bn g % python x.py th m lnh trong x.py l chng trnh cp cao nht. Tng t nh vy, nu bn ang chy ch tng tc dng lnh, th lnh bn trc tip g vo cng l chng trnh cp cao nht. i vi b dch lnh th chng trnh tng tc c gi l __main__, cn m-un hin ang c chy gi l __name__. Do d mun kiu tra mt m-un c phi c chy khng hay l c nhp (import) t cu lnh khc, ta phi kiu tra xem __name__ c phi l __main__ hay khng. Chng hn, ta thm cu lnh: print __name __

vo v d u tin, trong phn 3.1 ca file fme.py:

20

print __name __ for i in range(10): x = 0.1*i print x print x/(1-x*x) Hy chy chng trnh ny 2 ln. Ln u ta chy n trc tip: % python fme.py __main __ 0.0 0.0 0.1 0.10101010101 0.2 0.208333333333 0.3 0.32967032967 ... [phn kt qu cn li khng vit ra y] By gi xem iu g s xy ra nu ta chy n t mi trng tng tc dng lnh: >>> __name __ __main __ >>> import fme fme 0.0 0.0 0.1 0.10101010101 0.2 0.208333333333 0.3 0.32967032967 ... [phn kt qu cn li khng vit ra y] Cu lnh trong m-un ca chng ta print __name __

ln th nht s in ra __main__, nhng ln th hai s in ra fme. Thng thng (theo thi quen trong lp trnh C), mi chng trnh chnh c tp hp vo trong mt hm tn l main(). Ta s thay i v d trn theo cch ny thnh file fme2.py:

21

def main(): for i in range(10): x = 0.1*i print x print x/(1-x*x) if __name __ == __main __: main()

Li ch ca cch lm ny l khi ta nhp m-un ny, m lnh s khng c thc hin ngay. Thay vo , fme2.main() phi c gi, hoc l bng nhiu m-un hoc l bng b dch lnh tng tc. Trng hp th hai c minh ha bng v d sau: >>> import fme2 >>> fme2.main() 0.0 0.0 0.1 0.10101010101 0.2 0.208333333333 0.3 0.32967032967 0.4 0.47619047619 ... Bn cnh cc im khc, iu ny rt quan trng trong vic s dng cc cng c g li (Section A). Do d hy to thi quen thng xuyn thit lp truy cp vo main() nh vy trong chng trnh.

Lp trnh hng i tng (Object-Oriented Programming), OOP

i lp vi Perl, bn thn Python c tnh hng i tng ngay trong gc r. Do d n c giao din hng i tng (OOP) r hn, p hn. V d m lnh chng trnh Ta s minh ha bng vic xy dng mt lp c nhim v x l file vn bn. Sau y l ni dung file tfe.py: class textfile: ntfiles = 0 # m s i tng file text def __init __(self,fname): textfile.ntfiles += 1 self.name = fname # tn self.fh = open(fname) # handle ca file

22

self.lines = self.fh.readlines() self.nlines = len(self.lines) # s dng self.nwords = 0 # s ch self.wordcount() def wordcount(self): "dem so chu trong file" for l in self.lines: w = l.split() self.nwords += len(w) def grep(self,target): "dem tat ca cac dong co chua chu can tim" for l in self.lines: if l.find(target) >= 0: print l a = textfile(x) b = textfile(y) print "So file text duoc mo la", textfile.ntfiles print "Sau day la mot so thong tin ve chung (ten, so dong, so chu):" for f in [a,b]: print f.name,f.nlines,f.nwords a.grep(example) Ngoi file x c s dng trong phn 4 trn, ti cng c file y gm 2 dng. Sau y l kt qu thu c khi chy chng trnh: % python tfe.py So file text duoc mo la 2 Sau day la mot so thong tin ve chung (ten, so dong, so chu): x 5 8 y 2 5 example of a

7.1

T kha self

Hy cng xem xt lp textfile. iu u tin cn lu l s xut hin ca t kha self, vi ngha l thc th hin hnh ca lp, tng t nh this i vi C++ v Java. Do d self l mt con tr ti thc th hin ti ca lp.

7.2

Cc bin thc th

Trong thut ng ca lp trnh hng i tng, mt bin thc th x ca mt lp l mt bin thnh vin m vi n mt thc th ca lp c mt gi tr ring bin ca bin . Trong th gii ca C++ v Java, bn bit n chng di tn bin khng tnh (non-static). Thut ng bin thc th l mt thut ng chung trong lp trnh hng i tng, khng phi l ring cho tng ngn ng.

23

thy c chng hot ng nh th no i vi Python, trc ht hy nh li l mi bin ca Python c hnh thnh khi ta gn cho n mt gi tr. Bi vy, mt bin thc th trong mt lp ca Python cng khng tn ti cho n tn khi n c gn gi tr. self.name = fname # tn

c thc hin, bin thnh vin name cho thc th hin ti ca lp c to ra, v n c gn gi tr nh sn. Cc bin lp Mt bin lp v, c chung gi tr i vi tt c cc thc th trong lp 20 c thit k theo cch ca mt s tham chiu vo v trong m ngun, pha bn trong lp nhng khng phi l trong bt c phng thc no ca lp . V d nh on m trn: 21 ntfiles = 0 # m s i tng file vn bn

Ch rng mi bin lp v ca mt lp u c tham chiu vi dng u.v trong phm vi cc phng thc ca lp v trong cc on m bn ngoi phm vi lp. Vi on m bn trong lp nhng ngoi phng thc, c th vit gn tham chiu l v. By gi hy dnh cht thi gian r sot li on chng trnh trn, v xem cc v d v iu ny vi bin ntfiles ca chng ta. 7.2.1 To lp v xa lp

Hm khi to lp phi c tn l __init()__. Tham bin self l bt buc, v sau bn c th tham chiu tham bin khc, nh ti trnh by trong v d trn, l mt tn file.22 Hm xa lp l __del()__. Ch rng hm ny ch c thc hin khi vic thu gom rc trong b nh hon tt, ngha l khi ton b cc bin tr ti i tng b mt.

7.3

Cc phng thc vi thc th

Phng thc wordcount() l mt phng thc thc th theo ngha c p dng ring cho mt i tng cho trc ca lp.23 Khc vi C++ v Java vi this l mt tham bin ngm nh cho cc phng thc thc th Python li lm sng t quan h ny mt cch thng minh; tham bin self l bt buc.
Mt ln na, trong th gii ca C++ v Java, n c bit n vi tn bin tnh. V d ny ta t on m vo phn u ca lp, nhng thc t n c th ng cui lp, hoc gia hai phng thc, min l khng phi trong mt phng thc no. Trong trng hp t trong mt phng thc, ntfiles s c coi nh mt bin a phng trong phng thc , y l iu ta hon ton khng mong mun. 22 Tham bin self l bt buc, nhng tn ca n c th khc. Khc vi C++/Java, self khng phi l mt tn dnh ring (t kha). Bn c th s dng bt c tn gi no min l phi thng nht, nh trong phng thc __init()__ v d di y. Nhng v hnh thc s khng hay nu ta s dng t khc. 23 Mt ln na, trong thut ng ca C++/Java, y l nhng phng thc khng-tnh.
21 20

24

7.4

Docstring

C mt chui k t trong du nhy kp, xc nh s ch trong file, ngay phn u ca wordcount(). N c gi l docstring. y l mt dng ch thch, nhng c tc dng khi chng trnh c thc hin, do d c th c s dng vi mc ch kiu nh g li. Bn cnh n cho php ngi dng ch c trong tay cc method di dng bin dch (khng phi m ngun), chng hn nh trong phn mm thng mi, kh nng truy cp n ch thch. Sau y l mt v d v cch truy cp, s dng file tf.py nu trn: >>> import tf >>> tf.textfile.wordcount. __doc __ dem so chu trong file Mt docstring thng ko di trn vi dng; do vy ta dng du 3 nhy to loi chui ny. Phng thc grep() l mt phng thc thc th khc, ci ny km vi tham bin self bn cnh n Cn ni thm l cc tham bin phng thc trong Python ch c th truyn theo gi tr, theo ngha ca C th cc hm c tc dng ph i vi tham s ch khi tham s l con tr (Python khng c kiu con tr theo ng ngha, nhng n c cc tham chiu, xem phn 8.) Cn ch rng grep() tn dng mt trong s cc php ton chui ca Python, l find(). N tm kim chui tham bin bn trong chui i tng, sau tr li chui s c ln xut hin u tin, hay -1 nu khng tm thy.24

7.5

Cc phng thc lp

Trc phin bn 2.2, Python khng h tr chnh thc cc phng thc lp, ngha l cc phng thc khng p dng cho tng i tng c th ca lp. Nay Python c hai cch (hi khc nhau) thc hin vic ny, l s dng cc hm staticmethod() v classmethod(). Ti s trnh by cch s dng cu hm th nht, vi v d m rng m lnh trong phn 7 i vi lp textfile: class textfile: ... def totfiles(): print "tong so file text la", textfile.ntfiles totfiles = staticmethod(totfiles) ... # trong phn "main" ... textfile.totfiles() ... Ch rng cc phng thc lp khng c tham bin self.
Chui cng c th c x l nh mt danh sch cc k t. Chng hn, geometry c th coi l mt danh sch gm 8 phn t v dng find() vi chui con met s cho kt qu l 3.
24

25

Cn ch rng phng thc ny c th c gi ngay c khi khng c thc th no ca lp textfile. Trong v d nu ra y, 0 s l kt qu c in ra, v khng c file no c m.25

7.6

Cc lp suy din

Tnh k tha l mt phn quan trng trong trit l ca Python. Mt cu lnh kiu nh class b(a): khi to nh ngha mt lp con b ca mt lp a. Ta cng c th thc hin k tha nhiu ln. Ch rng khi constructor ca mt lp suy din c gi th constructor ca lp c s li khng c gi cng. Nu bn mun kch hot constructor ca lp ny, bn phi t lm ly, chng hn class b(a): def __init __(self,xinit): # constructor ca lp b self.x = xinit # nh ngha v khi to mt bin thc th x a. __init __(self) # gi constructor ca lp c s Theo cc vn bn hng dn chnh thc ca Python th[Theo cch nhn ca C++] cc phng thc ca Python u thc s l o. Nu bn mun m rng thay v ghi ln mt phng thc ca lp c s, bn c th tham chiu n lp c s bng cch thm vo pha trc tn ca lp c s, nh trong v d ang xt, l a.__init__(self).

7.7

Mt lu v lp

Mi thc th lp trong Python hot ng nh mt t in. Chng hn, trong chng trnh tfe.py trn, i tng b c thc hin nh mt t in. Ngoi cc im khc ra, diu ny cng c ngha l bn c th thm cc bin thnh phn vo thc th lp trong lc chng trnh ang chy, ngha l rt lu sau khi to ra thc th. Chng hn, trong phn main ca chng trnh, ta c th c mt cu lnh kiu nh: b.name = zzz

Tm quan trng ca vic hiu c tham chiu i tng

Mt bin c gn gi tr c dng thay i c thc cht l mt con tr ti i tng cho. Chng hn, xt on lnh sau:
Ch rng s 0 khc vi gi tr None ca Python. Ngay c khi ta cha to cc thc th ca lp textfile, m lnh ntfiles = 0 vn s c thc hin khi ta ln u chy chng trnh. Nh cp n t trc, b dch lnh Python thc hin file t dng th nht tr i. Khi n dch n dng class textfile: th tip theo s thc hin mt m lnh bn ngoi cc phng thc trong nh ngha lp.
25

26

>>> >>> >>> >>> 5 >>> >>> >>> [1, >>> >>> [1,

x = [1,2,3] y = x # x v y by gi u ch ti [1,2,3] x[2] = 5 # iu ny c ngha l y[2] cng chuyn thnh 5 ! y[2] x = [1,2] y = x y 2] x = [3,4] y 2]

Trong on u chng trnh, x v y u l cc tham chiu n mt danh sch, mt i tng kiu thay i c. Cu lnh x[2] = 5 thay i mt phn ca i tng , nhng x vn ch ti i tng ny. Mt khc, vi on lnh x = [3,4] by gi x li t thay i, khi n ch ti mt i tng khc, trong khi y vn ch ti i tng ban u. Nu nh trong v d trn ta ch mun copy tham chiu ca danh sch t x ti y, ta c th dng cch ct lt, chng hn y = x[:] Nh vy y v x s ch ti cc i tng khc nhau, v khi mc d cc i tng ny tm thi c cng gi tr nhng nu i tng c tr bi x c thay i th i tng tr bi y s khng thay i. Mt vn quan trng tng t ny sinh vi cc tham bin trong lnh gi hm. Bt k tham bin no tr ti mt i tng loi c th thay i th n c th thay i gi tr ca i tng t bn trong ca hm, chng hn: >>> ... ... >>> >>> >>> 5 >>> ... ... def f(a): a = 2*a x = 5 f(x) x def g(a): a[0] = 2*a[0]

27

>>> y = [5] >>> g(y) >>> y [10] Cc tn hm cng l tham chiu n cc i tng. Th m chng ta vn ngh l tn hm thc cht chnh l mt con trloi thay i ctr ti m lnh ca hm . Chng hn, >>> ... ... >>> ... ... >>> 1 >>> 2 >>> >>> 2 >>> 1 def f(): print 1 def g(): print 2 f() g() [f,g] = [g,f] f() g()

C th xa cc i tng bng lnh del. Nu bn mun thc hnh thm v cc k hiu ny, hy xem phn A.4.

So snh cc i tng

Ta c th dng ton t < so snh cc dy, chng hn if x < y: i vi cc danh sch x and y, vic so snh l theo tng thnh phn ln lt t tri qua phi. Chng hn, >>> [12,tuv] < [12,xyz] True >>> [5,xyz] > [12,tuv] False Tt nhin vi cc chui cng l dy nn ta cng c th so snh chng: >>> abc < tuv 28

True >>> xyz < tuv False >>> xyz != tuv True C th thc hin so snh vi cc i tng khng phi dy, nh cc thc th lp, bng cch nh ngha mt hm __cmp()__ trong lp . Ta c th sp xp tinh vi hn bng cch kt hp hm sort() ca Python vi mt hm dng ring cmp().

10

Cc m-un v gi chng trnh

Bn nghe thng xuyn rng nguyn tc quan trng trong thit k phn mm l vit m lnh theo hnh thc m-un, ngha l chia nh n thnh cc thnh phn khc nhau, t trn xung, v lm cho m lnh c th c s dng li, chng hn vit n theo cch tng qut v sau ny bn hoc ngi khc c th tn dng li chng trong mt s chng trnh khc. Khng ging vi cc kiu lm phn mm trng giang i hi, cch ny mi l thc s ng n! :-)

10.1

M-un

Mt m-un l mt tp hp cc lp, cc hm th vin, v.v... vo trong mt file. Khc vi Perl, khng cn thc hin g thm chuyn mt file thnh mt m-un. Bt k file no cng phn m rng .py u l m-un!26 10.1.1 V d m lnh chng trnh

1/2lm v d hy l 1/2 l 1/2 textfile t 1/2v dta lm 1/2trn. By gi ta 1/2 n 1/2vo mt file ring, tf.py, v 1/2 ni dung sau: # file tf.py class textfile: ntfiles = 0 # m s i tng file text def __init __(self,fname): textfile.ntfiles += 1 self.name = fname # tn self.fh = open(fname) # handle ca file self.lines = self.fh.readlines() self.nlines = len(self.lines) # s dng self.nwords = 0 # s ch self.wordcount()
26

Ch rng tn file cng phi bt u bng mt ch ci, khng phi ch s hay k t no khc.

29

def wordcount(self): "m s ch trong file" for l in self.lines: w = l.split() self.nwords += len(w) def grep(self,target): "in ra tt c cc dng cha ch cn tm" for l in self.lines: if l.find(target) >= 0: print l (Ch rng mc d m-un ca ta y ch bao gm mt lp, nhng thc t ta vn c th c vi lp, cng thm cc bin ton cc, m lnh chy c m khng nm trong bt c hm no, v.v...) File chng trnh th tftest.py, by gi s c dng: # file tftest.py import tf a = tf.textfile(x) b = tf.textfile(y) print "s lng file text ang m l:", tf.textfile.ntfiles print "Sau y l mt s thng tin v chng (tn, s dng, s t):" for f in [a,b]: print f.name,f.nlines,f.nwords a.grep(example) 10.1.2 Lnh import lm vic th no?
27

B dch lnh Python khi thy lnh import tf, s tm ni dung ca file tf.py. tf.py, nu c th chy c s c thc hin, trong trng hp ny l: ntfiles = 0 # m s i tng file text

Bt k m lnh no trong

(M lnh thc hin trong m-un c th s khng nm trong cc lp. Hy xem iu g s xy ra nu ta thc hin import fme2 trong mt v d phn 6.2.4 di y.) Sau khi b dch lnh gp tham chiu n tf.textfile, n s tm mc c tn l textfile nm trong m-un tf, ngha l nm trong file tf.py, v sau s thc hin x l. Mt cch lm khc c th l: from tf import textfile a = textfile(x)
27

Trong trng hp ny, ta c th chuyn hai file vo cng mt th mc, nhng sau ny s ch nh ng dn tm kim.

30

b = textfile(y) print "s file vn bn ang m l", textfile.ntfiles print "Sau y l mt s thng tin v chng (tn, s dng, s ch:" for f in [a,b]: print f.name,f.nlines,f.nwords a.grep(example) Bng cch ny ta phi g t hn, bi thay vtf.textfile, ta ch g textfile, lm cho m lnh ri. Nhng cng c tranh lun rng cch ny s khng an ton (iu g s xy ra nu tftest.py ca mt s mc khc cng tn textfile?) v khng r rng (v tr ban u ca textfile trong tf c th s gip ta phn nh r hn trong trng hp cc chng trnh ln). Cu lnh from tf import * s nhp tt c mi th trong tf.py theo cch ny. Trong bt k trng hp no, bng cch tch ring lp textfile, ta tng cng m-un ha m lnh to iu kin cho vic ti s dng sau ny. 10.1.3 M lnh c bin dch

Tng t trng hp ca Java, b dch lnh Python s bin dch m lnh v dng bytecode cho my o Python. Nu nh m lnh c import th m lnh dch c lu vo file vi ui .pyc, do ta khng phi dch li ln na. V cc m-un cng l cc i tng nn tn ca cc bin, hm, lp, v.v... ca mi m-un cng l cc thuc tnh ca m-un . Do vy chng c lu li trong file .pyc, v s c hin th, chng hn, khi bn dng hm dir() trong m-un (Xem phn A.3.1). 10.1.4 Cc vn hn hp

Cc dng lnh t do (khng thuc hm no) trong m-un s c thc hin ngay khi m-un c nhp. M-un l i tng. Chng c th c s dng nh cc tham s cho cc hm, tr li gi tr t hm... Danh sch sys.modules cho thy tt c cc m-un nhp vo chng trnh ang chy. 10.1.5 Ch v bin ton cc

Python khng thc s h tr cc bin ton cc nh C/C++. Mt m-un c nhp ca Python s khng c quyn truy cp ti cc bin ton cc trong m-un ra lnh nhp. Chng hn, ta xt hai file x.py v y.py. # x.py 31

import y def f(): global x x = 6 def main(): global x x = 3 f() y.g() if __name __ == __main __: main()

and y.py: # y.py def g(): global x x += 1 Bin x trong x.py vn xut hin xuyn sut m-un x.py, nhng khng phi trong y.py. Trn thc t dng lnh x += 1 trong file th hai s gy ra li global name x is not defined. (bin ton cc x khng c nh ngha). Thc s l bin ton cc trong m-un ch l mt thuc tnh (ngha l mt thc th thnh vin) ca m-un cng nh vai tr ca mt bin lp trong phm vi lp .

10.2

Che giu d liu

Python khng c dng che giu d liu no tng t nh private v construct nh trong C++. Tuy vy n cng h tr mt phn vic kiu ny. Nu bn thm vo mt du gch thp pha trc tn bin trong mt m-un th bin s khng c nhp trong trng hp ta dng lnh from...import. Chng hn nu m-un tf.py trong phn 10.1.1 ca mt bin z, th cu lnh: from tf import * s c ngha l z c truy cp trc tip thay v phi vit tf.z. Mt khc, nu ta t tn bin ny l _z th cu lnh trn s khng lm cho bin ny c kh nng c truy cp theo _z na; chng ta phi vit tf._z. D 32

nhin l bin vn c th c nhn thy ngoi m-un nhng bng cch yu cu tin t tf. ta c th trnh gy nhm ln vi nhng bin c tn ging n trong cc m-un khc c nhp cng. Hai du gch thp s cho mangling, vi mi du gch thp cng vi tn ca m-un pha trc.

10.3

Cc gi chng trnh

Nh cp trn, ta c th a nhiu lp vo trong cng mt m-un, nu nh cc lp c quan h cht ch. Suy rng ra cho trng hp nu c mt vi m-un c quan h vi nhau. Khi ni dung ca chng khng gn b cht ch ta c th tng chng vo mt m-un rt ln, nhng nu chng c quan h cn thit phi nhp theo mt cch no khc th ln ny c th s dng gi chng trnh. Chng hn, bn mun vit mt s th vin h tr cho phn mm Internet no 1/2 va vit. Bn c mt m-un web.py vi cc lnh vit cho cc chng trnh thc hin truy cp web v mt m-un khc, em.py l phn mm thao tc vi e-mail. Thay v kt hp chng trong mt m-un ln, bn c th t chng ring trong 2 file trong cng th mc, chng hn net. Mun lm cho th mc tr thnh mt gi chng trnh, ch cn mt file c tn __init__.py trong th mc . File ny c th trng, hoc gm mt s lnh khi to trong trng hp cc chng trnh phc tp hn. Mun nhp cc m-un ny, bn vit lnh kiu nh: import net.web Gp lnh ny, b thng dch Python s tm file c tn web.py nm trong th mc net. Th mc net trong trng hp ny phi nm trong mt ng dn tm kim (search path) ca Python. Chng hn nu net c v tr l: /u/v/net th th mc /u/v cn t trong ng dn tm kim ca Python. Trng hp dng h iu hnh Unix vi C shell, bn c th g lnh: setenv PYTHONPATH /u/v Nu bn c mt s th mc c bit kiu ny, hy xu chui chng li phn cch bng cc du hai chm: setenv PYTHONPATH /u/v:/aa/bb/cc Th mc hin hnh c lu tr trong sys.path. N li bao gm mt danh sch cc chui, mi chui l mt th mc, phn cch bi du hai chm. Bn c th in chng hoc dng lnh thay i chng, cng nh cc bin khc.28 Cc th mc gi thng c cc th mc con, th mc con ca con v c th. Mi th mc nh vy phi c mt file __init__.py.
28

Lu rng trc ht cn phi nhp sys.

33

11

X l li

Cng cn ni rng cc hm c sn v th vin ca Python khng c kiu li nh C, tr li m lnh kim tra xem chng c chy thng hay khng. Thay vo bn cn s dng c ch bt ngoi l try/except, chng hn: try: f = open(sys.argv[1]) except: print Li m file:,sys.argv[1] Cc ngoi l khng ch gm thao tc vi file. Hy xem on m sau: try: i = 5 y = x[i] except: print Khng c ch s, i

12
12.1

Phn hn hp
Chy m lnh Python m khng c trc tip m b thng dch

Chng hn ban cn m file x.py. T u n gi ta xem xt cch chy n bng lnh 29 % python x.py Nhng nu trong dng u tin ca file x.py bn vit: \#! /usr/bin/python v s dng lnh chmod ca Unix to ra file x.py chy c, th c th chy x.py bng cch ch cn g % x.py diu ny rt cn thit, chng hn trong trng hp gi chng trnh t mt trang Web. Hay hn na, bn c th bt Unix tm v tr ca Python trong mi trng bng cch t cu lnh sau vo dng u ca file x.py: #! /usr/bin/env python Cch ny linh hot hn, v cc h iu hnh khc nhau c th xp Python vo nhng th mc khc nhau.
29

Phn ny ch dnh ring cho h iu hnh Unix.

34

12.2

In kt qu khng c du xung dng hoc du trng

Khi g lnh print, my s t ng in mt du xung dng. Nhm loi b n, hy thm vo cui cu lnh mt du phy, chng hn: print 5, print 12 # cha in ra g c # by gi in ra 5 12 tip l du xung dng

Thng thng ta dng print vi du phy trong mt vng lp. Cui cng sau khi thc hin vng lp in chui kt qu, mun xung dng ch cn thm mt lnh print khng. Lnh print t ng phn tch cc phn t bng du cch. Nhm trit tiu du cch hy dng ton t ni chui, +, v c th l hm str(), v d x = a y = 3 print x+str(y)

# in ra a3

Bn cnh str(None) s cho ra None.

12.3

nh dng chui

Python h tr kiu printf() ca C, v d print "cc tha s ca 15 l %d and %d" % (3,5) s cho ta cc tha s ca 15 l 3 v 5 Ch cch vit (3,5) thay v 3,5. Trong trng hp sau, ton t % s ngh rng cc ton hng ca n ch l 3, trong khi n cn mt tuple gm hai phn t. Hy nh rng trong mi trng hp khng gy hiu lm th cp ngoc ca tuple c th c b i, nhng tic l trng hp ny li khng nh vy. Cch nh dng ny hay, nhng ngoi lnh in n cn tin dng hn trong cc cng vic x l chui ni chung. Trong cu lnh: print "cc tha s ca 15 l %d v %d" % (3,5) phn "cc tha s ca 15 l %d v %d" % (3,5)

35

l mt ton t chui, n to ra mt chui mi; lnh print ch n gin l in ra chui mi . Chng hn: >>> x = "%d tui" % 12 Bin x by gi l chui 12 tui. y l mt cch thng dng v rt hiu qu.30

12.4

Cc tham bin c tn trong hm

Xt hm sau y: # ne.py; minh ha cho cc tham bin c tn def namedexample(x,y=2,z=abc): print x,y,z y x l mt tham bin thng, cn y v z l cc tham bin c tn. iu c ngha l nu chng khng c ch r trong lnh gi hm th chng s l cc gi tr mc nh ln lt l 2 v abc. Nu ta mun gn gi tr c th cho chng khi gi hm, ta phi nu tn chng. Di y l v d v mt s cch gi hm ny: # testne.py; minh ha cho cc tham bin c tn import ne ne.namedexample(5) ne.namedexample(5,z=12) ne.namedexample(5,y=3,z=12) V sau y l kt qu c in ra: % python testne.py 5 2 abc 5 2 12 5 3 12 iu ny thc s c ch trong cc trng hp khi ta cn mt hm vi nhiu tham bin nhng tham bin li thng c cng mt gi tr
30

Mt s lp trnh vin C/C++ c th nhn thy cch ny ging nh lnh sprintf() ca th vin C.

36

13

V d v cc cu trc d liu trong Python

Di y l mt lp c nhim v x l mt cy nh phn. # bintree.py, mt m-un qun l cc cy nh phn sp xp, cc # gi tr c lu c dng bt k min l tn ti mt quan h sp xp # V d ny ch gii thiu lnh nhm chn thm v in cy nh phn, # nhng bn c th b sung lnh xa, v.v... class treenode: def __init __(self,v): self.value = v; self.left = None; self.right = None; def ins(self,nd): # chn thm nhnh nd vo cy c gc t ti self m = nd.value if m < self.value: if self.left == None: self.left = nd else: self.left.ins(nd) else: if self.right == None: self.right = nd else: self.right.ins(nd) def prnt(self): # in cy con c gc ti self if self.value == None: return if self.left != None: self.left.prnt() print self.value if self.right != None: self.right.prnt() class tree: def __init __(self): self.root = None def insrt(self,m): newnode = treenode(m) if self.root == None: self.root = newnode return self.root.ins(newnode) V sau y l on chy th # trybt1.py: chy th file bintree.py 37

# usage:

python trybt.py cac_so_can_dien_vao

import sys import bintree def main(): tr = bintree.tree() for n in sys.argv[1:]: tr.insrt(int(n)) tr.root.prnt() if __name __ == __main __: main()

Mt iu hay ca Python l ta c th s dng li m lnh cho cc i tng khng phi kiu s min l chng c th so snh c. (Hy nh li phn 9.) Do vy, ta c th p dng cc lp tree v treenode mt cch tng t vi kiu chui: # trybt2.py: # usage: chy th file bintree.py

python trybt.py cac_chuoi_can_them

import sys import bintree def main(): tr = bintree.tree() for s in sys.argv[1:]: tr.insrt(s) tr.root.prnt() if __name __ == __main __: main()

% python trybt2.py abc tuv 12 12 abc tuv hay thm ch l # trybt3.py: chy th file bintree.py

import bintree def main(): tr = bintree.tree() 38

tr.insrt([12,xyz]) tr.insrt([15,xyz]) tr.insrt([12,tuv]) tr.insrt([2,y]) tr.insrt([20,aaa]) tr.root.prnt() if __name __ == __main __: main()

% python trybt3.py [2, y] [12, tuv] [12, xyz] [15, xyz] [20, aaa]

13.1

S dng cc kiu c php c bit

Trong v d ca phn 7, ng ch l dng lnh sau: for f in [a,b]: trong a v b l cc i tng kiu file vn bn. iu ny cho thy thc t cc phn t ca danh sch khng nht thit phi c kiu v hng.31 Quan trng hn, n cho thy phng php s dng Python hiu qu s gip ta trnh khi cc vng lp kiu c in v cc php ton trn mng nh trong C. Chnh iu ny gip cho m lnh tr nn r rng, sng sa v y l mt u im thc s ca Python. Ni chung bn khng nn s dng vng lp for kiu C/C++ ngha l mt bin ch s chng hn, j c kim tra so vi gii hn trn, nh j < 10, v vic tng bin ny sau mi vng lp (chng hn j++). Thc s l bn c th trnh cc vng lp dng minh bch, v bn nn lm Nh vy mi khi c th c. Chng hn, on lnh self.lines = self.fh.readlines() self.nlines = len(self.lines) trong cng mt chng trnh s sng sa hn nhiu so vi cch vit nh trong C, vn gn vi vic dng mt vng lp. Vng lp ny s in ln lt tng dng trong file, v tng bin nlines sau mi vng lp.32 Mt cch khc cng rt hay nhm trnh cc vng lp l s dng c im lp trnh hm ca Python, c bn n trong phn 14. Tn dng cc c php ring ca Python, theo cc Pythonista, l cch gii quyt vn theo kiu Python (Pythonic).
31 32

V chng cng khng nht thit phi c kiu ging nhau. C th trn ln nhiu kiu trong cng mt danh sch. Bn cng cn lu cch tham chiu ti mt i tng khc t trong mt i tng self.fh.

39

14

Cc c im ca lp trnh hm

Cc c im ny cho ta cch gii quyt vn nhanh chng v kn k d rng ta vn c th gii quyt theo cc cch khc c bn hn, nhng m lnh s khng ngn gn v d vit, d sa bng. Ngoi c im u tin k ra y (cc hm Lambda), th cc c im cn li s trit tiu s xut hin tng minh ca cc vng lp v cc ch nh n tng phn t trong dy. Nh nu trong phn 13.1, iu ny lm cho m lnh sng sa hn.

14.1

Cc hm Lambda

Cc hm Lambda gip ta c cch mi nh ngha cc hm rt ngn. Chng gip bn trnh lm ri m lnh vi nhng dng lnh ch c gi ng c mt ln. Chng hn: >>> g = lambda u:u*u >>> g(4) 16 Hy ch rng y KHNG phi l cch s dng in hnh ca cc hm lambda; ch l mt minh ha cho c php. Thng ngi s dng hm lambda khng nh ngha n l loi nh vy; thay vo l bn trong cc hm nh map() v filter() nh di y. Sau y l mt v d khc thc t hn, vit li v d sp xp trong phn 6.2.3: >>> x = [[1,4],[5,2]] >>> x [[1, 4], [5, 2]] >>> x.sort() >>> x [[1, 4], [5, 2]] >>> x.sort(lambda u,v: u[1]-v[1]) >>> x [[5, 2], [1, 4]] Dng tng qut ca hm lambda l: lambda thamBin 1, thamBin 2, ...: biuThc Vy l n cho php ta a vo nhiu tham bin, tuy vy phn thn hm ch c php l mt biu thc m thi.

14.2

Mapping

Hm map() c tc dng chuyn i t mt chui ny sang chui khc bng cch p dng cng mt hm ln lt i vi mi phn t trong dy, v d: 40

>>> z = map(len,["abc","clouds","rain"]) >>> z [3, 6, 4] Nh vy l vi cch ny chng ta trnh phi vit ra mt vng lp for, do m lnh s sng sa hn mt cht, d c v vit hn.33 Trong v d nu trn ta s dng hm c sn, len(). Ta cng c th s dng hm mnh t vit; iu ny thng c thc hin qua hm lambda, chng hn: >>> >>> >>> [1, x = [1,2,3] y = map(lambda z: z*z, x) y 4, 9]

Vic bt buc thn hm lambda ch c c mt biu thc l mt iu kin kh hn ch, chng hn n khong cho php s dng cu trc if-then-else. Nu bn thc s mun lm nh vy, bn c th s dng mo. V d nh bn mun if u > 2: u = 5 ta c th lm nh sau: >>> >>> >>> [1, x = [1,2,3] g = lambda u: (u > 2) * 5 + (u <= 2) * u map(g,x) 2, 5]

R rng y khng phi l mt bin php kh thi tr nhng trng hp n gin. i vi cc trng hp phc tp, chng ta c th s dng mt hm khng phi lambda. Chng hn, sau y l mt cch ci tin cho chng trnh trong phn 4.1: import sys def checkline(l): global wordcount w = l.split() wordcount += len(w) wordcount = 0 f = open(sys.argv[1]) flines = f.readlines() linecount = len(flines) map(checkline,flines) # thay th vng lp for c print linecount, wordcount
Mt ln na ch rng nu ta khng gn cho z, danh sch [3,6,4] vn s c in ra. Trong ch tng tc lnh, bt k biu thc no ca Python m khng phi lnh gn u in ra gi tr ca kt qu.
33

41

Ch rng l by gi l mt tham bin cho checkline(). D nhin l on m ny c th c rt ngn thm, vi phn trung tm ca chng trnh chnh ni trn c i thnh: map(checkline,open(sys.argv[1]).readlines) Nhng iu ny s dn n vic c v g ri chng trnh rt kh khn.

14.3

Lc

Hm filter() hot ng ging nh map(), ch khc l n ly nhng phn t trong dy tha mn mt iu kin nht nh. Hm p dng filter() phi tr gi tr boolean (true hoc false). Chng hn: >>> >>> >>> [5, x = [5,12,-2,13] y = filter(lambda z: z > 0, x) y 12, 13]

Mt ln na, iu ny cho php ta trnh vit vng for v mt lnh if.

14.4

List Comprehension

iu ny cho php ta rt ngn mt vng lp for m cho kt qu l mt danh sch. Ly v d: >>> x = [(1,-1), (12,5), (8,16)] >>> y = [(v,u) for (u,v) in x] >>> y [(-1, 1), (5, 12), (16, 8)] Vit th ny s gn hn so vi u tin l gn [] cho y, sau l vng lp for m trong ta gi y.append()

14.5

Chit gim

Hm reduce() c s dng thc hin cng dn hoc mt php ton s hc kiu nh vy i vi ton b danh sch. Chng hn, >>> x = reduce(lambda x,y: x+y, range(5)) >>> x 10 y range(5) d nhin l [0,1,2,3,4]. Trc ht, hm reduce() cng hai phn t u tin ca [0,1,2,3,4], tc l 0 ng vai tr x v 1 ng vai tr y. Tng ca chng l 1. Sau th tng , 1, li ng vai tr ca 42

x v phn t tip theo ca [0,1,2,3,4], tc l 2, ng vai tr ca y, chng cho ta kt qu l 3, v c nh vy. Cui cng reduce() hon thnh xong nhim v ca n v tr li kt qu l 10. Mt ln na, iu ny cng cho php ta trnh mt vng lp for, cng vi mt cu lnh khi to x bng 0 trc vng for.

15

Cc biu thc pht sinh

Gi nh li rng mt li th ln ca th lp l ta c th thng xuyn s dng chng m khng to ra mt danh sch ln trong b nh. Cc biu thc pht sinh mi c gii thiu trong Python 2.4, cho ta s ci tin tng t i vi list comprehension. Xt v d ngn sau y, trong ta n li list comprehension v gii thiu cc biu thc pht sinh. >>> x = [1,2,4,12,5] >>> [i for i in x] [1, 2, 4, 12, 5] >>> [i for i in x if i > 4] [12, 5] >>> sum(i for i in x if i > 4) 17 >>> min(i for i in x if i > 4) 5 Ni cch khc, mt biu thc pht sinh c cng dng nh mt list comprehension, ch khc hai im sau: biu thc c nm trong cp ngoc trn thay v ngoc vung hm no p dng c cho cc th lp cng c th c p dng cho biu thc34 Tin th cn ni, hm min() cng c th c s dng vi cc tham bin thng thng: >>> min(5,12,3) 3 >>> y = [5,12,4] >>> min(y) 4 Hn na, n cn c th c s dng i vi bt c th g so snh c theo th t trc-sau: >>> min(def,cxyg) cxyg >>> min([4,abc],[8,5],[3,200]) [3, 200] D nhin l max() cng tng t. Nu ta kt hp chng li trong cc biu thc pht sinh th s rt c li.
34

Ch rng cp ngoc trn xung quanh biu thc cng ng vai tr ngoc cho hm.

43

G li

Bn ng nn g li bng cch ch thm cc dng lnh print vo trong chng trnh. Thay vo , hy s dng cng c g li. Nu bn khng thng xuyn s dng cng c ny th s phi lp trnh rt kh khn v tn nhiu thi gian. Xem bi trnh by ca ti ti a ch http://heather.cs.ucdavis.edu/ ~matloff/debug.html.

A.1

Cng c g li sn c trong Python, PDB

B g li sn c trong Python, PDB, tng i s khai, nhng ti vn nu ra di y theo s tng dn mc hu dng: Dng c bn Dng c bn tng cng s dng thm macro c chin lc Dng c bn kt hp vi b g li ha DDD. A.1.1 Dng c bn

Bn s tm thy PDB trong th mc con lib trong h thng file Python. Chng hn, trn h iu hnh Unix, n c th mt ch nh l /usr/lib/python2.2, /usr/local/lib/python2.4,v.v... g li mt script x.py, hy g lnh: % /usr/lib/python2.2/pdb.py x.py (Nu nh x.py c cc tham s dng lnh, chng phi c t sau tn x.py trn dng lnh.) D nhin l v bn s s dng PDB nhiu, tt hn l hy t cho n b danh (v d trong Unix): alias pdb /usr/lib/python2.2/pdb.py nh vy bn ch cn vit mt cch n gin % pdb x.py Mt khi bn trong PDB, hy t im dng u tin, chng hn dng 12: b 12 n c (continue), bng cch ny bn vo file x.py v dng li ch c im dng. Sau tip tc nh bnh thng, vi cc thao tc tng t nh GDB:35
Trong mt s trng hp, cc lnh ny s khng hot ng cho n tn khi bn thc s vo bn trong m ngun cn g li. Chng hn, nu g l (list cc dng) qu sm s gy ra thng bo li.
35

44

b (break) : t mt im dng tbreak : t mt im-dng-mt-ln l (list) : lit k mt s dng trong m ngun n (next) : nhy n dng tip theo, b qua m lnh trn dng hin ti s (subroutine) : nhy n dng tip theo nhng c duyt qua tng lnh ca hm c (continue) : tip tc thc hin cho n tn khi gp im dng mi w (where) : nhn bo co v tnh trng stack u (up) : di chuyn ln mt mc trong stack, chng hn truy vn mt bin a phng ti d (down) : di chuyn xung mt mc trong stack j (jump) : nhy n mt dng khc m khng can thip n m lnh c thc hin h (help) : xem hng dn trc tuyn (ngn gn) (chng hn h b xem hng dn v cu lnh b. n gin hn, g h xem danh sch ton b cc lnh. q (quit) : thot khi PDB Bn nn dng lnh help pdb t nht mt ln. N s cho bit ton b thng tin v cc tnh nng khc nhau ca PDB. Khi vo PDB, du nhc (Pdb) xut hin. Nu bn c mt chng trnh gm nhiu file, cc im dng s c dng module_tn:s_TT_dng. Chng hn, bn c chng trnh chnh l x.py, v n nhp file y.py. Bn thit lp mt im dng dng th 8 trong file y.py nh sau: (Pdb) b y:8 D vy, cn ch rng iu ny ch thc hin c khi y thc s c nhp t x. Ch rng khi ang chy PDB, bn cng ng thi chy Python trong ch tng tc dng lnh. Do , bn c th g bt k dng lnh Python no trn du nhc ca PDB. Bn c th t cc bin, gi hm, v.v... iu ny rt c li trong mt vi trng hp s c ch ra sau y. Chng hn, d PDB c lnh p nhm in ra gi tr ca cc bin v biu thc, thng th n khng cn thit. V sao? Trong ch tng tc lnh ca Python ta ch cn g tn ca bin hay biu thc l kt qu s c hin th trn mn hnhging ht nh lnh p lm. Nh vy, ta khng cn phi g p. Vy l nu x.py bao gm mt bin ww v khi chy PDB; thay v g (Pdb) p ww bn ch cn g

45

ww v gi tr ca ww s c in ra trn mn hnh.36 Nu bn c chng trnh vi mt cu trc d liu phc tp, bn c th vit mt hm in ra mn hnh ton b cc phn khc nhau ca cu trc . Sau ny, v PDB cho php bn thc hin bt k cu lnh Python no t du nhc PDB, bn c th n gin l gi hm t du nhc, t c th in c mt cch c th hn i vi tng ng dng. Sau khi chng trnh ca bn kt thc hoc l trong PDB hay mt li thc hin, bn c th chy li n m khng cn thot khi PDBiu ny quan trng khi bn khng mun mt cc im dngbi vic n c. Ch rng bn c th thng xuyn (d khng phi lun lun) bt buc chng trnh phi kt thc, thng qua lnh j, nhy n mt cu lnh no cui chng trnh, v sau n c. Hn na, nu tip sau bn sa i m lnh th nhng sa i ny s c phn nh trong PDB.37 A.1.2 Lu v cc lnh Next v Step

Nu bn ra lnh cho PDB thc hin Step n kiu nh n khi ang dng trn mt dng lnh Python c nhiu thao tc, bn cn phi lp li lnh n nhiu ln (hoc thit lp mt im dng tm thi nhy qua dng ). Th d, for i in range(10): thc hin hai nhim v. Th nht l gi hm range(), v sau t bin i, bi vy bn cn phi ra lnh n hai ln. Th cn lnh ny th sao? y = [(y,x) for (x,y) in x] Nu chng hn x c 10 phn t th bn phi thc hin lnh n 10 ln! y chc chn l bn mun thit lp mt im dng tm thi gii quyt vn . A.1.3 S dng Macro ca PDB

R rng l c tnh qu n gin ca PDB c th c khc phc mt phn bng cch tn dng lnh alias. C nhn ti khuyn khch dng lnh ny. Chng hn, bn g alias c c;;l
Tuy vy, nu tn ca bin li trng vi mt lnh ca PDB (hoc t vit tt ca n), th lnh ny s c thc hin. Th d, nu bn c bin n, th vic g n s cho kt qu l thc hin lnh n[ext] thay v l in ra gi tr ca n. in dc gi tr ny, bn phi g p n. 37 PDB, nh thy, ch l mt chng trnh Python. Khi bn khi ng li, n s nhp li m ngun ca bn. Bn cnh , l do cc im dng ca bn c lu li l v chng cng l cc bin trong PDB. C th hn, chng c lu trong bin thn vin c tn breaks trong lp Pdb thuc pdb.py. Bin ny c thit lp nh mt t in, vi cc kha l tn ca cc file ngun .py, v cc mc l cc danh sch ca im dng.
36

46

Bng cch ny, mi khi li ti mt im dng, bn s t ng thy on m tip theo. c im ny khc phc rt nhiu cho khim khuyt v mt giao din ha ca PDB. iu ny thc t quan trng n ni bn nn t n v file khi ng PDB, trong Unix c tn l $HOME/.pdbrc.38 Bng cch ny alias lun c hiu nghim. Bn cng c th lm tng t i vi cc lnh n v s: alias c c;;l alias n n;;l alias s s;;l Trong PDB cng c mt lnh unalias. Bn c th vit cc macro khc dnh ring cho cc chng trnh ang c g li. Chng hn, mt ln na hy gi d rng bn c mt bin tn l ww trong x.py, v bn mun kim tra gi tr ca n mi ln chng trnh g li tm dng, cc im dng chng hn. Mun vy ta thay i b danh (alias) trn thnh: alias c c;;l;;ww Bn c th vit b danh cho bt k lnh Python no, bao gm c cc tham s. Chng hn trong m ngun ca bn c lp C, mt trong cc bin thnh vin ca n l V. Gi s c mt danh sch L bao gm cc i tng trong lp C. Nh vy ta c th c mt b danh kiu nh: (Pdb) alias pl for I in L: print I.V nh ngha mi b danh, ta c th c cc tham s, c tham chiu n bi: %1, (%2 v.v... Hoc, bn cng c th nh ngha mt hm nhm mc ch g li trong chng trnh ngun, chng hn Dbg(), v sau to mt b danh ln sau phi g: alias dbg Dbg() A.1.4 S dng __dict__

Trong phn A.2.8 di y, ta s cho thy rng nu c l mt i tng thuc mt lp no , th g o.__dict__ s in ra ton b cc bin thnh vin trong i tng ny. Bn c th kt hp c im ny vi chc nng t b danh ca PDB, chng hn: alias c c;;l;;o __dict __

A.2

S dng PDB vi DDD

DDD, c sn trong nhiu h thng Unix (v c th download t do nu h thng ca bn cha c n), l mt giao din ha cho nhiu chng trnh g li, chng hn GDB (cho C/C++), JDB (cho Java), trnh g li c sn trong Perl, v.v... N cn c th dng cho PDB ca Python, gip ta nng cao hiu qu khi lm vic.
38

Python cng s kim tra s tn ti ca mt file nh vy trong th mc hin thi.

47

A.2.1

Chun b

ng dng u tin ca DDD cho PDB c Richard Wolff thc hin. ng chnh sa file pdb.py nhm mc ch ny, to thnh file PDB mi c tn pydb.py. Ban u dnh cho Python 1.5, tuy nhin sau ny Richard cung cp bn cp nht qu bu bao gm cc file sau y: http://heather.cs.ucdavis.edu/~matloff/Python/DDD/pydb.py http://heather.cs.ucdavis.edu/~matloff/Python/DDD/pydbcmd.py http://heather.cs.ucdavis.edu/~matloff/Python/DDD/pydbsupt.py t hai file vo mt ch no trong th mc tm kim ca bn, chng hn /usr/bin. m bo rng bn cho chng quyn thc hin. A.2.2 Khi ng DDD v m chng trnh

bt u, chng hn g li file fme2.py trong Phn 6.2.4, trc ht hy m bo rng main() c thit lp nh c trnh by trong phn . Khi bn kch hot DDD, hy bo n s dng PYDB: ddd --debugger /usr/bin/pydb.py Sau trong ca s dng lnh ca DDD, tc l ca s dng lnh con ca PDB (gn pha di cng), g: (pdb) file fme2.py hoc chon File | Open Source v click p chut vo tn file. Sau ny, khi cn sa i m ngun, bn hy g lnh (pdb) file fme2.py Hoc chn File | Open Source hay File | Open Recent v click p vo tn file. Cc im dng trong ln chy cui cng s c gi nguyn. A.2.3 Cc im dng

Khi t mt im dng, click phi chut vo u trong khong trng ca dng trong m ngun ca bn v chn Set Breakpoint (hoc Set Temporary Breakpoint (t im dng tm thi) hoc Continue to Until Here (tip tc n tn y), tuy tng trng hp).

48

A.2.4

Chy chng trnh ngun ca bn

chy, hy chn Program | Run, in cc thng s trong chng trnh ca bn (nu c) vo hp Run with Argument, v click Run trong ca s . Bn s c ngh n tip Continue, m bn c th lm bng cch n Program | Run |, nhng tin li hn c l click vo Continue trong ca s nh c nhim v tm tt dng lnh. (Tuy vy ng s dng lnh Run ). Sau bn c th click Next, Step, Cont v.v... Du tr n dng lnh ang c thc hin s c hnh ch I, mc d hi m nu nh con tr chut khng nm trong phm vi m ngun ca ca s DDD. Cng cn ni thm, bn ng gi sys.argv trong on m lnh ng t do ca mt lp. Khi chng trnh ca bn ln u c np, mi on m lnh ng t do trong lp s c thc hin. Nhng bi v cc tham s dng lnh vn cha c np nn kt qu l c li index out of range (th t vt ngoi khong cho php). Hy trnh iu ny bng cc a m lnh c cha sys.argv hoc l vo trong mt hm ca lp, hoc l ra hn pha ngoi lp. A.2.5 Theo di cc bin

Bn c th xem gi tr ca mt bin bng cch di con tr chut ti bt k ch no c tn bin trong ca s m ngun. Nh cp n trong Phn A.1.4, nu o l mt i tng ca mt lp no , th vic g o.__dict__ s in ra ton b cc bin thnh vin trong lp ny. Trong DDD, bn c th lm iu ny d dng hn nh sau. n gin l t biu thc sau du ch thch: # o. __dict __ v sau mi khi mun xem xt gi tr cc bin thnh vin ca o, hy a con tr chut n biu thc trong du ch thch! Tn dng cc c im ca DDD, ta c th cho hin th mt bin mt cch lin tc. n gin l click phi chut ln bt k ch no c bin , v sau chn Display. A.2.6 Cc vn hn hp

c pht trin vi nh ban u dnh cho C/C++, DDD khng phi lun ph hp vi Python. Nhng v DDD chuyn i cc lnh m bn click thnh cc lnh cho PDB, nh bn thy trong ca s dng lnh ca DDD; nn bt c vic no bn khng th thc hin vi DDD, bn u c th g cc lnh PDB vo ca s dng lnh. Cng cn ni thm l PYDB, phin bn sa i ca PDB c dng trong DDD, khng c lnh alias. A.2.7 Mt s h tr g li c sn trong Python

C mt s hm c sn ca Python m bn c th thy hu dng trong qu trnh g li.

49

A.2.8

Thuc tnh __dict__

Hy nh li rng cc thc th lp c vn hnh nh nhng t in. Nu c mt thc th lp tn l i, bn c th xem t in ca n thng qua i.__dict__. N s cho thy gi tr ca ton b cc bin thnh vin trong lp. A.2.9 Hm id()

i lc bn cn bit a ch thc t ca mt i tng no trong b nh. Chng hn, c hai bin m bn ngh rng chng cng ch n mt i tng, nhng khng chc chn. Phng thc id() s cho bn a ch ca i tng. Chng hn: >>> x = [1,2,3] >>> id(x) -1084935956 >>> id(x[1]) 137809316 (ng bn khon v a ch m, v thc t l a ch ny c s qu ln v c coi l mt s nguyn b (twos complement)). A.2.10 Cc cng c / IDE g li khc

B g li Winpdb mi The new Winpdb debugger(www.digitalpeers.com/pythondebugger/),39 c v rt tt. c bit l i vi ti v n c da trn mt b g li c hn c tn l RPDB vn x l cc thread ca Python rt tt. Tuy vy, ti liu ca Winpdb, n tn thng 1 nm 2006 cn rt s si, v ti cha c dp dng n. Hy tm bn cp nht (nu c), ti http://heather.cs.ucdavis.edu/ ~matloff/rpdb.html. C nhn ti khng thch cc mi trng pht trin tch hp (IDE). Chng thng ti rt chm v thng khng cho ti dng chng trnh son tho vn bn a thch,40 v theo quan im ca ti cc IDE khng c tng y chc nng. Tuy vy, nu bn thch IDE th sau y l mt s gi : Bn c th mun th IDLE, cng c IDE km sn vi gi Python, d rng ti thy n c nhiu khim khuyt. Nhng ngoi ra ti cng nghe kin tt v cc IDE min ph sau: Boa Constructor, http:// boa-constructor.sourceforge.net/; Eclipse vi phn m rng Python, http://www.python. org/moin/EclipsePythonIntegration; v JEdit, http://www.jedit.org/. Ti c mt bi vit hng dn v Eclipse ti http://heather.cs.ucdavis.edu/~matloff/eclipse.html. Cn trong s cc phn mm thng mi, ti lun a chung Wing Edit, http://wingware.com/ wingide/platforms, cng c m ti s dng mt thi gian ngn cho Java.
Khng nh tn gi ca n, cng c ny khng ch dnh ring cho cc my chy Microsoft Windows. Ti dng vim, nhng iu cn bn l ti mun dng mt chng trnh son tho cho tt c mi viclp trnh, son tho, e-mail, pht trin trang Web, v.v...
40 39

50

A.3
A.3.1

Ti liu trc tuyn


Hm dir()

dir() l mt hm rt tin dng cho php ta xem nhanh nhng thnh phn c trong mt i tng hoc hm. Bn nn s dng n thng xuyn. minh ha, trong v d ca Phn 7, chng hn chng ta dng li dng: print "S file vn bn ang m l: ", textfile.ntfiles Sau t nhin chng ta mun kim tra mt s iu vi hm dir(), chng hn: (Pdb) dir() [a, b] (Pdb) dir(textfile) [__doc__, __init__, __module__, grep, wordcount, ntfiles] Ngay sau khi bn khi ng Python, c rt nhiu th c ti. Chng ta hy xem: >>> dir() [__builtins__, __doc__, __name__] >>> dir(__builtins__) [ArithmeticError, AssertionError, AttributeError, DeprecationWarning, EOFError, Ellipsis, EnvironmentError, Exception, False, FloatingPointError, FutureWarning, IOError, ImportError, IndentationError, IndexError, KeyError, KeyboardInterrupt, LookupError, MemoryError, NameError, None, NotImplemented, NotImplementedError, OSError, OverflowError, OverflowWarning, PendingDeprecationWarning, ReferenceError, RuntimeError, RuntimeWarning, StandardError, StopIteration, SyntaxError, SyntaxWarning, SystemError, SystemExit, TabError, True, TypeError, UnboundLocalError, UnicodeDecodeError, UnicodeEncodeError, UnicodeError, UnicodeTranslateError, UserWarning, ValueError, Warning, ZeroDivisionError, _, __debug__, __doc__, __import__, __name__, abs, apply, basestring, bool, buffer, callable, chr, classmethod, cmp, coerce, compile, complex, copyright, credits, delattr, dict, dir, divmod, enumerate, eval, execfile, exit, file, filter, float, frozenset, getattr, globals, hasattr, hash, help, hex, id, input, int, intern, isinstance, issubclass, iter, len, license, list, locals, long, map, max, min, object, oct, open, ord, pow, property, quit, range, raw_input, reduce, reload, repr, reversed, round, set, setattr, slice, sorted, staticmethod, str, sum, super, tuple, type, unichr, unicode, vars, xrange, zip] 51

Vy , c mt danh sch tt c cc hm c sn v nhng thuc tnh khc m bn thy! Nu bn mun bit nhng hm no v thuc tnh no khc c trong kiu t in: >>> dir(dict) [__class__, __cmp__, __contains__, __delattr__, __delitem__, __doc__, __eq__, __ge__, __getattribute__, __getitem__, __gt__, __hash__, __init__, __iter__, __le__, __len__, __lt__, __ne__, __new__, __reduce__, __reduce_ex__, __repr__, __setattr__, __setitem__, __str__, clear, copy, fromkeys, get, has_key, items, iteritems, iterkeys, itervalues, keys, pop, popitem, setdefault, update, values] Gi d chng ta mun tm xem cc phng thc v thuc tnh no gn vi kiu chui. Nh bn bit qua phn 6.2.2, chui tr thnh mt lp c sn trong Python, bi vy ta khng th g: >>> dir(string) M thay vo phi dng mt i tng chui bt k: >>> dir() [__add__, __class__, __contains__, __delattr__, __doc__, __eq__, __ge__, __getattribute__, __getitem__, __getnewargs__, __getslice__, __gt__, __hash__, __init__, __le__, __len__, __lt__, __mod__, __mul__, __ne__, __new__, __reduce__, __reduce_ex__, __repr__, __rmod__, __rmul__, __setattr__, __str__, capitalize, center, count, decode, encode, endswith, expandtabs, find, index, isalnum, isalpha, isdigit, islower, isspace, istitle, isupper, join, ljust, lower, lstrip, replace, rfind, rindex, rjust, rsplit, rstrip, split, splitlines, startswith, strip, swapcase, title, translate, upper, zfill] A.3.2 Hm help()

Chng hn, hy tm hiu v phng thc pop() ca danh sch: >>> help(list.pop) Help on method_descriptor: pop(...) L.pop([index]) -> item -- remove and return item at index (default last) (END) 52

v phng thc center() ca chui: >>> help( .center) Help on function center: center(s, width) center(s, width) -> string Return a center version of s, in a field of the specified width. padded with spaces as needed. The string is never truncated. n q thot khi trang hng dn. Bn cng c th ly thng tin bng cch s dng pydoc ti du nhc lnh ca Unix, chng hn: % pydoc string.center [...nh trn]

A.4

Gii thch v bin php x l bin ca lp c

Trc khi Python ra phin bn 2.2, khng c mt h tr no dnh cho cc phng thc ca lp. Nhng c mt bin php x l n gin c trnh by http://aspn.activestate.com/ASPN/Cookbook/ Python/Recipe/52304. By gi v Python cho php cc phng thc ca lp (thc t l hai loi), chng ta khng cn mt bin php x l nh vy trong lp trnh, nhng n l v d hay cho ta thy nguyn tc hot ng ca tham chiu i tng nh th no. Chng ta hy tm hiu iu ny: Trong chng trnh tfe.py ca phn 7, c th thm class ClassMethod: def __init__(self,MethodName): self.__call__ = MethodName class textfile: (lots of stuff omitted) def printntfiles(): print textfile.ntfiles tmp = ClassMethod(printntfiles) printntfiles = tmp textfile.printntfiles() (Ti thm vo mt dngdng vi mt php gn cho tmp r rng hn, nh bn s thy sau ny.) Nh li trong phn 8, cc hm trong Python u l cc (con tr n) cc i tng, cng ging nh bt c th g khc, v do u c th gn c. Chng hn, trong on m di y: 53

>>> def f(x): ... return x*x ... >>> g = f >>> g(3) 9 f thc cht ch l mt con tr n mt i tng hm, v vy nu ta gn f cho g, th g cng ch n i tng , v do vy g cng l hm cng tnh nng. Mt khc, cng cn lu rng cc thc th lp u c th gi c. chnh l phng thc __call__(), phn ngm nh ca tt c mi lp. Do n gin l chng ta v nh thc th lp l mt hm, v sau gi n. Khi , phng thc __call__() s c kch hot i vi self (ngha l thc th lp m chng ta ang gi) vi bt k tham s no c nhp vo. Phng thc __call__() c mc nh l rng, nhng chng ta c th cho mt thng s v s dng theo mc ch ring. Th d, file ngun sau y c tn l yyy.py: class u: def __init__(self): self.r = 8 def __call__(self,z): return self.r*z def main(): a = u() print a(5) a.r = 13 print a(5) if __name__ == __main__: main() python yyy.py 40 65 By gi hy xem dng lnh sau y trong file ngun p dng bin php x l: tmp = ClassMethod(printntfiles) N c tc dng to ra mt thc th ca lp ClassMethod v gn n cho tmp. Tham s l printntfiles, bi vy dng lnh kin to: self.__call__ = MethodName

54

s c ngha l tmp.__call__ c t cho printntfiles. Hy tm qun i rng c tmp.__call__ v printntfiles u l hm; ch ch l chng ta gn mt con tr (printntfiles) cho ci kia (tmp.__call__). Tuy vy c hai ci ny d nhin u l hm, v do tmp.__call__ by gi alf mt con tr ti m ca hm ban u printntfiles, tc l ti m: print textfile.ntfiles V dng tip theo printntfiles = tmp c ngha l bin printntfiles by gi khng cn ch n m lnh ca n na! Thay vo , n ch n mt thc th ca lp ClassMethod. Hy nh rng, by gi printntfiles bn thn n l mt bin lp trong lp textfile, ngha l n c tn y textfile.printntfiles. Ban u n l mt hm, nhng v bt c th g u c th gn c, nn by gi n ch n gin l mt bin, ch n mt thc th ca lp ClassMethod. iu cn ni l nu ta gi textfile.printntfilesm ta c th thc hin c, v mi lp ca Python u gi c!th ta kch hot phng thc __call__() ca thc th . V phng thc ny, nh thy trn, ch n m ngun gc ban u ca hm printntfiles, ngha l: print textfile.ntfiles Do vy m on m s c thc hin! Tm li mt lnh c c php nh mt li gi phng thc ca mt lp, nh textfile.printntfiles() thc t s ng vai tr nh mt phng thc lp, d rng trong Python khng c hnh thc ny.

A.5

a tt c cc bin ton cc vo trong mt lp

Nh ni trong phn 5, thay v s dng t kha global, chng ta c th lm r rng v c t chc hn bng cch nhm tt c cc bin ton cc vo mt lp. y, trong file tmeg.py, ta s lm nh vy, mt ci tin so vi file tme.py: # c vo file text c tn c ch nh trong dng lnh, # v thng bo s dng v s t c trong file import sys def checkline(): glb.linecount += 1 55

w = glb.l.split() glb.wordcount += len(w) class glb: linecount = 0 wordcount = 0 l = [] f = open(sys.argv[1]) for glb.l in f.readlines(): checkline() print glb.linecount, glb.wordcount Ch rng khi chng trnh c chy ln u, lp glb s c thc hin, v thm ch trc c khi khi ng main().

56

You might also like