Page 1

Python ÆS)P X’ LeafWang@163bj.com or AnnCharles@tom.com

2003c0826F


annCharles@tom.com

12,208

Python ÆS)P


8ยน

8ยน 1ย˜ ร™ Python0 0

1

ยง1.1 mยฉ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

2

ยง1.1.1 Xร›$1PythonยงS . . . . . . . . . . . . . . . . . . . . . . . . . . . .

2

ยง1.2 ย˜ยƒยรฉย– . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

3

ยง1.3 ร„a. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

3

ยง1.3.1 .(integer) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

3

ยง1.3.2 2:.(float) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

3

ยง1.3.3 Nonea. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

3

ยง1.3.4 รœ6Lยˆยช . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

3

ยง1.4 L(list) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

6

ยง1.4.1 Mรฏlist . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

6

ยง1.4.2 listeIรšflist . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

6

ยง1.4.3 flistJ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

7

ยง1.4.4 ?nlistย{ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

8

ยง1.4.5 ^list [ร™ยฆ~^รชรข( . . . . . . . . . . . . . . . . . . . . . . .

10

ยง1.4.6 list comprehension . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

12

ยง1.5 iรŽG(string) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

13

ยง1.5.1 iรŽGLยซ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

13

ยง1.5.2 =ย†ยคยร™ยฆa. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

14

ยง1.5.3 iรŽGรถยŠ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

14

ยง1.6 |(tuple) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

22

ยง1.7 S(sequence) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

23

ยง1.8 i;(dictionary) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

23

ยง1.8.1 {รผ~f . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

24

ยง1.8.2 dictionaryรถยŠ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

24

ยง1.9 ยงS6ยง . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

27

ยง1.9.1 ยฉ|(if . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

27

ยง1.9.2 รŒย‚(forยงwhileยงbreakยงcontinueยงrange() . . . . . . . . . . . . .

29

annCharles@tom.com

1iย,208ย

Python ร†S)P


8š §1.10 Ÿê . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

32

§1.10.1 ÄŸê^{ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

32

§1.10.2 ĂŤĂŞÂ‡ĂŞÂŒĂ€Â§ĂŤĂŞk%@Š . . . . . . . . . . . . . . . . . . . . . .

33

§1.10.3 UCŸêÍêDŠ^S . . . . . . . . . . . . . . . . . . . . . . . . . .

34

§1.10.4 Â‡ĂŞÂŒCĂŤĂŞ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

34

§1.10.5 Doc String Ÿê£ã . . . . . . . . . . . . . . . . . . . . . . . . . . .

36

§1.10.6 lambdaŸê . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

36

§1.10.7 ŸêŠ^�(scope) . . . . . . . . . . . . . . . . . . . . . . . . . . .

37

§1.10.8 i@Ÿê(nested) . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

38

§1.10.9 functionÍêD4 . . . . . . . . . . . . . . . . . . . . . . . . . . . .

38

§1.11 (module)Ú�(package) . . . . . . . . . . . . . . . . . . . . . . . . . . .

39

§1.11.1 MĂŻÂ˜Â‡module . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

39

§1.11.2 NoÊmodule . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

41

§1.11.3 package(�) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

42

§1.12 name space(ÂˇÂśÂ˜m) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

42

§1.13 a . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

46

§1.13.1 Â&#x;o´object . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

46

§1.13.2 Â&#x;o´class oject . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

48

§1.13.3 property Úmethord . . . . . . . . . . . . . . . . . . . . . . . . . . . .

50

§1.13.4 bound methord Úunbound methord . . . . . . . . . . . . . . . . . .

52

§1.13.5 U(inherit) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

54

§1.13.6 ¡¤ CÞ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

54

§1.13.7

Abstrace Class . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

55

§1.13.8 hkattribute . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

55

§1.13.9 Python ¼class A�methord

. . . . . . . . . . . . . . . . . . . . .

56

§1.13.10 ˜ AĂ?­1Ÿê^{Ăž~ . . . . . . . . . . . . . . . . . . . .

63

§1.13.11 new style class . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

75

§1.14 É~?n(exception) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

82

§1.14.1 Â&#x;o´É~?n§Â?Â&#x;o‡kÉ~?n . . . . . . . . . . . . . . . . .

82

§1.14.2 ӟexception(É~) . . . . . . . . . . . . . . . . . . . . . . . . . . .

84

§1.14.3 Ñexception . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

88

annCharles@tom.com

1iiÂ?,208Â?

Python ÆS)P


8ยน 1 ร™ mu Python ยฆ^ รณรค

91

ยง2.1 ยฆ^Emacs ?6Python ยงS . . . . . . . . . . . . . . . . . . . . . . . . . . .

91

ยง2.1.1 SCpython mode . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

91

ยง2.1.2 python mode ร„A5 . . . . . . . . . . . . . . . . . . . . . . . . .

92

ยง2.1.3 ~^รตUรž~ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

92

ยง2.2 ร™ยฆ?6รฌ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

94

ยง2.3 NรยงS . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

95

ยง2.3.1 ยฆ^DDD รšpydb Nรpython ยงS . . . . . . . . . . . . . . . . . . . .

95

1n ร™ Python ~^ ยฌ

96

ยง3.1 Sย˜ยฌ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

96

ยง3.1.1 ~^ยผรช . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

96

ยง3.1.2 a.=ย†ยผรช . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

98

ยง3.1.3 ^uย‰1ยงSSย˜ยผรช . . . . . . . . . . . . . . . . . . . . . . . . . 100 ยง3.2 รšรถยŠXรšยƒ'N^ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 103 ยง3.2.1 ย‹mยฉย‡ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 106 ยง3.2.2 ร–ยฉย‡ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 106 ยง3.2.3 '4ยฉย‡ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 107 ยง3.3 regular expression . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 107 ยง3.3.1 {รผregexp . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 108 ยง3.3.2 iรŽ8รœ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 108 ยง3.3.3 ยญE . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 110 ยง3.3.4 ยฆ^ยฉiรŽG

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 110

ยง3.3.5 ยฆ^re ยฌ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 110 ยง3.3.6 p?regexp . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 112 ยง3.3.7 ยฉ|(Group) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 113 ยง3.3.8 Compile Flag . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 115 ยง3.4 ^structยฌ?n?ย›รชรข . . . . . . . . . . . . . . . . . . . . . . . . . . . 116 ยง3.5 ^Cmd ยฌ?{รผยท-1ย . . . . . . . . . . . . . . . . . . . . . . . . 118 ยง3.5.1 {รผ~f . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 119 ยง3.5.2 ยฝร‚%@ยท- . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 120 ยง3.5.3 ?nEOF . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 120 annCharles@tom.com

1iiiย,208ย

Python ร†S)P


8¹ §3.5.4 ?n˜·- . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 121 §3.5.5 ·-1gÄÖà

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 121

§3.5.6 UCIOÑ\ÑÑ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 121 §3.5.7 UCJ«Î . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 122 §3.5.8 Jø3‚ÏõU . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 122 §3.5.9 $1Shell õU . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 123 §3.5.10

getattr õU¦^ . . . . . . . . . . . . . . . . . . . . . . . . . . . . 123

§3.6 ?n·-1À‘

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 124

§3.6.1 ˜‡{ü~f

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 124

§3.6.2 ‘këê·-1À‘ . . . . . . . . . . . . . . . . . . . . . . . . . . . 125 §3.6.3

optparser ¬ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 126

§3.7 'užm¬

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 136

§3.8 socket ?§ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 136 §3.8.1 0 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 136 §3.8.2 {ü~f . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 138 §3.8.3 Mïsocket

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 139

§3.8.4 ”½socket

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 140

§3.8.5 ïáë . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 141 §3.8.6 Âxêâ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 141 §3.8.7 ämë . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 142 §3.8.8 Ù¦9ϼê . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 143 §3.8.9

TCP ÚUDP «O . . . . . . . . . . . . . . . . . . . . . . . . . . . . 145

§3.8.10 'uTCP ÑÖì{K . . . . . . . . . . . . . . . . . . . . . . . . . 146 §3.9 Âe‡ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 150 §3.10 POP3 Æ0 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 150 §3.10.1 ˜‡{ü~f . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 150 §3.10.2 ¦^POP3 ÆÂe‡ . . . . . . . . . . . . . . . . . . . . . . . . . 151 §3.10.3 õ1A?n . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 151 §3.10.4 POP3Ï&L§¥G . . . . . . . . . . . . . . . . . . . . . . . . . 152 §3.10.5 POP3¥·- . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 152 §3.11 ^poplib ¬Âe‡ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 158 annCharles@tom.com

1iv,208

Python ÆS)P


8¹ §3.12 SMTP Æ0 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 160 §3.12.1 SMTP˜‡~f . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 160 §3.12.2 uxe‡·- . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 162 §3.12.3 Ù¦·- . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 164 §3.12.4 ESMTP . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 166 §3.12.5 ¹@y . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 166 1o Ù Tkinter ?§

167

§4.1 Tkinter0 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 167 §4.1.1 Ÿo´Tkinter . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 167 §4.2

Hello Tkinter §S . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 168 §4.2.1 {ü~f . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 168 §4.2.2 ,˜‡{ü§S

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 170

§4.3 Widget ˜ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 171 §4.4 Geometry Manager(AÛ+nì) . . . . . . . . . . . . . . . . . . . . . . . . . 172 §4.4.1 Pack +nì . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 173 §4.4.2 Grid +nì . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 176 §4.5 Widget ª . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 178 §4.5.1 ôÚ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 178 §4.5.2 iN . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 179 §4.5.3 ©i‚ªz . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 182 §4.5.4 >µ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 182 §4.5.5 àI . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 184 §4.6 ¯‡Ú¯‡½ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 186 §4.6.1 ˜‡{ü~f

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 186

§4.6.2 ¯‡?n¼ê . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 188 §4.6.3 ¯‡

g . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 188

§4.6.4 Ә‡¯‡õ‡?n¼ê . . . . . . . . . . . . . . . . . . . . . . . . 191 §4.6.5 ÚWM ƒ'¯‡”½ . . . . . . . . . . . . . . . . . . . . . . . . . . 192 §4.7 ~^A^§S¦^Widget . . . . . . . . . . . . . . . . . . . . . . . . . . . 193 §4.7.1 ÄI . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 193 §4.7.2 èü . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 193 annCharles@tom.com

1v,208

Python ÆS)P


8ยน ยง4.7.3 รณรค9 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 197 ยง4.7.4 G9 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 197 ยง4.7.5 IOรฉ{ยต . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 199 1 รŠร™ Python * ร

205

ยง5.1 ^C?*รยฌ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 205

annCharles@tom.com

1viย,208ย

Python ร†S)P


ĂŁ

ĂŁ 3-1 žmÂźĂŞÂƒm'X . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 137 3-2 Â?rà ÚÑÖÏàŸêN^6§ . . . . . . . . . . . . . . . . . . . . . . . . 139 4-1 Tkinter XĂš

gĂŁ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 167

4-2 hello1.py $1(J . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 169 4-3 hello2.py $1(J . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 171 4-4 border1.py $1(J . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 183 4-5 cursor1.py $1(J . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 185 4-6 menubar2.py $1(J . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 194 4-7 menubar3.py $1(J . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 196 4-8 toolbar1.py $1(J . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 198 4-9 statusbar1.py $1(J . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 199 4-10 inputpassword.py $1(J . . . . . . . . . . . . . . . . . . . . . . . . . . . 203

annCharles@tom.com

1viiÂ?,208Â?

Python ÆS)P


L‚

L‚ 1.5-1 iÎG¼=¿iÎ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

14

1.5-2 iÎG=†�ٌa. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

14

1.5-3 äiÎG´Äåu,aOŸê . . . . . . . . . . . . . . . . . . . . . .

16

1.13-4 ÂŒÂąÂ­1Žâ܊Οê . . . . . . . . . . . . . . . . . . . . . . . . . . .

63

3.1-1 Python ­^SÂ˜ÂźĂŞ . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

97

3.1-2 a.=†Ÿê . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

99

3.2-3 XÚN^Þ~ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 103 3.4-4 struct ¼‚ª½Â . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 117 3.4-5 i!^S½Â . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 118 3.5-6 ¡-1?6¯$… . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 119 3.7-7 Lžm . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 137 3.8-8 ^u=†i!^SŸê . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 145 3.8-9 TCP ÚUDP O . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 146 3.11-10 poplib ¡-o( . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 160 4.5-1 tkFont |¹option . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 181 4.6-2 ¯‡£ãÞ~ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 189 4.6-3 £ã¯‡Íê . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 189

annCharles@tom.com

1viiiÂ?,208Â?

Python ÆS)P


1˜Ù

Python0 0 python´˜«)º5¡•é–Šó"pythonk±eA:" )º . „Ý ú§mu±Ïá§NÁN´§g·*Ð5"dukevalõU§? §SŒ±3$1žUYmu"ù´éõ)º.Šó5"XVB kScript Engineer§LispkEVAL§—EmacsrŒ*Ð5" ¡• é– 3Python¥§a(class)§¼ê(function)§¬(module) Ñ´é–"§Ü `§¦'Java§C++ \OO( Object Oriented)"O4·ò\“Ÿo‰OO? Java OO?”?Ø¥§^LÒ "z‡ŠóÑkˆg`":§ Python á  õŠó`:" Œ* Ð Python ¦^CŠó§ég,^C½öC++Šó*ÐPythonA5"X? #¬§O\#êâa." Œi \ Python)ºìڙŒ±éN´i\^rgCC½öC++Šó§S‘8 ¥ § ¦ \  § S Œ ± | ±  ? § § * Ð õ U " y 3 Ò kPython  ¬ Œ ± * ÐVIMÚEmacsõU" S Ø PythonØ%)ºì´é" Ä a. ØI‡¯k(²(declare)Cþa.§†¦^CþҔéõÙ¦)º.Š óVB§VB Script§JScript§PERL˜" ra . ¦+CþØ^(²(declare)a.§´˜ Cþk Š§@où‡Š´k˜‡a. "ØUòstringa.Cþ†DŠ‰˜‡integera.Cþ§ ´I‡a.=†" ùÚVB§VBScript§JScript§PERLؘ§ÚJava ”" annCharles@tom.com

11,208

Python ÆS)P


˜ Python0

§1.1 mŠ §1.1.1 XĂ&#x203A;$1Python§S Python ´ Â&#x2DC; ÂŤ ) Âş .  ? § Â&#x160; Ăł § Ă&#x161; Ă&#x2122; ÂŚ ) Âş . ? § Â&#x160; Ăł § XPerl§VB§Bash§Awk§Sed Ă&#x2018;kaq§$1Â?{Xe" â&#x20AC;˘ 1Â&#x2DC;ÂŤÂ?{´pÂŞ"b\´3Unix Â&#x201A;¸e§$ ´¡-1JÂŤĂ&#x17D;Ă&#x2019;" $python Python 2.2 (#1, Apr 12 2002, 15:29:57) [GCC 2.96 20000731 (Red Hat Linux 7.2 2.96-109)] on linux2 Type "help", "copyright", "credits" or "license" for more information. >>> print "Hello World" Hello World >>> #U CTRL+D òĂ&#x2018; 3Windows ÂĽÂ?kaqÂ&#x201A;¸"Š¼Â&#x152;þê~fĂ&#x2018;´3pÂŞ$1">>>Ă&#x161;...L ÂŤPython JÂŤĂ&#x17D;Ă&#x2019;"Bash eÊþ¡-1?6¡-Ă&#x2018;´Â&#x152;¹Œ^§XC-a §C-e §C-w §Ă?Â?ÂŚÂ&#x201A;Ă&#x2018;´Œ^readline ÂĽ" â&#x20AC;˘ Â&#x201E;Â&#x152;Âąr§S3Â&#x2DC;Â&#x2021;ŠÂ&#x2021;¼§^python )ºÏN^" $cat test.py print "Hello World" $python test.py Hello World $cat test.py | python #+ĂśÂ&#x160; Hello World $python < test.py #Ă&#x2018;\­½Â&#x2022; Hello World â&#x20AC;˘ r§SÂ&#x160;Â?Â&#x2DC;Â&#x2021;Â&#x152;Âą$1Unix ŠÂ&#x2021;" $cat test.py #!/usr/bin/python print "Hello World" $ls -l test.py -rw-r--r-1 chunywan mnw $chmod +x test.py $ls -l test.py annCharles@tom.com

12Â?,208Â?

40 Sep 12 13:34 test.py

Python Ă&#x2020;S)P


§1.2 Â&#x2DC;Â&#x192;Â?ĂŠÂ&#x2013; -rwxr-xr-x $./test.py Hello World

1 chunywan mnw

40 Sep 12 13:34 test.py

5Âż1Â&#x2DC;1AĂ?5ÂşÂ&#x160;ʧڴUnix eĂ?^Â?{"Perl§Tl/Tcl§Sed§awk§Bash Ă&#x2018;´Úo^" Â&#x160;5Âż´5ÂşÂ&#x160;ʧ# ÂĄLÂŤ5Âş"Ă&#x161;bashÂ&#x2DC;"5ÂşÂ&#x160;ĂŠ3Nà §SÂ&#x17E;ÿ§ ´Êk^§Â&#x201E;Â&#x152;ÂąJp§SÂ&#x152;Ă&#x2013;5"

§1.2 Â&#x2DC;Â&#x192;Â?ĂŠÂ&#x2013; a(class)§Ÿê(function)§ÂŹ(module) Ă&#x2018;´ÊÂ&#x2013;"â&#x20AC;&#x153;Â&#x2DC;Â&#x192;Ă&#x2018;´ÊÂ&#x2013;§ÊÂ&#x2013;Ă&#x2018;kÂś iâ&#x20AC;?§Ú´¡Â&#x2DC;Â&#x2021;o("

§1.3 Ă&#x201E;a. §1.3.1 .(integer) wĂĽ5Â&#x201D;ĂŞLÂ&#x2C6;ÂŞĂ&#x2019;´."kÂąe$Â&#x17D; ĂśÂ&#x160;Ă&#x17D;

ÂżĂ&#x201A;

~f

(J

+ â&#x2C6;&#x2019; â&#x2C6;&#x2014; / % â&#x2C6;&#x2014;â&#x2C6;&#x2014; divmod

\{ ~{ ÂŚ{ Ă&#x2DC;{  Â&#x2DC; Ă&#x2DC;{

1+1 1-1 2*10 10/3 10/3 2**4 divmod(10§3)

2 0 20 3 1 16 (3§1)

§1.3.2 2:.(float) wĂĽ5Â&#x201D;2:ĂŞLÂ&#x2C6;ÂŞĂ&#x2019;´2:ĂŞ"Ă&#x161;.aq"5¿§1´.§1.0´2:."Ă&#x153; 6LÂ&#x2C6;ÂŞ1 == 1.0 ´ýÂ&#x160;"5¿§2:ĂŞ$Â&#x17D;´kĂ&#x2DC; "^uÂ&#x2030;Ă&#x2020;OÂ&#x17D;Â&#x17E;ÿ§IÂ&#x2021; Ă&#x2122;ÂŚÂŹ|Âą"Ú´Ă?Â?2:$Â&#x17D;ĂŹÂ?ULÂŤk  ê"

§1.3.3 Nonea. None´Â&#x2DC;Â&#x2021;AĂ?~Þ§LÂŤĂ&#x2018;Â&#x2020;"3Âą

Â&#x152;ÂąwÂŚ^?"

§1.3.4 Ă&#x153;6LÂ&#x2C6;ÂŞ PythonÂĽvkbooleana."Ă&#x2019;Â&#x201D;CÂ&#x160;ó¼§Ă&#x2DC; 0Âą §Ă&#x2122;ÂŚĂ&#x2018;´ý"´PythonÂĽ â&#x20AC;&#x153;bâ&#x20AC;?kÊþ§Â?) annCharles@tom.com

13Â?,208Â?

Python Ă&#x2020;S)P


Â&#x2DC; Python0 None,0,0.0,"" (Â&#x2DC;iĂ&#x17D;G),[](Â&#x2DC;list),()(Â&#x2DC;tuple),{}(Â&#x2DC;dictionary) PythonÂĽkÂąeĂ&#x153;6$Â&#x17D;Ă&#x17D;" and or not

Ă&#x153;6Â&#x2020; Ă&#x153;6½ Ă&#x153;6Â&#x2021;

>>> def getTrue(): ... print "debug: true" ... return 1 ... >>> def getFalse(): ... print "debug: false" ... return 0 ... >>> if getTrue() and getFalse(): ... print "ok" ... else: ... print "bad" ... debug: true # k$1 getTrue debug: false # XJ getTrue Â&#x2C6;ÂŁĂ˝,@o$1getFalse bad # Â&#x2021;(J´ getFalse Â&#x2C6;ÂŁ(J. >>> if getFalse() and getTrue(): ... print "ok" ... else: ... print "bad" ... debug: false #k$1 getFalse bad #XJ getFalse Â&#x2C6;ÂŁb,@oĂ&#x2019;Ă&#x2DC;$1 getTrue >>> Â&#x160;5Âż´and Ă&#x161;or §Êuand 5`§~Xexpr1 and expr2§XJexpr1 ´Ă&#x153;6b§@ oĂ&#x2019;oLÂ&#x2C6;ÂŞÂ&#x2020;Â&#x2C6;ÂŁexpr1 §Â?N´Â&#x2DC;iĂ&#x17D;G§½ÜÂ&#x2DC;list§ Ă&#x2DC;2OÂ&#x17D;expr2§Â?Ă&#x2019;´ `expr2 ÂĽXJkŸêN^{§Â?Ă&#x2DC;ÂŹÂ&#x2030;1"XJexpr1 ´Ă&#x153;6ý§@oâOÂ&#x17D;expr2 §Â&#x2021;Ă&#x153;6LÂ&#x2C6;ÂŞĂ&#x2019;Â&#x2C6;ÂŁexpr2"ĂŠuor 5`§~Xexpr1 or expr2§XJexpr1 ´Ă&#x153;6 ý§@oĂ&#x2019;oLÂ&#x2C6;ÂŞÂ&#x2020;Â&#x2C6;ÂŁexpr1 § Ă&#x2DC;2OÂ&#x17D;expr2§Â?Ă&#x2019;´`expr2 ÂĽXJkŸê N^{§Â?Ă&#x2DC;ÂŹÂ&#x2030;1"XJexpr1 ´Ă&#x153;6b§@oâOÂ&#x17D;expr2 §Â&#x2021;Ă&#x153;6LÂ&#x2C6;ÂŞĂ&#x2019;Â&#x2C6; ÂŁexpr2"ĂšĂ&#x2019;kÂ&#x2DC;ÂŤ~^AĂ?LÂ&#x2C6;Â?ÂŞ: annCharles@tom.com

14Â?,208Â?

Python Ă&#x2020;S)P


§1.3 Ă&#x201E;a. <cond> and <expr_true> or <expr_false> ÂŚkÂ&#x2DC;Â&#x2021;ĂŠk^Â&#x160;Ă&#x201A;´: XJcond ¤å§@oÂ&#x2C6;ÂŁexpr_true§Ă&#x201E;KÂ&#x2C6;ÂŁexpr_false" ÂŚvkÂ&#x160;Â&#x2021;Â&#x;o5K§Â?´lÂ&#x2020;mÂ?g"4¡Â&#x201A;5uÂ&#x2DC;eÂ?Â&#x;o: cond

expr_true

expr_false

o(J

Ă˝

Ă˝

?Ă&#x203A;(Ă&#x2DC;OÂ&#x17D;)

expr_true

b b

?Ă&#x203A;(Ă&#x2DC;OÂ&#x17D;) ?Ă&#x203A;(Ă&#x2DC;OÂ&#x17D;)

Ă˝ b

expr_false expr_false

Ă˝ Ă˝

b b

b Ă˝

expr_false expr_false

lĂšÂ&#x2021;LĂžÂ&#x152;Âąw: â&#x20AC;˘ Ă&#x17E;Â&#x2DC;|`² §XJcond ´ý§@oÂ&#x2021;LÂ&#x2C6;ÂŞĂ&#x2019;´expr_true â&#x20AC;˘ 1|`² §XJcond ´b§@oÂ&#x2021;LÂ&#x2C6;ÂŞĂ&#x2019;´expr_false â&#x20AC;˘  Â&#x2DC;|`² §¡`Â&#x153; "P4XJexpr_true kÂ&#x152;U´bÂ&#x17E;ÿ§Ă&#x2DC;Â&#x2021;ĂšoÂ&#x2030;§ Ă?Â?kÂ&#x152;UÂ&#x2039;Âť5Â&#x160;Ă&#x201A;§cond ´ýÂ&#x17E;ÿ§Â&#x2021;LÂ&#x2C6;ÂŞ%´expr_false")Ăť ĂšÂ&#x2021;ÂŻKÂ?{Ă&#x2019;´: (<cond> and (<expr_true>,) or (<expr_false>,))[0]  ¥)Ă&#x2019;rÂ&#x2021;LÂ&#x2C6;ÂŞ)ĂĽ5§UCOÂ&#x17D;`k?§Ă&#x201E;K[0] `k? p"ÂĽm )Ă&#x2019;Ă&#x161;Ă?Ă&#x2019;§´Â&#x2DC;Â&#x2021;tuple LÂ&#x2C6;ÂŞ"Ăš(<expr_true>,)[´ý§Ă?Â?Œ´š kÂ&#x2DC;Â&#x2021;Â&#x192;tuple§ [0] LÂŤJĂ&#x2018;ĂšÂ&#x2021;Â&#x192;5"3$´§Ă?~ĂšÂ&#x2021;LÂ&#x2C6; ª´^3'{ĂźÂ&#x153;še§{ĂźDÂ&#x160;Â&#x160;ʧexpr_trueĂ&#x161;expr_false Â&#x2DC;Â&#x201E;Ă&#x2018;´~ Þ§ Â&#x2026;´ý" >>> x= cond and "OK" or "BAD" >>> x â&#x20AC;&#x2122;OKâ&#x20AC;&#x2122; >>> cond = 0 >>> x= cond and "OK" or "BAD" >>> x â&#x20AC;&#x2122;BADâ&#x20AC;&#x2122; >>> Ă&#x201C;n: <cond> or <expr_false> and <expr_true> Â?kaqÂ&#x160;Ă&#x201A;§´Ă&#x2DC;Â&#x2021;ÂŚ^ڍLÂ&#x2C6;Â?ª§Ă&#x2DC;´Ă?Â?ĂšÂ&#x2021;LÂ&#x2C6;ÂŞĂ&#x2DC;Ă&#x153;{§ ´Ă? Â?ÂŚĂ&#x2DC;Ă&#x17D;Ă&#x153;S."?§Â&#x160;ĂłĂ&#x161;g,Â&#x160;Ăłkaq/Â?§Ă&#x2019;Â&#x2013;¡Â&#x201A;²Â&#x17E;ÂŹ`§â&#x20AC;&#x153;r§¯Â&#x152;â&#x20AC;?§ annCharles@tom.com

15Â?,208Â?

Python Ă&#x2020;S)P


Â&#x2DC; Python0 ´¡Â&#x201A;Ă&#x2DC;ÂŹ`§â&#x20AC;&#x153;r§?ĂŞâ&#x20AC;?§½Üâ&#x20AC;&#x153;r§? â&#x20AC;?§Ă&#x2DC;´Ă?Â?@o`Ă&#x2019;´Â&#x2020;§´Ă?Â?Ă&#x2DC; Ă&#x153;S."@Ă&#x2019;¯§Â?Â&#x;oĂ&#x2DC;Ă&#x153;S.§S.l=p5ÂşĂ?´lC Â&#x160;ó¼5"C Â&#x160;ó¼k cond ? true_expr: false_expr Ú´Â&#x2DC;Â&#x2021;nĂśÂ&#x160;Ă&#x17D;§¯þC Â&#x160;óŒ^Ăś^ AÂ&#x203A;c §Ă&#x161;1Â&#x2DC;ÂŤÂ&#x160;Ă&#x201A;´aq" oÂ&#x192;§# ÂĄ@ÂŤÂ?ª§Â?1Â&#x2DC;ÂŤĂ&#x2019;Ă? "

§1.4 L(list) list aquC++ÂĽvector§C Â&#x160;ó¼ĂŞ|§^u;^S("X§ Â&#x2DC;cÂĽzÂ&#x2021;Uê§Â&#x152;ÂąLÂŤÂ? [ 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 ] Â&#x2DC;cÂĽzÂ&#x2021;œ¥§Â&#x152;ÂąLÂŤÂ? [ â&#x20AC;&#x2122;Januaryâ&#x20AC;&#x2122;, â&#x20AC;&#x2122;Februaryâ&#x20AC;&#x2122;, â&#x20AC;&#x2122;Marchâ&#x20AC;&#x2122;, â&#x20AC;&#x2122;Aprilâ&#x20AC;&#x2122;, â&#x20AC;&#x2122;Mayâ&#x20AC;&#x2122;, â&#x20AC;&#x2122;Juneâ&#x20AC;&#x2122;, â&#x20AC;&#x2122;Julyâ&#x20AC;&#x2122;, â&#x20AC;&#x2122;Augustâ&#x20AC;&#x2122;, â&#x20AC;&#x2122;Septemberâ&#x20AC;&#x2122;, â&#x20AC;&#x2122;Octoberâ&#x20AC;&#x2122;, â&#x20AC;&#x2122;Novemberâ&#x20AC;&#x2122;, â&#x20AC;&#x2122;Decemberâ&#x20AC;&#x2122; ] zÂ&#x2021;(Ă?Âśi§Â&#x152;ÂąLÂŤÂ? [ â&#x20AC;&#x2122;Mondayâ&#x20AC;&#x2122;,â&#x20AC;&#x2122;Tuesdayâ&#x20AC;&#x2122;, â&#x20AC;&#x2122;Wednesdayâ&#x20AC;&#x2122;, â&#x20AC;&#x2122;Thursdayâ&#x20AC;&#x2122; , â&#x20AC;&#x2122;Fridayâ&#x20AC;&#x2122;, â&#x20AC;&#x2122;Saturdayâ&#x20AC;&#x2122;, â&#x20AC;&#x2122;Sundayâ&#x20AC;&#x2122;]

§1.4.1 MĂŻlist a=[â&#x20AC;&#x2122;1â&#x20AC;&#x2122;,â&#x20AC;&#x2122;2â&#x20AC;&#x2122;] ^[])ĂĽ5§LÂŤÂ&#x2DC;Â&#x2021;list§¼mÂ&#x2C6;Â&#x2021;Â&#x192;Â&#x152;¹´?Ă&#x203A;a.§^Ă?Ă&#x2019;ŠÂ&#x2026;"

§1.4.2 listeIĂ&#x161;flist listeIl0mŠ§Ă&#x161;CÂ&#x160;Ăłaq§´O\ KeIÂŚ^" -len ... -2 -1 0 1 ... len-1

1Â&#x2DC;Â&#x2021;Â&#x192; ... ĂŞ1Â&#x2021;Â&#x192; Â Â&#x2DC;Â&#x2021;Â&#x192; 1Â&#x2DC;Â&#x2021;Â&#x192; 1Â&#x2021;Â&#x192; ... Â Â&#x2DC;Â&#x2021;Â&#x192;

>>> a=[0,1,2,3,4,5,6] annCharles@tom.com

16Â?,208Â?

Python Ă&#x2020;S)P


§1.4 L(list) >>> i=-len(a) >>> while i < len(a): ... print "a[",i,"]=",a[i] ... i=i+1 ... a[ -7 ]= 0 a[ -6 ]= 1 a[ -5 ]= 2 a[ -4 ]= 3 a[ -3 ]= 4 a[ -2 ]= 5 a[ -1 ]= 6 a[ 0 ]= 0 a[ 1 ]= 1 a[ 2 ]= 2 a[ 3 ]= 3 a[ 4 ]= 4 a[ 5 ]= 5 a[ 6 ]= 6 5ÂżwhileÂ&#x160;ĂŠ ?"ÂŹ3 >>> a[-8] Traceback (most recent File "<stdin>", line IndexError: list index >>> a[7] Traceback (most recent File "<stdin>", line IndexError: list index

ÂĄ0 "a[-8] Ă&#x161;a[9] Ă&#x2018;ÂŹĂ&#x161;ĂĽ."

call last): 1, in ? out of range call last): 1, in ? out of range

§1.4.3 flistJ Â&#x152;Ă?LeIÂ?½Â&#x2030;Â&#x152;§^uJĂ&#x2018;Â&#x2DC;Â&#x2021;listÂ&#x2DC;Ă&#x153;Š"eIL² Â&#x2DC;§Â&#x2DC;Â&#x2021;üŠ Â&#x2DC;§ Â&#x2DC;Â&#x2021;(ü Â&#x2DC;§¼m^kĂ&#x2019;ŠÂ&#x2026;"XJĂ&#x2DC;Â?½üŠ Â&#x2DC;§üŠ Â&#x2DC;´0 §XJĂ&#x2DC;Â?½(ü  Â&#x2DC;§(ü Â&#x2DC;´â&#x2C6;&#x2019;1"flist LÂŤÂ?)üŠ Â&#x2DC;?Â&#x192;§Â&#x2DC;Â&#x2014;(ü Â&#x2DC;§´Ă&#x2DC;Â?)(ĂĽ  Â&#x2DC;Â&#x192;" KeIÂ?Â&#x152;¹ÍÂ&#x2020;½Ă&#x201A;üŠ Â&#x2DC;§½Ü(ü Â&#x2DC;" >>> a[1:4] annCharles@tom.com

17Â?,208Â?

Python Ă&#x2020;S)P


Â&#x2DC; Python0 [1, >>> [0, >>> [1, >>> [0, >>> [0, >>> [1,

2, 3] a[:] 1, 2, 3, a[1:] 2, 3, 4, a[:3] 1, 2] a[:] 1, 2, 3, a[1:-1] 2, 3, 4,

4, 5, 6] 5, 6]

4, 5, 6] 5]

flist ´5list Â&#x2DC;Â&#x2021;Â&#x20AC;§Â&#x2DC;Â&#x2021;B§UCflist Ă&#x2DC;ÂŹUC5list"

§1.4.4 ?nlistÂ?{ â&#x20AC;˘ L.append(var) §J\Â&#x192;" >>> >>> >>> [0, >>>

a=[0,1,2,3,4,5] a.append(6) a 1, 2, 3, 4, 5, 6]

â&#x20AC;˘ L.count(var) OÂ&#x17D;var 3LÂĽĂ&#x2018;ygĂŞ" >>> a=[0,2,2,2,3,3] >>> a.count(2) 3 >>> a.count(3) 2 â&#x20AC;˘ len(L) Â&#x2C6;ÂŁL Ă?" >>> a=[1,2,3] >>> len(a) 3 â&#x20AC;˘ L.extend(list) §òlistJ\3L

ÂĄ"

>>> a=[1,2,3] >>> a.extend([4,5,6]) annCharles@tom.com

18Â?,208Â?

Python Ă&#x2020;S)P


§1.4 L(list) >>> a [1, 2, 3, 4, 5, 6] â&#x20AC;˘ L.index(var) Â&#x2C6;ÂŁvar3LÂĽ Â&#x2DC;§eĂ&#x192;§KĂ&#x2018;Ă&#x2030;~" >>> a=[1,2,3,4,4,5] >>> a.index(4) 3 >>> a.index(6) Traceback (most recent call last): File "<stdin>", line 1, in ? ValueError: list.index(x): x not in list â&#x20AC;˘ L.insert(index,var) 3index?§\var§Ă&#x2122;{Â&#x192;Â&#x2022; Ă­"XJindexÂ&#x152;ulist Ă?§Ă&#x2019;3 V\"XJindexu0§Ă&#x2019;3 mŠ?V\" >>> >>> >>> [1, >>> >>> [1, >>> >>> [1,

a=[1,2] a.insert(0,1) a 1, 2] a.insert(100,100) a 1, 2, 100] a.insert(2,3) a 1, 3, 2, 100]

â&#x20AC;˘ L.pop() Â&#x2C6;ÂŁÂ Â&#x2DC;Â&#x2021;Â&#x192;§¿Â&#x2026;Ă­Ă&#x2DC; Â&#x192;§¿Â&#x2026;Ă­Ă&#x2DC;TÂ&#x192;" >>> >>> 3 >>> 0 >>> [1, >>>

Â&#x2DC;Â&#x2021;Â&#x192;"L.pop(index) Â&#x2C6;ÂŁindex?

a=[0,1,2,3,] a.pop() a.pop(0) a 2]

â&#x20AC;˘ L.remove(var) ĂŠvar§¿Â&#x2026;Ă­Ă&#x2DC;Â&#x192;§eĂ&#x192;§Ă&#x2018;Ă&#x2030;~" annCharles@tom.com

19Â?,208Â?

Python Ă&#x2020;S)P


Â&#x2DC; Python0 >>> a=["a","b","a","c","a","d"] >>> a.remove("a") >>> a [â&#x20AC;&#x2122;bâ&#x20AC;&#x2122;, â&#x20AC;&#x2122;aâ&#x20AC;&#x2122;, â&#x20AC;&#x2122;câ&#x20AC;&#x2122;, â&#x20AC;&#x2122;aâ&#x20AC;&#x2122;, â&#x20AC;&#x2122;dâ&#x20AC;&#x2122;] >>> a.remove("a") >>> a [â&#x20AC;&#x2122;bâ&#x20AC;&#x2122;, â&#x20AC;&#x2122;câ&#x20AC;&#x2122;, â&#x20AC;&#x2122;aâ&#x20AC;&#x2122;, â&#x20AC;&#x2122;dâ&#x20AC;&#x2122;] â&#x20AC;˘ L.reverse() òLS" >>> >>> >>> [5,

a=[1,2,3,4,5] a.reverse() a 4, 3, 2, 1]

â&#x20AC;˘ L.sort() §òaĂźS§aÂĽÂ&#x192;ea.Ă&#x2DC;Ă&#x201C;§(JgCwÂ&#x2DC;wj"Â&#x2DC;Â&#x201E;Ă&#x2DC;ÂŹĂšoÂ&#x2030;"Q ,\Ă&#x2018;Ă&#x2DC;(½listÂĽÂ&#x192;a.´Ă&#x201E;Â&#x2DC;§\Â&#x201E;Â&#x2021;ĂźS§@o\Ă?Â&#x2013;´Â&#x;o(J? >>> >>> [1, >>> >>> >>> [1,

a.sort() a 2, 3, 4, 5] a=[1,"abc",2,"xxx"] a.sort() a 2, â&#x20AC;&#x2122;abcâ&#x20AC;&#x2122;, â&#x20AC;&#x2122;xxxâ&#x20AC;&#x2122;]

L.sort(func) §ò^funcÂ&#x160;Â?'Ÿê§òßS"func(x,y)§Â&#x2C6;ÂŁâ&#x2C6;&#x2019;1§0§1ŠOL ÂŤu§u§Â&#x152;u"

§1.4.5 ^list [Ă&#x2122;ÂŚ~^êâ( ^list[ĂŚĂ&#x2019;stack >>> >>> >>> >>> >>> [0, >>> 2

a=[] a.append(0) #Ă&#x2DC;Ă&#x2019; a.append(1) a.append(2) a 1, 2] a.pop() #Ă&#x2018;Ă&#x2019;

annCharles@tom.com

110Â?,208Â?

Python Ă&#x2020;S)P


§1.4 L(list) >>> a.pop() 1 >>> a.pop() 0 >>> ^list[èqueue >>> >>> >>> >>> [2, >>> 0 >>> 1 >>> 2 >>> []

a.insert(-1,0) #\è a.insert(-1,1) a.insert(-1,2) a 1, 0] a.pop() #Ă&#x2018;è a.pop() a.pop() a

½Ü >>> >>> >>> >>> >>> [0, >>> 0 >>> 1 >>> 2 >>> 3

a.append(0) a.append(1) a.append(2) a.append(3) a 1, 2, 3] a.pop(0) a.pop(0) a.pop(0) a.pop(0)

annCharles@tom.com

111Â?,208Â?

Python Ă&#x2020;S)P


Â&#x2DC; Python0 ^list[ätree >>> leaf1=[0,1] >>> leaf2=[2,3] >>> leaf3=[4,5] >>> leaf4=[6,7] >>> branch1=[leaf1,leaf2] >>> branch2=[leaf3,leaf4] >>> root=[branch1,branch2] >>> root [[[0, 1], [2, 3]], [[4, 5], [6, 7]]]

§1.4.6 list comprehension Â&#x160;{: [ <expr1> for k in L if <expr2> ] Â&#x160;Ă&#x201A;: returnList=[] for k in L: if <expr2>: returnList.append(<expr1>) return returnList; Â&#x2C6;ÂŁÂ&#x2DC;Â&#x2021;list§listÂ&#x192;dzÂ&#x2DC;Â&#x2021;expr1 |¤§if Â&#x160;ĂŠ^uLĂ&#x2C6;§Â&#x152;kÂ&#x152;Ă&#x192;" >>> a=["123","456","abc","Abc","AAA"] >>> [ k.center(9) for k in a ] [â&#x20AC;&#x2122; 123 â&#x20AC;&#x2122;, â&#x20AC;&#x2122; 456 â&#x20AC;&#x2122;, â&#x20AC;&#x2122; abc â&#x20AC;&#x2122;, â&#x20AC;&#x2122; Abc #aÂĽ=di1|¤iĂ&#x17D;G§¿rÂŚC¤Â&#x152;" >>> [ k.upper() for k in a if k.isalpha() ] [â&#x20AC;&#x2122;ABCâ&#x20AC;&#x2122;, â&#x20AC;&#x2122;ABCâ&#x20AC;&#x2122;, â&#x20AC;&#x2122;AAAâ&#x20AC;&#x2122;] #aÂĽ=dÂ&#x152;i1|¤iĂ&#x17D;G§¿rÂŚC¤" >>> [ k.lower() for k in a if k.isupper() ] [â&#x20AC;&#x2122;aaaâ&#x20AC;&#x2122;] #aÂĽ=kĂŞi¤iĂ&#x17D;G§¿rÂŚC¤ĂŞa." >>> [ int(k) for k in a if k.isdigit() ] [123, 456]

â&#x20AC;&#x2122;, â&#x20AC;&#x2122;

AAA

â&#x20AC;&#x2122;]

LĂ&#x2C6;(filter)§Ă&#x161;N(mapping)Ă&#x161;Â?Â&#x2DC;" ÂŚ+ĂšÂ&#x2021;^{ĂŠ{ߧ´%Â&#x203A;Šk^§§SC{'§Â&#x152;Ă&#x2013;5r"kĂŠĂľÂ&#x17E;ÿ§¡Â&#x201A; ÂŚ^Ă&#x152;Â&#x201A;Â&#x160;ʧ==Â&#x2030;ĂŠ{߯Â&#x153;§´Ă&#x152;Â&#x201A;Â&#x160;ĂŠ´ÊĂ&#x2DC;Ă?Ă&#x2013;§Ă?Â?Ă&#x152;Â&#x201A;Â&#x160;ĂŠĂ&#x2DC;Ă&#x17D; annCharles@tom.com

112Â?,208Â?

Python Ă&#x2020;S)P


§1.5 iĂ&#x17D;G(string) Ă&#x153;g,Â&#x160;ó¼S."~X¾Þ¥~f¼§kÂ&#x2DC;Â&#x2021;LÂŤâ&#x20AC;&#x153;rlist ÂĽzÂ&#x2021;iĂ&#x17D;GÂĽiĂ&#x17D; C¤Â&#x152;â&#x20AC;?"´XJ^Ă&#x152;Â&#x201A;Â&#x160;ĂŠLÂŤĂ&#x2019;´: â&#x20AC;&#x153;MĂŻÂ&#x2DC;Â&#x2021;Â&#x2DC;list§Êulist ÂĽzÂ&#x2DC;Â&#x2021;Â&#x192;§r ĂšÂ&#x2021;iĂ&#x17D;GC¤Â&#x152;§V\#ĂŻlistÂĽ"â&#x20AC;? Â&#x201E;kĂŠĂľ~f§4¡Â&#x201A;ĂŠg,A^ڍ^{" rlistÂĽ¤kÂ&#x192;\ 1 [ k+1 for k in list] JĂ&#x2018; list ¼¤kĂŞCĂž [ k for k in list if type(k)==types.IntType] r list ÂĽ¤kĂŞÂ&#x192;O\Â&#x2DC; [ k + 1 for k in list if type(k)==types.IntType ] ¡Â&#x161;~U ÚLÂ&#x2C6;Â?ÂŞÂ&#x153;

§1.5 iĂ&#x17D;G(string) §1.5.1 iĂ&#x17D;GLÂŤ ^ĂźĂ&#x161;Ă&#x2019;½VĂ&#x161;Ă&#x2019;¤iĂ&#x17D;G â&#x20AC;&#x2122;helloâ&#x20AC;&#x2122; "world" kÂ&#x2DC; iĂ&#x17D;´Ă&#x192;{^Â&#x2026;Ă&#x2018;\§¤¹^iĂ&#x17D;|Ă&#x153;LÂŤAĂ?iĂ&#x17D;"XL1.5-1" Ú´Ă&#x161;C Â&#x160;ĂłÂ&#x203A;Šaq§Â&#x201E;kecho ¡-§Java Â&#x160;ĂłĂ&#x2018;´ÚoLÂŤÂ&#x2DC;Â&#x2021;AĂ?iĂ&#x17D;" XJÂ&#x2021;Ă&#x2018;\Â&#x2DC;Â&#x2021;Â&#x203A;ŠiĂ&#x17D;G§Â&#x2DC;1Ă&#x2DC;Â?B§Ă&#x2019;^Ăź1"ĂźÂ&#x2021;iĂ&#x17D;GÂĽmdÂ&#x2DC;xiĂ&#x17D; ĂŤ§LÂŤÂ&#x2DC;Â&#x2021;iĂ&#x17D;G"X "abc" \ â&#x20AC;&#x2122;defâ&#x20AC;&#x2122; LÂŤâ&#x20AC;&#x153;abcdefâ&#x20AC;?§5ÂżĂ&#x161;"abc"+"def"´kÂŤO§Â&#x2018;+LÂŤĂźÂ&#x2021;iĂ&#x17D;GĂŤÂ&#x2DC;ü§^Â&#x2DC; xiĂ&#x17D;ĂŤ§LÂŤÂ&#x2DC;Â&#x2021;iĂ&#x17D;G" XJÂ&#x2021;Ă&#x2018;\Â&#x2DC;Â&#x2021;Â&#x203A;ŠÂ&#x203A;ŠiĂ&#x17D;G§Ă&#x2019;^nÂ&#x2021;ĂŤYVĂ&#x161;Ă&#x2019;G"X """ this is a very very long string. And it contains a lot line. it is suitable to write document of function. """ annCharles@tom.com

113Â?,208Â?

Python Ă&#x2020;S)P


Â&#x2DC; Python0 LÂŤiĂ&#x17D;

ÂżĂ&#x201A;

5

\newline

Ă&#x192;

Ă&#x2018;

^uĂŤĂľÂ&#x2021;ĂĄ 1§¤Â&#x2DC;Â&#x2021; 1

\\ \â&#x20AC;&#x2122; \" \a \b \f \n \N{name} \r \t \v \u{xxxx} \ooo \xhh

\ â&#x20AC;&#x2122; " 0x07 0x08 0x0c 0x0a

Â&#x201C;è

0x0d 0x09 0x0b 0xooo 0xhh

Â&#x2021;m ĂźĂ&#x161;Ă&#x2019; VĂ&#x161;Ă&#x2019; Â?$ òÂ&#x201A; Formfeed (FF) Â&#x2020;1 Unicode iĂ&#x17D; ÂŁÂ? Y²Â&#x203A;LĂ&#x17D; RÂ&#x2020;Â&#x203A;LĂ&#x17D; Unicode?è ooo LÂŤl?Â&#x203A;iĂ&#x17D; hh LÂŤÂ&#x203A;8?Â&#x203A;iĂ&#x17D;

ASCII Â&#x203A;Â&#x203A;iĂ&#x17D; ASCII Â&#x203A;Â&#x203A;iĂ&#x17D; ASCII Â&#x203A;Â&#x203A;iĂ&#x17D; ASCII Â&#x203A;Â&#x203A;iĂ&#x17D; Â?ĂŠuUnicode ASCII Â&#x203A;Â&#x203A;iĂ&#x17D;

Â?ĂŠuUnicode

L 1.5-1: iĂ&#x17D;GÂĽ=ÂżiĂ&#x17D; ِϴ

ĂľU

~f

(J

float(str) int(str) int(str,base) long(str) long(str,base)

C¤2:ĂŞ C¤. C¤base?Â&#x203A;ĂŞ C¤. C¤base?Â&#x203A;ĂŞ

float("1e-1") int("12") int("11",2) int("12") int("11",2)

0.1 12 2 12 2

L 1.5-2: iĂ&#x17D;G=Â&#x2020;Â?Ă&#x2122;ÂŚa.

§1.5.2 =Â&#x2020;¤Â?Ă&#x2122;ÂŚa. §1.5.3 iĂ&#x17D;GĂśÂ&#x160; ĂŠĂźÂ&#x2021;iĂ&#x17D;G >>> "Hello" + " " + "World" â&#x20AC;&#x2122;Hello Worldâ&#x20AC;&#x2122; Â&#x152;=Â&#x2020; >>> "this is test".capitalize() #Ă&#x201E;i1Â&#x152; annCharles@tom.com

114Â?,208Â?

Python Ă&#x2020;S)P


§1.5 iĂ&#x17D;G(string) â&#x20AC;&#x2122;This is testâ&#x20AC;&#x2122; >>> "THIS IS TEST".capitalize() â&#x20AC;&#x2122;This is testâ&#x20AC;&#x2122; >>> "THIS IS TEST".lower() #Ă&#x153;C¤ â&#x20AC;&#x2122;this is testâ&#x20AC;&#x2122; >>> "this is test".upper() #Ă&#x153;C¤Â&#x152; â&#x20AC;&#x2122;THIS IS TESTâ&#x20AC;&#x2122; >>> "This Is Test".swapcase() #Â&#x152;pÂ&#x2020; â&#x20AC;&#x2122;tHIS iS tESTâ&#x20AC;&#x2122; iĂ&#x17D;GĂ? >>> len("Hello World") 11 iĂ&#x17D;GfG Â&#x152;ÂąrÂ&#x2DC;Â&#x2021;iĂ&#x17D;Gw¤Â&#x2DC;Â&#x2021;škĂŠĂľiĂ&#x17D;list§ÚÂ&#x152;Âą^Ă&#x161;listÂ&#x192;Ă&#x201C;Â?ÂŞf G"eIl0mŠ"KĂŞÂ&#x201C;LÂ&#x2021;Â&#x2022;" >>> str="Hello World" >>> str="Hello" >>> i=-len(str) >>> while i < len(str): ... print "str[",i,"]=",str[i] ... i=i+1 ... str[ -5 ]= H str[ -4 ]= e str[ -3 ]= l str[ -2 ]= l str[ -1 ]= o str[ 0 ]= H str[ 1 ]= e str[ 2 ]= l str[ 3 ]= l str[ 4 ]= o >>> kĂ&#x2019;Â&#x152;ÂąLÂŤÂ&#x2030;Â&#x152;§fiĂ&#x17D;G"kĂ&#x2019;Ăź>ĂŞLÂŤe.Ă&#x161;Ăž.§e.Ă&#x161;Ăž.Ă&#x2018;´Â&#x152;Ă&#x20AC;§ "Â&#x17D;Ăž3Â?-1§e.Â?0" annCharles@tom.com

115Â?,208Â?

Python Ă&#x2020;S)P


Â&#x2DC; Python0 >>> str="Hello" >>> str[:] â&#x20AC;&#x2122;Helloâ&#x20AC;&#x2122; >>> str[1:2] â&#x20AC;&#x2122;eâ&#x20AC;&#x2122; >>> str[1:-1] â&#x20AC;&#x2122;ellâ&#x20AC;&#x2122; >>> str[-1:2] â&#x20AC;&#x2122;â&#x20AC;&#x2122; Ke.Â?´Â&#x201C;L Â&#x2DC;§Ă&#x2DC;Â&#x201C;LÂ&#x152;"¤¹lĂšÂ&#x2021;ÂżĂ&#x201A;ÞÚ§â&#x2C6;&#x2019;1 Â&#x2021;'2 Â&#x152;"str[-1:2]´Â&#x2DC; iĂ&#x17D;G"AT5¿ŒfiĂ&#x17D;G´ý5iĂ&#x17D;GÂ&#x20AC;§UCiĂ&#x17D;G´Ă&#x2DC;ÂŹUC 5iĂ&#x17D;G"Ă&#x2DC;Â&#x152;Âą^fiĂ&#x17D;GÂ?ÂŞUC5iĂ&#x17D;G"X: >>> a="abcd" >>> b=a[1:2] >>> b="x" #UC b >>> a â&#x20AC;&#x2122;abcdâ&#x20AC;&#x2122; #Ă&#x2DC;ÂŹKÂ? a >>> a[1]=â&#x20AC;&#x2122;abcâ&#x20AC;&#x2122; # Traceback (most recent call last): File "<stdin>", line 1, in ? TypeError: object doesnâ&#x20AC;&#x2122;t support item assignment >>> äiĂ&#x17D;G´Ă&#x201E;ĂĄu,ÂŤaO L1.5-3ÂĽÂ?{Â&#x152;ÂąäiĂ&#x17D;G¼´Ă&#x201E;Ă&#x17D;Ă&#x153;, ^Â&#x2021;"iĂ&#x17D;Gáv^Â&#x2021;§Ă&#x2019;Â&#x2C6;ÂŁ1§Ă&#x201E; K§Â&#x2C6;ÂŁ0" ϴ

^Â&#x2021;

s.isalnum() s.isalpha() s.isdigit() s.islower() s.isupper() s.istitle() s.isspace()

¤kiĂ&#x17D;Ă&#x2018;´êi0123456789 ½Üi1A-Z§a-z ¤kiĂ&#x17D;Ă&#x2018;´i1a-z ½ÜA-Z ¤kiĂ&#x17D;Ă&#x2018;´êi0123456789 ¤kiĂ&#x17D;Ă&#x2018;´i1a-z ¤kiĂ&#x17D;Ă&#x2018;´Â&#x152;i1A-Z ¤kĂźcĂ&#x2018;´Ă&#x201E;i1Â&#x152;§Â&#x201D;Â&#x2021;title ¤kiĂ&#x17D;Ă&#x2018;´Â&#x2DC;xiĂ&#x17D;\n,\t,\r,â&#x20AC;&#x2122; â&#x20AC;&#x2122; L 1.5-3: äiĂ&#x17D;G´Ă&#x201E;ĂĄu,ÂŤaOŸê

annCharles@tom.com

116Â?,208Â?

Python Ă&#x2020;S)P


§1.5 iĂ&#x17D;G(string) 3iĂ&#x17D;GÂĽĂŠfG â&#x20AC;˘ s.find(substring,[start [,end]]) XJĂŠ§Â&#x2C6;£¢Ă&#x161;Â&#x160;§L²´3= kĂŠ "XJĂŠĂ&#x2DC;§Â&#x2C6;ÂŁâ&#x2C6;&#x2019;1 #ok ÂĄabc§a mĂ&#x17E; Â&#x2DC;Â? 3, >>> "ok abc abc abc".find("abc") 3 #l Â&#x2DC;4Âą mŠĂŠ"Â&#x192;u s[4:].find("abc") >>> "ok abc abc abc".find("abc",4) 7 #Â&#x192;u s[4:9].find("abc") >>> "ok abc abc abc".find("abc",4,9) -1 #Â&#x192;u s[4:10].find("abc") >>> "ok abc abc abc".find("abc",4,10) 7 â&#x20AC;˘ s.rfind(substring,[start [,end]]) Ă&#x161;find()aq§´´Â&#x2021;Â&#x2022;ĂŠ" >>> "ok abc abc abc".rfind("abc") 11 â&#x20AC;˘ s.index(substring,[start [,end]] Ă&#x161;find()aq§´XJĂŠĂ&#x2DC;substring§Ă&#x2019; )Â&#x2DC;Â&#x2021;ValueErrorĂ&#x2030;~"ߍÂ?ÂŞĂ&#x2DC;Ă&#x201C;3uÂ&#x2020;Ă&#x2DC;?nĂ&#x2DC;Ă&#x201C;" >>> "ok abc abc abc".index("abc") 3 >>> "ok abc abc abc".index("abcd") Traceback (most recent call last): File "<stdin>", line 1, in ? ValueError: substring not found in string.index â&#x20AC;˘ s.rindex(substring,[start [,end]] Ă&#x161;s.index()aq"Ă&#x2DC;Ă&#x201C;Â&#x192;?3u´Â&#x2021;Â&#x2022;ĂŠ" â&#x20AC;˘ s.count(substring,[start [,end]]) Â&#x2C6;ÂŁĂŠsubstringgĂŞ" >>> "ok abc abc abc".count("abc") 3 annCharles@tom.com

117Â?,208Â?

Python Ă&#x2020;S)P


Â&#x2DC; Python0 Â&#x201A;ÂŞziĂ&#x17D;G Ă&#x201E;  ^ { ´ s % <tuple> §tuple L ÂŤ Â&#x2DC; Â&#x2021; ĂŤ ĂŞ  L § a q uCÂ&#x160; Ăł ÂĽprintf§ rtuple ÂĽzÂ&#x2DC;Â&#x2021;Â&#x160;^iĂ&#x17D;GL§LÂŤÂ&#x201A;ÂŞds 5(½" >>> print "%sâ&#x20AC;&#x2122;s height is %dcm"%("Charles",180) Charlesâ&#x20AC;&#x2122;s height is 180cm 5Âż%s,%dĂ&#x161;CÂ&#x160;ó¼printf´aq§âÂ&#x160;Â&#x2030;conversion specifier§(=Â&#x2020;½Ă&#x201A;) y3X­?Ă&#x2DC;conversion specifier"conversion specifier kÂąeAÂ&#x2021;Ă&#x153;Š¤§ %[<mapping key>][<conversion flag>][<Minimum field width>]| [<precision>][<lenght modifier>]<conversion type>| w X ĂŠ E , § Ă&#x2122; ¢ Â? Â&#x2021; Â&#x2DC; Â&#x2021;% Â&#x2DC; Â&#x2021;conversion typeĂ&#x2019; Â&#x152; Âą " Ă&#x2122; ÂŚ  Ă&#x2018; ´ Â&#x152; Ă&#x20AC; "conversion typeXe: â&#x20AC;˘ d LÂŤkĂ&#x17D;Ă&#x2019;Â&#x203A;?Â&#x203A;ĂŞ" >>> "%d and %d" % (-1,2) -1 and 2 â&#x20AC;˘ i Ă&#x201C;d â&#x20AC;˘ o LÂŤĂ&#x192;Ă&#x17D;Ă&#x2019;l?Â&#x203A;ĂŞ" >>> "%o and %o" % (16,8) 20 and 10 â&#x20AC;˘ u LÂŤĂ&#x192;Ă&#x17D;Ă&#x2019;ĂŞ" >>> "%u and %u" %(-10,10) â&#x20AC;&#x2122;4294967286 and 10â&#x20AC;&#x2122; 5Âżâ&#x2C6;&#x2019;10 )º¤Â?Ă&#x192;Ă&#x17D;Ă&#x2019;ĂŞÂ&#x17E;ÿ§LÂŤÂ&#x2DC;Â&#x2021;ĂŠÂ&#x152;ĂŞ"Ú´Ă?Â?3OÂ&#x17D;Ă&#x2026;ÂĽ^ Ă&#x2013;èLÂŤKê§KĂŞ p ´1§3)º¤Â?Ă&#x192;Ă&#x17D;Ă&#x2019;ĂŞÂ&#x17E;ÿ§Ă&#x2019;ÂŹĂŠÂ&#x152;" â&#x20AC;˘ x LÂŤĂ&#x192;Ă&#x17D;Ă&#x2019;Â&#x203A;8?Â&#x203A;() >>> "%x and %x" % (100,200) â&#x20AC;&#x2122;64 and c8â&#x20AC;&#x2122; â&#x20AC;˘ X LÂŤĂ&#x192;Ă&#x17D;Ă&#x2019;Â&#x203A;8?Â&#x203A;(Â&#x152;) >>> "%X and %X" % (100,200) â&#x20AC;&#x2122;64 and C8â&#x20AC;&#x2122; annCharles@tom.com

118Â?,208Â?

Python Ă&#x2020;S)P


§1.5 iĂ&#x17D;G(string) â&#x20AC;˘ e 2:ê§Â&#x2030;Ă&#x2020;LÂ&#x2C6;ÂŞ{() >>> "%e and %e"%(-100,200) 2.000000e+02 â&#x20AC;˘ E 2:ê§Â&#x2030;Ă&#x2020;LÂ&#x2C6;ÂŞ{(Â&#x152;) >>> "%E and %E"%(-100,200) 2.000000E+02 â&#x20AC;˘ f LÂŤ2:ĂŞ >>> "%f and %f"%(-0.00001,200.0) â&#x20AC;&#x2122;-0.000010 and 200.000000â&#x20AC;&#x2122; â&#x20AC;˘ g LÂŤ2:ê§XJ´u0.0001½ÜĂ&#x2DC; °Ă?§Ă&#x2019;^Â&#x2030;Ă&#x2020;LÂŤ{" >>> "%g and %g"%(-0.00001,2000000.0) â&#x20AC;&#x2122;-1e-05 and 2e+06â&#x20AC;&#x2122; â&#x20AC;˘ c rASCII ĂŞLÂŤĂźÂ&#x2021;iĂ&#x17D; >>> "%c and %c"%(67,68) â&#x20AC;&#x2122;C and Dâ&#x20AC;&#x2122; Â&#x152;^uCĂŞÂ?ASCIIiĂ&#x17D; â&#x20AC;˘ r LÂŤÂ&#x2DC;Â&#x2021;iĂ&#x17D;G§ÚÂ&#x2021;iĂ&#x17D;GÂŚ^repr()Â&#x2C6;ÂŁÂ&#x160; >>> "%r"%({"one":1,"two":2}) "{â&#x20AC;&#x2122;twoâ&#x20AC;&#x2122;: 2, â&#x20AC;&#x2122;oneâ&#x20AC;&#x2122;: 1}" Ă&#x161;print expr(obj) Â&#x2039;<Ă&#x2018;5JÂ&#x2DC;" â&#x20AC;˘ s LÂŤÂ&#x2DC;Â&#x2021;iĂ&#x17D;G§ÚÂ&#x2021;iĂ&#x17D;GÂŚ^str()ŸêÂ&#x2C6;ÂŁÂ&#x160; >>> "%s"%({"one":1,"two":2}) "{â&#x20AC;&#x2122;twoâ&#x20AC;&#x2122;: 2, â&#x20AC;&#x2122;oneâ&#x20AC;&#x2122;: 1}" Ă&#x161;print str(obj) Â&#x2039;<Ă&#x2018;5JÂ&#x2DC;" 5Âżstr Ă&#x161;expr ŸêĂ&#x2DC;Ă&#x201C;"str ´Â&#x2DC;Â&#x2021;ĂŠÂ&#x2013;Â&#x161;ÂŞÂŁĂŁ"expr ´Â&#x2DC; Â&#x2021;iĂ&#x17D;G§´Â&#x2DC;Â&#x2021;Ă&#x153;{Python LÂ&#x2C6;ÂŞÂ&#x160;ʧÂ&#x152;¹ÊÂ&#x2013;" mapping key Â&#x160; ^ ´ ^dictionary Â&#x201C; Otuple § ^mapping keyÂ&#x160; Â?keyL ÂŤdictionaryÂĽ C Ăž " Ăš  Â&#x2018; 5  Ă? ? ´ § J p § S  Â&#x152; Ă&#x2013; 5 §%dĂ&#x161;%(height)' § ĂśÂ&#x152;Ă&#x2013;5Â&#x2021;Ă?" Â&#x2026;§Ă&#x201C;Â&#x2DC;Â&#x2021;CĂžĂ&#x2018;yĂźg¹Þ§3tupleÂĽĂ&#x2019;Â&#x2021;Ăźg§ Â&#x2026;Â&#x2021;5ÂżtupleÂĽÂ&#x192;^SĂ&#x161;Â&#x2021;ĂŞĂ&#x2DC;Â&#x2021;Â&#x2020;§^mapping keyÂ?ÂŞĂ&#x2019;Ă?Ăľ " annCharles@tom.com

119Â?,208Â?

Python Ă&#x2020;S)P


Â&#x2DC; Python0 >>> print "%sâ&#x20AC;&#x2122;s height is %d cm, %sâ&#x20AC;&#x2122;s weight is %d kg" % \ ... ("Charles",170,"Charles",70) Charlesâ&#x20AC;&#x2122;s height is 170 cm, Charlesâ&#x20AC;&#x2122;s weight is 70 kg >>> print "%(name)sâ&#x20AC;&#x2122;s height is %(height)d cm" \ ... ",%(name)sâ&#x20AC;&#x2122;s weight is %(weight)d kg" % \ ... {"name":"Charles","height":170,"weight":70} Charlesâ&#x20AC;&#x2122;s height is 170 cm,Charlesâ&#x20AC;&#x2122;s weight is 70 kg nameĂ&#x2018; y Ăź g § 3mapping keyÂĽ § Ă&#x2019; Ă&#x2DC; ^  Ăź g § Â&#x2026; ĂŤ ĂŞ  ^ S Â? Â&#x152; Âą Â&#x2018; B  " Ă&#x161;locals()ŸêÂ&#x192;Ă&#x153;§kÂ?Ă?J§locals()Â&#x2C6;ÂŁlocal name space (Ă&#x203A;Ă&#x153;¡œÂ&#x2DC; m) §´Â&#x2DC;Â&#x2021;dictionary§Ă&#x2122;ÂĽkey´CĂžœ¥§value´CĂžÂ&#x160;"globals()Â&#x2C6;ÂŁglobal name space (Ă&#x203A;¡œÂ&#x2DC;m) ĂšpÂ?Ă&#x17E;Â&#x2021;~f"3 ÂĄname space(¡œÂ&#x2DC;m)kÂ?[0 " >>> def fun(a,b): ... print "a is %(a)d,b is %(b)d" %locals() ... >>> fun(1,2) a is 1,b is 2 minimum field width LÂŤÂ Ă?" >>> print "%10d,%10d"%(1,2) 1, 2 precision^5L°Ă?§Â?ĂŠ2:ĂŞkÂ&#x160;^§Â&#x2018;koĂ&#x160;\ĂľU" >>> print "%10.2f,%10.2f"%(10.123456,20.126456) 10.12, 20.13 conversion flag ´Ê, a.ĂĽÂ&#x160;^"#LÂŤ^alternate form§XJ´8?Â&#x203A;§@oĂ&#x2019;3 cÂĄ\0§XJ´Â&#x203A;8?Â&#x203A;Ă&#x2019;3cÂĄ\0x ½Ü0X ĂŠĂ&#x2122;ÂŚa.Ă&#x2DC;ĂĽÂ&#x160;^" >>> print "%#x,%#X,%#o" %(16,16,16) 0x10,0X10,020 0 LÂŤ^0Ă&#x2013;§ŒÂ&#x192;ávminimum field width" >>> print "%010d,%010d"%(1,2) 0000000001,0000000002 -LÂŤÂ&#x2020;Êà §XJĂ&#x161;0Ă&#x201C;Â&#x17E;ÂŚ^@o0Ă&#x2019;Ă&#x2DC;ĂĽÂ&#x160;^" >>> print "%-010d,%-010d"%(1,2) 1 ,2 §Â&#x2DC;Â&#x2021;Â&#x2DC;Â&#x201A;§LÂŤ0Ă&#x161;ĂŞcÂĄ\Â&#x2021;Â&#x2DC;Â&#x201A;§KĂŞcÂĄ\-§ annCharles@tom.com

120Â?,208Â?

Python Ă&#x2020;S)P


§1.5 iĂ&#x17D;G(string) >>> print "% 10d,% 10d,% 10d"%(-1,2,-0) -1, 2, 0 + LÂŤwÂŤĂ&#x17D;Ă&#x2019;§ĂŞwÂŤ+§KĂŞwÂŤ>>> print "%+10d,%+10d,%+10d"%(-1,2,0) -1, +2, +0 lenght modifier Ă&#x2018;" Ă&#x2122;ÂŚ{ĂźÂ&#x201A;ÂŞzĂľU â&#x20AC;˘ s.ljust(width) Â&#x2020;ĂŠĂ XJsĂ?vkwidth@o§Ă&#x2019;3 Ă?Â?widthiĂ&#x17D;G"Ă&#x201E;KiĂ&#x17D;Gs"

ÂĄĂ&#x2013;Â&#x2DC;Â&#x201A;§Â&#x2DC;Â&#x2021;

>>> "Hello World".ljust(1) â&#x20AC;&#x2122;Hello Worldâ&#x20AC;&#x2122; >>> "Hello World".ljust(12) â&#x20AC;&#x2122;Hello World â&#x20AC;&#x2122; >>> "Hello World".ljust(16) â&#x20AC;&#x2122;Hello World â&#x20AC;&#x2122; â&#x20AC;˘ s.rjust(width) mĂŠĂ Ă&#x161;Â&#x2020;ĂŠĂ aq" >>> "Hello World".rjust(16) â&#x20AC;&#x2122; Hello Worldâ&#x20AC;&#x2122; >>> "Hello World".rjust(1) â&#x20AC;&#x2122;Hello Worldâ&#x20AC;&#x2122; â&#x20AC;˘ s.center(width) Ă&#x2DC;ÂĽaq§3ĂźĂ&#x17E;Ă&#x2013;Â&#x2DC;Â&#x201A;§ŒsĂ?Â?width§XJsĂ? 'widthÂ&#x152;§@oÂ&#x;oÂ?Ă&#x2DC;Â&#x2030;" >>> "Hello World".center(1) â&#x20AC;&#x2122;Hello Worldâ&#x20AC;&#x2122; >>> "Hello World".center(16) â&#x20AC;&#x2122; Hello World â&#x20AC;&#x2122; â&#x20AC;˘  K Â&#x2DC; x i Ă&#x17D;s.lstrip()  K Â&#x2020; >  Â&#x2DC; x i Ă&#x17D;s.rstrip()  K m >  Â&#x2DC; x i Ă&#x17D;s.lstrip() KĂź>Â&#x2DC;xiĂ&#x17D; >>> "\t a â&#x20AC;&#x2122;a â&#x20AC;&#x2122; >>> "\t a

\t".lstrip() \t".rstrip()

annCharles@tom.com

121Â?,208Â?

Python Ă&#x2020;S)P


Â&#x2DC; Python0 â&#x20AC;&#x2122; aâ&#x20AC;&#x2122; >>> "\t a â&#x20AC;&#x2122;aâ&#x20AC;&#x2122;

\t".strip()

#Â&#x2021;python 2.2.3ÂĽO\ Â&#x2DC;Â&#x2021;Â&#x152;Ă&#x20AC;ĂŤĂŞchars§LÂŤĂ­Ă&#x2DC;Ă&#x2018;y3charsÂĽiĂ&#x17D;"Ă&#x17D; Â&#x2021;s.strip Â&#x192;us.strip("\t \n\r")" iĂ&#x17D;GĂ&#x153;Âż(join)Ă&#x161;Š)(split) s.join(words)§words´ Â&#x2DC; Â&#x2021; Â? š k i Ă&#x17D; G tuple ½ Ăślist "join^sÂ&#x160; Â? Š Â&#x2026; Ă&#x17D; òwordsÂĽiĂ&#x17D;GĂŤĂĽ5§Ă&#x153;ÂżÂ?Â&#x2DC;Â&#x2021;iĂ&#x17D;G" >>> "\n".join(["Hello","World","Python","Said"]) â&#x20AC;&#x2122;Hello\nWorld\nPython\nSaidâ&#x20AC;&#x2122; >>> print "\n".join(["Hello","World","Python","Said"]) Hello World Python Said s.split(words)§words´Â&#x2DC;Â&#x2021;iĂ&#x17D;G§LŠÂ&#x2026;Ă&#x17D;"splitĂśÂ&#x160;Ă&#x161;joinÂ&#x192;Â&#x2021;"ò^sŠ )¤Â&#x2DC;Â&#x2021;list" >>> "This is a book".split(" ") [â&#x20AC;&#x2122;Thisâ&#x20AC;&#x2122;, â&#x20AC;&#x2122;isâ&#x20AC;&#x2122;, â&#x20AC;&#x2122;aâ&#x20AC;&#x2122;, â&#x20AC;&#x2122;bookâ&#x20AC;&#x2122;]

§1.6 |(tuple) P4Âąe5K§Ă&#x201E;ĂžĂ&#x2019;Â&#x152;ÂąĂ?Âştuple" â&#x20AC;˘ â&#x20AC;˘ â&#x20AC;˘ â&#x20AC;˘

tuple´~Ăžlist"tupleĂ&#x2DC;Upop§remove§insertÂ?{" tuple ^() L§Xa=(0§1§2§3§4)§)Ă&#x2019;Â&#x152;ÂąÂ&#x17D;Ă&#x2018;" tuple Â&#x152;Âą^eIÂ&#x2C6;ÂŁÂ&#x192;½Üftuple" tuple Â&#x152;Âą^uĂľÂ&#x2021;CĂžDÂ&#x160;" >>> >>> 1 2 >>> >>> >>> 1 2

a,b=(1,2) print a,b t=(1,2) a,b=t print a,b

annCharles@tom.com

122Â?,208Â?

Python Ă&#x2020;S)P


§1.7 S(sequence) >>> a,b=b,a+1 >>> print a,b >>> 2,2 â&#x20AC;˘ LÂŤÂ?škÂ&#x2DC;Â&#x2021;Â&#x192;tupleÂ?{´: (1§) Š"

ÂĄkÂ&#x2021;Ă?Ă&#x2019;§^5Ă&#x161;ĂźĂ&#x2022;CĂžÂ&#x192;ÂŤ

tuple 'list 5UĂ?§Â?Ă&#x2019;´`§Ă&#x2DC;^JøĂ&#x201E;S+nĂľU"

§1.7 S(sequence) sequence Â?)string§list§tuple"ÂŚÂ&#x201A;Ă&#x2018;kÂąeÂ&#x2DC; Ă?^ĂśÂ&#x160;" â&#x20AC;˘ in ä,Â&#x2021;object ´Ă&#x2DC;´3Â&#x2DC;Â&#x2021;sequence ÂĽ" >>> x=12 >>> l=[12,13] >>> if x in l : print "x is in l" ... x is in l >>> str="abcd" >>> if "a" in str: print " ok " ... ok >>> if 2 in T : print "OK" ... OK â&#x20AC;˘ â&#x20AC;˘ â&#x20AC;˘ â&#x20AC;˘ â&#x20AC;˘ â&#x20AC;˘

sequenceĂ?len(seq) Ă?LeIĂ&#x2122;ÂĽÂ&#x2DC;Â&#x2021;Â&#x192;" seq[i] Ă?LÂ&#x2018;kĂ&#x2019;eIfsequence§seq[start:end] ^+ LÂŤĂŤĂźÂ&#x2021;sequence ^* L­EÂ&#x2DC;Â&#x2021;sequence§"a"*3 LÂŤaaa§(1,2)*3LÂŤ(1,2,1,2,1,2) Â&#x152;¹Œ^list comprehension"

§1.8 i;(dictionary) dictionary ´ Â&#x2DC; Â&#x2021; Ă&#x192; S  ; (  " z Â&#x2DC;  Â&#x192; ´ Â&#x2DC; Â&#x2021;pair§ Â? )keyĂ&#x161;valueĂź Â&#x2021; Ă&#x153; Š "key a . ´integer½ Ăśstring1 "value a . Â&#x2018; B Â&#x; o Ă&#x2018; Â&#x152; Âą "dictionaryÂĽ v k ­ E key"dictionaryÂĽ  z Â&#x2DC; Â&#x2021;  Â&#x192; ´ Â&#x2DC; Â&#x2021;tuple§tupleÂĽ k Ăź Â&#x2021;  Â&#x192; § Ăš Â&#x2021;tuplepair§pairÂĽcÂĄ´key§ ÂĄvalue"Â&#x152;Âą^D[key] Â?ÂŞvalue" 1

½Ü?Ă&#x203A;Ă&#x201C;Â&#x17E;šk hash Ă&#x161; cmp

annCharles@tom.com

Â?{ĂŠÂ&#x2013;

123Â?,208Â?

Python Ă&#x2020;S)P


Â&#x2DC; Python0

§1.8.1 {Ăź~f # MĂŻÂ&#x2DC;Â&#x2021;{Ăź dictionary ÂŚ^ {} s)Ă&#x2019;)ĂĽ5§ # zÂ&#x2021;pair^Ă?Ă&#x2019;ŠÂ&#x2026;§pairÂĽkey3c§value3 §kĂ&#x2019;ŠÂ&#x2026;" >>> pricelist={"clock":12,"table":100,"xiao":100 } # Ă&#x161;^ dictionary ÂĽÂ&#x2DC;Â&#x2021;Â&#x192; valueÂ&#x17E;§^ key Â&#x2030;eI " >>> pricelist["clock"] 12 >>> del pricelist["clock"] >>> pricelist {â&#x20AC;&#x2122;tableâ&#x20AC;&#x2122;: 100, â&#x20AC;&#x2122;xiaoâ&#x20AC;&#x2122;: 100} # dict(L) Â&#x152;ÂąEÂ&#x2DC;Â&#x2021; dictionary # Ă&#x2122;ÂĽ L ´Â&#x2DC;Â&#x2021; list§ LÂĽzÂ&#x2DC;Â&#x2021;Â&#x192;´Â&#x2DC;Â&#x2021;tuple§ # tupleÂĽkĂźÂ&#x2021;Â&#x192;§cÂĄ´key§ ÂĄvalue" >>> pricelist=dict([(â&#x20AC;&#x2122;clockâ&#x20AC;&#x2122;,12),("table",100),("xiao",100)]) >>> pricelist {â&#x20AC;&#x2122;tableâ&#x20AC;&#x2122;: 100, â&#x20AC;&#x2122;xiaoâ&#x20AC;&#x2122;: 100, â&#x20AC;&#x2122;clockâ&#x20AC;&#x2122;: 12} >>> pricelist=dict([(x,10*x) for x in [1,2,3]]) >>> pricelist {1: 10, 2: 20, 3: 30} #eĂŠÂ&#x2DC;Â&#x2021;Ă&#x2DC;3keyÂ&#x2030;DÂ&#x160;ĂśÂ&#x160;§KO\Â&#x2DC;Â&#x2021;pair" >>> pricelist["apple"]=12 #O\Â&#x2DC;Â&#x2021; Â&#x192; >>> pricelist {â&#x20AC;&#x2122;tableâ&#x20AC;&#x2122;: 100, â&#x20AC;&#x2122;appleâ&#x20AC;&#x2122;: 12, â&#x20AC;&#x2122;xiaoâ&#x20AC;&#x2122;: 100, â&#x20AC;&#x2122;clockâ&#x20AC;&#x2122;: 12} #XJĂ&#x2013;Ă&#x2DC;3key§Ă&#x2018;Ă&#x2030;~" >>> pricelist["appled"] Traceback (most recent call last): File "<stdin>", line 1, in ? KeyError: appled

§1.8.2 dictionaryĂśÂ&#x160; b a={"one":1,"two":2,"three":3,"four":4} Â&#x2DC;Â&#x2DC;dictionary ِϴD.clear() >>> a.clear() >>> a {} annCharles@tom.com

124Â?,208Â?

Python Ă&#x2020;S)P


§1.8 i;(dictionary) Â&#x2DC;Â&#x2DC;Â&#x2DC;Â&#x2021;dictionary D.copy() Â&#x2DC;Â&#x2021;dictionary Â&#x2DC;Â&#x2021;Â&#x20AC; >>> a {â&#x20AC;&#x2122;fourâ&#x20AC;&#x2122;: 4, â&#x20AC;&#x2122;threeâ&#x20AC;&#x2122;: 3, â&#x20AC;&#x2122;twoâ&#x20AC;&#x2122;: >>> b=a.copy() >>> b {â&#x20AC;&#x2122;fourâ&#x20AC;&#x2122;: 4, â&#x20AC;&#x2122;oneâ&#x20AC;&#x2122;: 1, â&#x20AC;&#x2122;threeâ&#x20AC;&#x2122;: >>> b["four"]=5 >>> b {â&#x20AC;&#x2122;fourâ&#x20AC;&#x2122;: 5, â&#x20AC;&#x2122;oneâ&#x20AC;&#x2122;: 1, â&#x20AC;&#x2122;threeâ&#x20AC;&#x2122;: >>> a {â&#x20AC;&#x2122;fourâ&#x20AC;&#x2122;: 4, â&#x20AC;&#x2122;threeâ&#x20AC;&#x2122;: 3, â&#x20AC;&#x2122;twoâ&#x20AC;&#x2122;: >>> c=a >>> c["four"]=5 >>> a {â&#x20AC;&#x2122;fourâ&#x20AC;&#x2122;: 5, â&#x20AC;&#x2122;threeâ&#x20AC;&#x2122;: 3, â&#x20AC;&#x2122;twoâ&#x20AC;&#x2122;: >>> c {â&#x20AC;&#x2122;fourâ&#x20AC;&#x2122;: 5, â&#x20AC;&#x2122;threeâ&#x20AC;&#x2122;: 3, â&#x20AC;&#x2122;twoâ&#x20AC;&#x2122;:

2, â&#x20AC;&#x2122;oneâ&#x20AC;&#x2122;: 1}

3, â&#x20AC;&#x2122;twoâ&#x20AC;&#x2122;: 2}

3, â&#x20AC;&#x2122;twoâ&#x20AC;&#x2122;: 2} 2, â&#x20AC;&#x2122;oneâ&#x20AC;&#x2122;: 1}

2, â&#x20AC;&#x2122;oneâ&#x20AC;&#x2122;: 1} 2, â&#x20AC;&#x2122;oneâ&#x20AC;&#x2122;: 1}

Â&#x20AC;"lÞ¥~fÂ&#x152;Âąw§XJÂ&#x2020;DÂ&#x160;c=a§@ocĂ&#x161;aÂ&#x2DC;§?UcSNĂ&#x201C;ÂŹ KÂ?a"´XJb=a.copy()§@ob´Ă&#x2022;ĂĄ§UbĂ&#x2DC;ÂŹKÂ?a" D.get(key) eDÂĽkkey§@oÂ&#x2C6;ÂŁD[key]§Ă&#x201E;KÂ&#x2C6;ÂŁNone >>> a {â&#x20AC;&#x2122;fourâ&#x20AC;&#x2122;: 4, â&#x20AC;&#x2122;threeâ&#x20AC;&#x2122;: 3, â&#x20AC;&#x2122;twoâ&#x20AC;&#x2122;: 2, â&#x20AC;&#x2122;oneâ&#x20AC;&#x2122;: 1} >>> print a.get("abc") None >>> print a.get("four") 4 >>> print a.get("abc",100) 100 D.get(key,default) Ă&#x161;D.get(key)Ă&#x2DC;Ă&#x201C;3u§eĂ&#x192;key§KÂ&#x2C6;ÂŁdefault§ Ă&#x2DC;´None "D.get(key)Â&#x192;uD.get(key,None)" annCharles@tom.com

125Â?,208Â?

Python Ă&#x2020;S)P


Â&#x2DC; Python0 D.haskey(key) ^uäD ¼´Ă&#x201E;škkey§Â&#x192;ukey in D.keys()" >>> a {â&#x20AC;&#x2122;fourâ&#x20AC;&#x2122;: 4, â&#x20AC;&#x2122;threeâ&#x20AC;&#x2122;: 3, â&#x20AC;&#x2122;twoâ&#x20AC;&#x2122;: 2, â&#x20AC;&#x2122;oneâ&#x20AC;&#x2122;: 1} >>> print a.has_key("one") 1 >>> print a.has_key("abc") 0 D.items() Â&#x2DC;Â&#x2021;list§Ă&#x2122;ÂĽzÂ&#x2021;Â&#x192;´Â&#x2DC;Â&#x2021;škĂźÂ&#x2021;Â&#x192;tuple(pair)§tupleÂĽc¥´key§ ¥´value >>> a {â&#x20AC;&#x2122;fourâ&#x20AC;&#x2122;: 4, â&#x20AC;&#x2122;threeâ&#x20AC;&#x2122;: 3, â&#x20AC;&#x2122;twoâ&#x20AC;&#x2122;: 2, â&#x20AC;&#x2122;oneâ&#x20AC;&#x2122;: 1} >>> a.items() [(â&#x20AC;&#x2122;fourâ&#x20AC;&#x2122;, 4), (â&#x20AC;&#x2122;threeâ&#x20AC;&#x2122;, 3), (â&#x20AC;&#x2122;twoâ&#x20AC;&#x2122;, 2), (â&#x20AC;&#x2122;oneâ&#x20AC;&#x2122;, 1)] D.copy()Â&#x192;udict(D.items()) §´eÂ&#x2013;B§^copy()Â?ÂŻ" D.keys() list§škDÂĽ¤kkey" >>> a {â&#x20AC;&#x2122;fourâ&#x20AC;&#x2122;: 4, â&#x20AC;&#x2122;threeâ&#x20AC;&#x2122;: 3, â&#x20AC;&#x2122;twoâ&#x20AC;&#x2122;: 2, â&#x20AC;&#x2122;oneâ&#x20AC;&#x2122;: 1} >>> a.keys() [â&#x20AC;&#x2122;fourâ&#x20AC;&#x2122;, â&#x20AC;&#x2122;threeâ&#x20AC;&#x2122;, â&#x20AC;&#x2122;twoâ&#x20AC;&#x2122;, â&#x20AC;&#x2122;oneâ&#x20AC;&#x2122;] a.copy()Â&#x201E;Â&#x152;Âą¤dict([(k,a[k]) for k in a.keys() ]) >>> dict([ (k,a[k]) for k in a.keys()]) {â&#x20AC;&#x2122;fourâ&#x20AC;&#x2122;: 4, â&#x20AC;&#x2122;oneâ&#x20AC;&#x2122;: 1, â&#x20AC;&#x2122;threeâ&#x20AC;&#x2122;: 3, â&#x20AC;&#x2122;twoâ&#x20AC;&#x2122;: 2} ,§XJ==´Â? copy§Ă&#x2DC;Â&#x2021;ĂšoZ§^a.copy()§Ă?Â?Â?ÂŻ" D.values() list§škDÂĽ¤kvalue" >>> a {â&#x20AC;&#x2122;fourâ&#x20AC;&#x2122;: 4, â&#x20AC;&#x2122;threeâ&#x20AC;&#x2122;: 3, â&#x20AC;&#x2122;twoâ&#x20AC;&#x2122;: 2, â&#x20AC;&#x2122;oneâ&#x20AC;&#x2122;: 1} >>> a.values() [4, 3, 2, 1] annCharles@tom.com

126Â?,208Â?

Python Ă&#x2020;S)P


§1.9 §S6§ D.update(E) lEÂĽ#êâ"Âżg´ for k in E.keys(): D[k]=E[k] ~XÂľ >>> a {â&#x20AC;&#x2122;fourâ&#x20AC;&#x2122;: 4, â&#x20AC;&#x2122;threeâ&#x20AC;&#x2122;: 3, â&#x20AC;&#x2122;twoâ&#x20AC;&#x2122;: 2, â&#x20AC;&#x2122;oneâ&#x20AC;&#x2122;: 1} >>> b={"five":5,"three":30} >>> b {â&#x20AC;&#x2122;fiveâ&#x20AC;&#x2122;: 5, â&#x20AC;&#x2122;threeâ&#x20AC;&#x2122;: 30} >>> b.update(a) >>> b {â&#x20AC;&#x2122;fourâ&#x20AC;&#x2122;: 4, â&#x20AC;&#x2122;fiveâ&#x20AC;&#x2122;: 5, â&#x20AC;&#x2122;oneâ&#x20AC;&#x2122;: 1, â&#x20AC;&#x2122;threeâ&#x20AC;&#x2122;: 3, â&#x20AC;&#x2122;twoâ&#x20AC;&#x2122;: 2} ڍÂ?{Â&#x152;Âą^5lÂ&#x2DC;Â&#x2021;dictionary Â&#x2022;,Â&#x2DC;Â&#x2021;dictionary DÂ&#x160;" D.popitem() Â&#x2DC;Â&#x2021;pair§¿Â&#x2026;Ă­Ă&#x2DC;ÂŚ"eD´Â&#x2DC;§Ă&#x2018;Ă&#x2030;~" >>> print a.popitem() (â&#x20AC;&#x2122;fourâ&#x20AC;&#x2122;, 4) >>> print a.popitem() (â&#x20AC;&#x2122;threeâ&#x20AC;&#x2122;, 3) >>> print a.popitem() (â&#x20AC;&#x2122;twoâ&#x20AC;&#x2122;, 2) >>> print a.popitem() (â&#x20AC;&#x2122;oneâ&#x20AC;&#x2122;, 1) >>> print a.popitem() Traceback (most recent call last): File "<stdin>", line 1, in ? KeyError: popitem(): dictionary is empty

§1.9 §S6§ ?§Â&#x160;Ăł§S6§kn§^S§Š|§Ă&#x152;Â&#x201A;"

§1.9.1 Š|(if Â&#x160;{ annCharles@tom.com

127Â?,208Â?

Python Ă&#x2020;S)P


Â&#x2DC; Python0 if <expr1>: <one_line_statement> ½Ü if <expr1>: <statement-block> ½Ü if <expr1: <statement-block> else: <statement-block> ½Ü if <expr1>: <statement-block> elif <expr2>: <statement-block> elif <expr3>: <statement-block> ... else: <statement-block> ĂšpAT5¿¹eA: â&#x20AC;˘ if ÂĄLÂ&#x2C6;ÂŞÂ&#x152;¹´?Ă&#x203A;LÂ&#x2C6;ª§Ă&#x2DC; None§0§""(Â&#x2DC;iĂ&#x17D;G)§[] (Â&#x2DC;list)§{}( Â&#x2DC;dictionary ) ()(Â&#x2DC;tuple )Âą §Ă&#x2122;ÂŚĂ&#x2018;´ý" â&#x20AC;˘ LÂ&#x2C6;ÂŞÂąkĂ&#x2019;ŠÂ&#x2026;" â&#x20AC;˘ e´Â&#x2DC;1{ĂźLÂ&#x2C6;ª§Â&#x152;ÂąÂ&#x2020;Â&#x2039;3 ÂĄ" â&#x20AC;˘ e´þ1LÂ&#x2C6;ª§Ă&#x2019;Â&#x2021;^ ?Â?ª§LÂŤÂ&#x2DC;|Â&#x160;ĂŠ"3PythonÂĽvkPascal ÂĽ begin ... end §½ÜC Â&#x160;ó¼{ } 5LÂŤÂ&#x2DC;|Â&#x160;ĂŠmŠĂ&#x161;(ĂĽ"Python@Â? Ă&#x201C; ?Ă?Â&#x160;Ê´Â&#x2DC;|"Ú´Â&#x2DC;Â&#x2021;;ĂśÂ&#x201E;;ÂŻÂ&#x153;"Ă??Ă&#x2019;´§Jp Â&#x152;Ă&#x2013;5§ ?Ă&#x203A;<?§SĂ&#x2018;´aq§Ă&#x2DC;Â&#x201D;CÂĽkÂ&#x2C6;ÂŤÂ&#x2C6;ÂşÂ&#x201A;§krâ&#x20AC;&#x153;{â&#x20AC;? ;3if ¥§kK,ĂĽÂ&#x2DC;1"Ă&#x2DC;Ă?/Â?Ă&#x2019;´§Ú´Â&#x2021;#:f§Êþ<Ă&#x2018;Ă&#x2DC;S.§<Â&#x201A;Â&#x2DC; Â&#x2022;@Â??§Â&#x160;ó¼Â&#x2DC;xiĂ&#x17D;Ă&#x2DC;AT´Â&#x160;{Â&#x2DC;Ă&#x153;Š" Â&#x2026;k?6ĂŹĂ&#x2DC;UŠOtab Ă&#x161;4£½8¤Â&#x2021;Â&#x2DC;Â&#x201A;ÂŤO§Ă&#x2019;ÂŹkÂ&#x2DC; #ÂśĂ&#x2122;ŠÂ&#x160;{Â&#x2020;Ă&#x2DC;" â&#x20AC;˘ PythonÂĽĂ?Â&#x201D;vkswitchÂ&#x160;ʧelif^5¤ÚÂ&#x2021;ĂľU2 " â&#x20AC;˘ elseÂ&#x2039;LÂŤ^Â&#x2021;Ă&#x2DC;ávÂ&#x17E;ATÂ&#x2030;1Â&#x160;ʧO# ÂĄkĂ&#x2019;" >>> if x>0: 2

Â&#x2021;<@Â?XJkswitch Â&#x160;ĂŠÂŹÂ?Ă?

annCharles@tom.com

128Â?,208Â?

Python Ă&#x2020;S)P


§1.9 §S6§ ... print "x ... elif x==0: ... print "x ... elif x < 0: ... print "x ... else: ... print "x ...

is positive" is zero" is negative" is not a number"

§1.9.2 ̂(for§while§break§continue§range() for̂Š{ for x in <sequence>: <statement-block> else: <else-block> • sequenceL«?Ûstring§tuple§dictionary >>> for x in "abc" : print x ... a b c >>> for x in [1,2,3]: print x ... 1 2 3 >>> D={"one":1,"two":2,"three":3} >>> for x in D: print "D[",x,"]=",D[x] ... D[ three ]= 3 D[ two ]= 2 D[ one ]= 1

• breakŠéŒ±r1òÑ̂§ÚC˜" annCharles@tom.com

129,208

Python ÆS)P


Â&#x2DC; Python0 â&#x20AC;˘ else´Â&#x152;kÂ&#x152;Ă&#x192;"ek§KLÂŤXJzÂ&#x2021;aÂĽÂ&#x192;Ă&#x2018;Ă&#x152;Â&#x201A; (vkbreak)§@o Ă&#x2019;Â&#x2030;1else-block"ĂšÂ&#x2DC;:ĂŠĂ?§Ă?Â?¡3CÂ&#x160;󼧲~Â&#x2021;ĂšoÂ&#x160;" for(i=0;i<len;i++){ if(a[i]==100) break; } if(i==len){/*100 not found*/ /*do something*/ } 3PythonÂĽ >>> [1, >>> ... ... ... ... 100

a 2, 3, 4] for x in a: if x==100: break else: print "100 not found" not found

else Â&#x160;ĂŠÂ&#x152;Âąn)Â?ÂľXJĂ&#x152;Â&#x201A;vkbreak Â&#x160;ĂŠr1¼ä§½Ü`Ă&#x152;Â&#x201A;~(ĂĽ §Ă&#x2019;ÂŹÂ&#x2030;1elseÂĽÂ&#x160;ĂŠ"ĂšÂ&#x201E;´)MÂ&#x160;{£ã§Â&#x160;Ă&#x201A;ÂŁĂŁÂŹÂ?\Â&#x2DC;Ă&#x2122;§~XĂž ÂĄ~f§¿g´`XJ3aÂĽĂŠĂ&#x2DC;100§@oĂ&#x2019;ÂŹÂ&#x2030;1elseÂĽÂ&#x160;ĂŠ"Â&#x160;Ă&#x201A;3Â&#x2C6;Â&#x2021; ĂžeŠÂ&#x153;šeÂŹk¤Ă&#x2DC;Ă&#x201C;"Â&#x2DC;Â&#x201E;Â&#x153;še§breakĂ&#x2018;ÂŹ3Â&#x2DC;Â&#x2021;if Â&#x160;ĂŠ ÂĄ3 §elseĂ&#x2019; ´L§XJ@Â&#x2021;if Â&#x160;ĂŠ3Ă&#x152;Â&#x201A;ÂĽl5Ă&#x2018;vk¤åL§Ă&#x2019;ÂŹÂ&#x2030;1else ÂĽÂ&#x160;ĂŠ" Þ¥~f¼§if ^Â&#x2021;´x==100§@oXJaÂĽ?ÂżÂ&#x192;x§Ă&#x2018;knot x==100§@ oelseÂĽÂ&#x160;ĂŠĂ&#x2019;ÂŹÂ&#x2030;1" â&#x20AC;˘ ?UxÂżĂ&#x2DC;U ?Ux3aÂĽĂŠASN" >>> >>> ... ... >>> 5 >>> [1, 3

a=[1,2,3,4] for x in a: x=x+1 x a 2, 3, 4]

Ă&#x201E;KĂ&#x152;Â&#x201A;Ă&#x2019;Â&#x201D;ÂżĂ&#x201A;

annCharles@tom.com

130Â?,208Â?

Python Ă&#x2020;S)P


§1.9 §S6§ 5¿§´Ă&#x2DC;U?Ux3aÂĽĂŠASN§XJ´Dictionary§@ovk?Ux§ ´Â&#x2020; ?UDictionary ÂĽSN"wLname space VgĂşÚÊg," >>> D={"one":1,"two":2,"three":3} >>> for x in D: ... D[x] += 1; ... >>> D {â&#x20AC;&#x2122;threeâ&#x20AC;&#x2122;: 4, â&#x20AC;&#x2122;twoâ&#x20AC;&#x2122;: 3, â&#x20AC;&#x2122;oneâ&#x20AC;&#x2122;: 2} eÂ&#x2021;?U§Ă&#x2019;^range()Ÿê"range([start,]stop,[,step])§LÂŤlstartmŠ§ stop(ü§zĂ&#x161;O\step§start"Â&#x17D;Â?0§step"Â&#x17D;Â?1§Â&#x2C6;ÂŁÂ&#x2DC;Â&#x2021;list" >>> [0, >>> [1, >>> [1, >>> []

range(10) 1, 2, 3, 4, 5, 6, 7, 8, 9] range(1,10) 2, 3, 4, 5, 6, 7, 8, 9] range(1,10,2) 3, 5, 7, 9] range(1,10,-1)

eÂ&#x152;U)Ă&#x192; Â&#x2021;ê§@o´Â&#x2DC;list§Ă&#x2DC;ÂŹkkĂ&#x152;Â&#x201A;" |^range()Ÿê?Ulist >>> [1, >>> ... ... >>> [3, >>>

a 2, 3, 4] for x in range(len(a)): a[x]=a[x]+2 a 4, 5, 6]

whileĂ&#x152;Â&#x201A;Â&#x160;{" while <expr1>: <block> else: <else-block> annCharles@tom.com

131Â?,208Â?

Python Ă&#x2020;S)P


Â&#x2DC; Python0 Ăš Â&#x2021; Ă&#x152; Â&#x201A;  Âż g ´ § Â? Â&#x2021;expr1´ Ă˝ § @ o Ă&#x2019; Â&#x2DC; Â&#x2020; Â&#x2030; 1blockÂĽ  Â&#x160; ĂŠ " X J vbreakaĂ&#x2018;Ă&#x152;Â&#x201A;§Â?Ă&#x2019;´`§3Ă&#x152;Â&#x201A;(ĂĽÂ&#x17E;Ăżexpr1´b§@oÂ&#x2030;1else-blockÂĽ Â&#x160;ĂŠ" >>> i=0 >>> while i < ... print ... 0 1 2 >>> while i < ... print ... else: ... print ... 0 1 2 i is 3

3: i ; i=i+1

3: i; i = i +1 i , "is 3"

ZO# i=i+1§Ă&#x201E;KĂ&#x2019;ÂŹkkĂ&#x152;Â&#x201A;"

§1.10 Ÿê Ÿê´Â&#x2DC;ĂŁÂ&#x152;¹­EÂŚ^Â&#x201C;è"

§1.10.1 Ă&#x201E;Ÿê^{ Â&#x160;{: def <function_name> ( <parameters_list> ): <code block> `²: â&#x20AC;˘ function_name´Ÿêœ¥§kĂ&#x2019;^5ŠÂ&#x2026;ŸêSN" â&#x20AC;˘ parameters_list´ÍêL"ĂŤĂŞÂ?vka.§Â&#x152;ÂąD4?Ă&#x203A;a.Â&#x160;Â&#x2030;Ÿê§d ŸêSN½Ă&#x201A;ŸêÂ?§XJD4ĂŤĂŞa.Ă&#x2DC;´ŸêÂ&#x17D;Â&#x2021;§@oŸêÂ&#x152;Âą Ă&#x2018;Ă&#x2030;~" â&#x20AC;˘ code block´Ă&#x161;if§whileÂ&#x2DC;Â&#x201C;è"5ÂżATkÂ&#x192;Ă&#x201C; ?" annCharles@tom.com

132Â?,208Â?

Python Ă&#x2020;S)P


§1.10 Ÿê â&#x20AC;˘ ŸêvkÂ&#x2C6;ÂŁÂ&#x160;a.§returnÂ&#x152;ÂąÂ&#x2C6;ÂŁ?Ă&#x203A;a." ~f: >>> def add(a,b): ... return a+b; ... >>> print add(1,2) 3 >>> print add("abc","def") abcdef >>> print add("abc",12) Traceback (most recent call last): File "<stdin>", line 1, in ? File "<stdin>", line 2, in add TypeError: cannot concatenate â&#x20AC;&#x2122;strâ&#x20AC;&#x2122; and â&#x20AC;&#x2122;intâ&#x20AC;&#x2122; objects >>> myadd=add >>> myadd(1,2) 3 ِϴÂ?´Â&#x2DC;Â&#x2021;CÞ§Â&#x2DC;Â&#x2021;ĂŠÂ&#x2013;"Pâ&#x20AC;&#x153;Â&#x2DC;Â&#x192;Ă&#x2018;´ÊÂ&#x2013;â&#x20AC;?"¤¹Â&#x152;ÂąÂ&#x201D;Ă&#x160;Ă?ĂŠÂ&#x2013;Â&#x2DC;§ rÂ&#x2DC;Â&#x2021;ŸêDÂ&#x160;Â&#x2030;,Â&#x2DC;Â&#x2021;CĂž"myadd=add§Úk:Â&#x201D;ŸêÂ?"âÂ&#x160;Â&#x2030;function alias§ ŸêOÂś"

§1.10.2 ĂŤĂŞÂ&#x2021;ĂŞÂ&#x152;Ă&#x20AC;§Íêk%@Â&#x160; PC++§VBÂĽÂ&#x152;CꐤPythonÂ&#x2DC;kaqĂ&#x2026;Â&#x203A;"~f: >>> def myjoin(str,sep=","): ... return sep.join(str) ... >>> myjoin(["a","b","c"]) â&#x20AC;&#x2122;a,b,câ&#x20AC;&#x2122; >>> myjoin(["a","b","c"],";") â&#x20AC;&#x2122;a;b;câ&#x20AC;&#x2122; sep"Â&#x17D;Â&#x160;´â&#x20AC;&#x153;§â&#x20AC;?§^Ă?Ă&#x2019;Š§XJvkJøsepꐤ@o§Ă&#x2019;^â&#x20AC;&#x153;§â&#x20AC;?"´XJÂ&#x2DC; Â&#x2021;Íê´Â&#x152;Ă&#x20AC;§@oÂŚ ÂĄ¤kĂŤĂŞĂ&#x2018;AT´Â&#x152;Ă&#x20AC;ĂŤĂŞ" >>> def myrange(start=0,stop,step=1): ... print stop,start,step ... annCharles@tom.com

133Â?,208Â?

Python Ă&#x2020;S)P


Â&#x2DC; Python0 SyntaxError: non-default argument follows default argument

§1.10.3 UCŸêÍêDÂ&#x160;^S XJ½Ă&#x201A; Â&#x2DC;Â&#x2021;¹ÞÂ&#x152;Ă&#x20AC;ꐤ5´Ă&#x2DC;UUCĂŤĂŞD4^S§ >>> def printValues(name,height=170,weight=70): ... print("%sâ&#x20AC;&#x2122;s height is %d cm," ... " his weigth is %d kg\n"%(name,height,weight)) ... >>> printValues("Charles") Charlesâ&#x20AC;&#x2122;s height is 170 cm, his weigth is 70 kg >>> printValues("Charles",175) Charlesâ&#x20AC;&#x2122;s height is 175 cm, his weigth is 70 kg >>> printValues("Charles",175,85) Charlesâ&#x20AC;&#x2122;s height is 175 cm, his weigth is 85 kg >>> ´Â&#x152;ÂąĂ?LeÂĄÂ?ÂŞUCĂŤĂŞ^S" >>> printValues("Charles",weight=85) Charlesâ&#x20AC;&#x2122;s height is 170 cm, his weigth is 85 kg

§1.10.4 Â&#x2021;ĂŞÂ&#x152;CĂŤĂŞ XJ^LCÂ&#x160;ó¼printf()§@oĂ&#x2019;ÂŹĂŠĂŤĂŞÂ&#x2021;ĂŞÂ&#x152;CÂżĂ&#x201A;' )"ÂŚ+Â&#x152;Ă&#x20AC;ĂŤ ĂŞĂ&#x2026;Â&#x203A;-ŸêĂŤĂŞÂ&#x2021;ê´Â&#x152;C§´Â&#x201E;´k Â&#x203A;§ÍêÂ&#x2021;ĂŞk Â&#x152; Â&#x203A;§ Â&#x2026;Â&#x201E;Â&#x2021;Â? ²= ´Â&#x152;Ă&#x20AC;ĂŤĂŞ" eÂĄĂšÂ&#x2021;Ă&#x2026;Â&#x203A;§Â&#x152;ÂąĂ&#x2030;?¿þÂ&#x2021;ĂŤĂŞ" >>> def printf(format,*arg): ... print format%arg ... >>> printf ("%d is greater than %d",1,2) 1 is greater than 2 Ă&#x2122;ÂĽ*arg7L´ Â&#x2DC;Â&#x2021;ꐤ*LÂŤĂ&#x2030;?¿þÂ&#x2021;ꐤĂ&#x2DC; cÂĄĂŤĂŞ ĂŤĂŞĂ&#x2018;Â&#x160;Â?Â&#x2DC;Â&#x2021;tupleD4Â&#x2021;Ÿêprintf§Â&#x152;ÂąĂ?Larg5Â&#x2013;ÂŻ"

§þ{

>> def printf(format,*arg): ... print type(arg) ... print format%arg >>> printf("a",1) <type â&#x20AC;&#x2122;tupleâ&#x20AC;&#x2122;> annCharles@tom.com

134Â?,208Â?

Python Ă&#x2020;S)P


§1.10 Ÿê 3Ÿê¼§arg ´Â&#x2DC;Â&#x2021;tuple§Â&#x152;ÂąĂ?LÂ&#x2013;ÂŻtupleÂ?{§5Â&#x2013;ÂŻarg" Â&#x201E;kÂ&#x2DC;ÂŤÂ?ÂŞ5¢y?ÂżÂ&#x2021;êÍê§Ă&#x2019;´ÍêUĂŹdictionaryÂ?ÂŞD4Â&#x2021;Ÿê§Ÿê Ă&#x201C;Â&#x152;ÂąĂ&#x2030;?¿þÂ&#x2021;ĂŤĂŞ" >>> def printf(format,**keyword): ... for k in keyword.keys(): ... print "keyword[%s] is %s"%(k,keyword[k]) ... >>> printf("ok",One=1,Two=2,Three=3) keyword[Three] is 3 keyword[Two] is 2 keyword[One] is 1 Ă&#x201C;ĂžÂ&#x2DC;ÂŤĂ&#x2026;Â&#x203A;aq§Â?Ă&#x2DC;L**keyword´^**LÂŤĂ&#x2030;?ÂżÂ&#x2021;ĂŞkÂśiĂŤĂŞD4§´ N^ŸêÂ&#x17E;§Â&#x2021;Â?²ÍêÂśi§One=1,Two=2,Three=3§3Ÿê¼§Â&#x152;Âą^dictionary Â?ÂŞ5ĂśÂ&#x160;keyword§Ă&#x2122;ÂĽkeys´["One","Two","Three"]§values´[1,2,3]"Â&#x201E;Â&#x152;òߍ Ă&#x2026;Â&#x203A;Ă&#x161;3Â&#x2DC;ĂĽ"ĂšÂ&#x17E;§*arg§Â&#x2021;Â&#x2DC;3**keywordcÂĄ" >>> printf("%d is greater than %d",2,1,Apple="red",One="1") 2 is greater than 1 keyword[Apple]=red keyword[One]=1 Â&#x201E;Â&#x152;ÂąrÚߍĂ&#x2026;Â&#x203A;Ă&#x161;Â&#x152;Ă&#x20AC;ĂŤĂŞĂ&#x2026;Â&#x203A;Ă&#x153;3Â&#x2DC;ĂĽÂŚ^" >>> def testfun(fixed,optional=1,*arg,**keywords): ... print "fixed parameters is ",fixed ... print "optional parameter is ",optional ... print "Arbitrary parameter is ", arg ... print "keywords parameter is ",keywords ... >>> testfun(1,2,"a","b","c",one=1,two=2,three=3) fixed parameters is 1 optional parameter is 2 Arbitrary parameter is (â&#x20AC;&#x2122;aâ&#x20AC;&#x2122;, â&#x20AC;&#x2122;bâ&#x20AC;&#x2122;, â&#x20AC;&#x2122;câ&#x20AC;&#x2122;) keywords parameter is {â&#x20AC;&#x2122;threeâ&#x20AC;&#x2122;: 3, â&#x20AC;&#x2122;twoâ&#x20AC;&#x2122;: 2, â&#x20AC;&#x2122;oneâ&#x20AC;&#x2122;: 1} ŸêĂ&#x2030;ĂŤĂŞ^S§kĂ&#x2030;½Íê§, i?¿Íê" annCharles@tom.com

´Â&#x152;Ă&#x20AC;ꐤ,

135Â?,208Â?

Ă&#x2030;?¿Íê§Â

´Â&#x2018;Âś

Python Ă&#x2020;S)P


Â&#x2DC; Python0

§1.10.5 Doc String Ÿê£ã òŠ 3§Sp§´LISPÂĽÂ&#x2DC;Â&#x2021;AĂ&#x161;§PythonÂ?/ L5"zÂ&#x2021;ŸêĂ&#x2018;´Â&#x2DC; Â&#x2021;ĂŠÂ&#x2013;§zÂ&#x2021;ŸêÊÂ&#x2013;Ă&#x2018;kÂ&#x2DC;Â&#x2021;__doc__ĂĄ5§ŸêÂ&#x160;ʼ§XJ1Â&#x2DC;Â&#x2021;LÂ&#x2C6;ª´Â&#x2DC; Â&#x2021;string§ÚÂ&#x2021;Ÿê__doc__Ă&#x2019;´ÚÂ&#x2021;string§Ă&#x201E;K__doc__´None" >>> def testfun(): ... """ ... this function do nothing, just demostrate the use of the ... doc string. ... """ ... pass ... >>> print testfun.__doc__ this function do nothing, just demostrate the use of the doc string. >>> passÂ&#x160;Ê´Â&#x2DC;Â&#x160;ʧÂ&#x;oÂ?Ă&#x2DC;Z§Ă&#x2019;Â&#x201D;CÂ&#x160;ó¼{}"Ă?LwÂŤ__doc__§Â&#x201A;Â&#x152;Âą wÂ&#x2DC;

SĂ&#x153;ŸêÂ?Ă?&E" >>> print " ".join.__doc__ S.join(sequence) -> string Return a string which is the concatenation of the strings in the sequence. The separator between elements is S. >>> print range.__doc__ range([start,] stop[, step]) -> list of integers Return a list containing an arithmetic progression of integers. range(i, j) returns [i, i+1, i+2, ..., j-1]; start (!) defaults to 0.When step is given, it specifies the increment (or decrement). For example, range(4) returns [0, 1, 2, 3]. The end point is omitted! These are exactly the valid indices for a list of 4 elements. ^ڍÂ?{§ wÂ?Ă?§´Â&#x203A;Šk"Š Ă&#x161;§S3Â&#x2DC;ü§kĂ?u¹Š Ă&#x161;§SÂ&#x2DC;Â&#x2014; 5"

§1.10.6 lambdaŸê Ă&#x2122; Gfunctional programming < § Ă&#x2DC; ÂŹ ĂŠlambdaÂź ĂŞ a  ) ) "LISP´ Â&#x2DC; ÂŤfunctional programming language" Ă&#x2DC; Ă&#x2122; Gfunctional programming  < § Â&#x152; Âą @ annCharles@tom.com

136Â?,208Â?

Python Ă&#x2020;S)P


§1.10 Ÿê Â?lambdaŸêĂ&#x2019;´Â&#x2DC;ÂŤ{Ăź]œŸê" >>> f = lambda a,b: a+b >>> f(1,2) 3 >>> f("abc","def") â&#x20AC;&#x2122;abcdefâ&#x20AC;&#x2122; f dudef f(a,b): return a+b" Â&#x2DC;Â&#x2021;ŸêÂ&#x152;ÂąÂ&#x2C6;ÂŁÂ&#x2DC;Â&#x2021;lambdaŸê"X >>> ... ... >>> 14 >>> 15 >>> 17 >>>

def incfun(a): return lambda x: x+a incfun(2)(12) incfun(2)(13) incfun(4)(13)

§1.10.7 ŸêÂ&#x160;^Â?(scope) ĂšpP4Â&#x2DC;Â&#x2021;LGB5K§pythonÂ&#x2DC;Â&#x2021;CޜikĂŠlocal name space (Ă&#x203A;Ă&#x153;¡ ÂśÂ&#x2DC;m)§3ĂŠglobal name space(Ă&#x203A;¡œÂ&#x2DC;m)§, ´buildin name space (S3¡œÂ&#x2DC; m) ^globalÂ&#x160;ĂŠÂ&#x152;ÂąUC, CĂž¡œÂ&#x2DC;m" >>> >>> ... ... ... >>> 2 >>> 1

a=1 def testfun(): a=2 print a testfun() a

3Ÿêtestfun()ÂĽa´3local name space ¼§?UaĂ&#x2DC;ÂŹUCglobal name space ÂĽa  ´§^globalÂ&#x160;ĂŠÂ&#x152;Âą?UÂ&#x2DC;Â&#x2021;CĂž¤3name space" >>> a=1 annCharles@tom.com

137Â?,208Â?

Python Ă&#x2020;S)P


Â&#x2DC; Python0 >>> def testfun(): ... global a ... a=2 ... print a ... >>> testfun <function testfun at 0x8176264> >>> testfun() 2 >>> a 2 >>>

§1.10.8 i@Ÿê(nested) Python¼Ÿê´Â&#x152;Âąi@" >>> def outfun(a,b): ... def innerfun(x,y): ... return x+y ... return innerfun(a,b) ... >>> outfun(1,2) 3 Ăš3CÂ&#x160;ó¼´Ă&#x2DC;#N§Ă?Â?CÂĽstatic ŸêÂ&#x152;ÂąÂ&#x201C;OڍþU"ڍĂ&#x2026;Â&#x203A;Jø Â&#x2DC;Â&#x2021; ŸêÂ&#x2030;Â&#x152;Vg§, ŸêÂ?3, ŸêSĂ&#x153;§âw§XJÂŚÂ&#x2021;Ăşm{§Â&#x152;ÂąĂ?L Â&#x2C6;ÂŁÂ&#x160;§Â&#x2C6;ÂŁSĂ&#x153;Ÿê"5¿§Ă&#x161;Pascal Ă&#x2DC;Â&#x2DC;§i@ŸêĂ&#x2DC;UÂ&#x2013;ÂŻ ŸêCĂž"¡ @Â?i@Ÿê^?Ă&#x2DC;Â&#x152;"

§1.10.9 functionĂŤĂŞD4 python´UÂ&#x160;D4ĂŤĂŞ§´Â&#x201E;´kÂ&#x152;UUCÍê¤Â?Â&#x160;" >>> ... ... ... >>> >>> >>>

def change(x,y): x=2 y[0]="hello" x=1 y=[1,2] change(x,y)

annCharles@tom.com

138Â?,208Â?

Python Ă&#x2020;S)P


§1.11 ÂŹ(module)Ă&#x161;Â?(package) >>> x 1 >>> y [â&#x20AC;&#x2122;helloâ&#x20AC;&#x2122;, 2] Â&#x152;Âąw§xÂ&#x160;vkUC§´yÂ&#x160;%UC "30 name space Vg úÚ ´3g,Ă&#x2DC;LÂŻÂ&#x153; "ĂŤĂŞx§y Ă&#x2DC;L´3function local name space ÂĽMĂŻÂ&#x2DC;Â&#x2021;# name §Ă&#x161;function N^ĂśD?5ĂŤĂŞÂ?Â&#x2022;Ă&#x201C;Â&#x2DC;Â&#x2021;ĂŠÂ&#x2013;"3function SĂ&#x153;x=2§Â?´U C name xbind 'X§4ĂšÂ&#x2021;name Â?Â&#x2022;Â&#x2DC;Â&#x2021;#ĂŠÂ&#x2013;"¤¹Ă&#x2DC;ÂŹKÂ?N^ĂśD?5 Íê¤Â?ĂŠÂ&#x2013;" y[0]="hello" ÂżvkUCy bind 'X§ ´Â&#x2020;?Uy¤Â?Â&#x2022;ĂŠ Â&#x2013;§@o,Ă&#x2019;ÂŹUCN^ĂśD?5ĂŤĂŞ "w ÂĄname space VgÂŹĂŠĂšÂ&#x2021;kÂ? n)"

§1.11 ÂŹ(module)Ă&#x161;Â?(package) §1.11.1 MĂŻÂ&#x2DC;Â&#x2021;module Â&#x2DC;Â&#x2021;module Ă&#x2DC;L´Â&#x2DC; Ÿê§classÂ&#x2DC;3Â&#x2DC;Â&#x2021;ŠÂ&#x2021;ÂĽ"~X§3c8š(current directory)MĂŻÂ&#x2DC;Â&#x2021;ŠÂ&#x2021;testmodule.py§SN´ """ this only is a very simple test module """ age=0 # a sample attribute def sayHello(): # a sample function in a module print "Hello" if __name__ == "__main__" sayHello() Â&#x2DC;Â&#x2021;module Â?kaqfunction doc string"Ă&#x2DC; 5Âş1Â&#x2DC;^Â&#x160;ĂŠXJ´Â&#x2DC;Â&#x2021;iĂ&#x17D; G{§@oĂšÂ&#x2021;iĂ&#x17D;GĂ&#x2019;´doc string§Â&#x152;ÂąwÂ&#x2DC;Â&#x2021;doc string5Â?Ă?"import Â&#x2DC; Â&#x2021;module kߍÂ?{" >>> import testmodule >>> print testmodule.__doc__ this only is a very simple test module >>> Â&#x152;ÂąÂ&#x2013;ÂŻtestmoduleÂĽattribute annCharles@tom.com

139Â?,208Â?

Python Ă&#x2020;S)P


Â&#x2DC; Python0 >>> testmodule.age 0 >>> testmodule.age=1 >>> testmodule.age 1 >>> testmodule.sayHello <function sayHello at 0x8174a34> >>> testmodule.sayHello() Hello >>> sayHello=testmodule.sayHello >>> sayHello() Hello >>> sayHello <function sayHello at 0x8174a34> >>> >>> othermodule=testmodule >>> othermodule.age=100 >>> testmodule.age 100 Â&#x152; Âą w  § Ă? Lmodname.attribute Â? ÂŞ Â&#x152; Âą Â&#x2013; ÂŻ §module ÂĽ attribute § 3module ¼½Ă&#x201A;CÞ§Ÿê§class Ă&#x2018;´module attribute "^name space Vg 5)ÂşĂ&#x2019;Â?BĂľ §module ÂĽname space ÂĽÂ&#x2DC;Â&#x192;Ă&#x2018;´moduleÂ&#x2DC;Â&#x2021;attribute§Â&#x2021;L5 `module attribute ´module name space ÂĽÂ&#x2DC;Â&#x2021;name" sayHello=testmodule.sayHello()§ Â&#x152; Âą 3global name space ÂĽ ĂŻ ĂĄ Â&#x2DC; Â&#x2021;name§map(N  ) testmodule name space ÂĽ  Â&#x2DC; Â&#x2021;name ¤ Â? object" Â&#x152; Âą w  Ăź Â&#x2021;sayHello Â? Â&#x2022; Ă&#x201C; Â&#x2DC; Â&#x2021;function object" ÂŚ + ÂŚ Â&#x201A;  Ă&#x2018; ´sayHello§ ÂŚ Â&#x201A; Â? Â? Â&#x2022; Ă&#x201C; Â&#x2DC; Â&#x2021; ĂŠ Â&#x2013; §  ´ ÂŚ Â&#x201A; 3 Ăź Â&#x2021; Ă&#x2DC; Ă&#x201C; name space ÂĽ "module   Â? ´ Â&#x2DC; Â&#x2021;object§testmoduleĂ&#x2019; ´ ÂŚ name§ Â&#x152; Âą 3global name space ÂĽ ĂŻ ĂĄ , Â&#x2DC; Â&#x2021;name Ă&#x161;testmoduleÂ?Â&#x2022;Ă&#x201C;Â&#x2DC;Â&#x2021;object§Â&#x2DC;Â&#x2021;module object"othermodule = testmodule"XJ Â&#x2DC;Â&#x2021;moduleÂĽkĂŠĂľk^functions§´Ă?Lmodulename.funcnameÂ?ª§Ă&#x2019;wĂŠ ĂŚÂ&#x2020;"Â&#x152;Âą^1ÂŤimport module Â?{"­#?\python§, " >>> from testmodule import age, sayHello >>> age 0 >>> sayHello <function sayHello at 0x81631a4> annCharles@tom.com

140Â?,208Â?

Python Ă&#x2020;S)P


§1.11 ÂŹ(module)Ă&#x161;Â?(package) >>> sayHello() Hello >>> testmodule Traceback (most recent call last): File "<stdin>", line 1, in ? NameError: name â&#x20AC;&#x2122;testmoduleâ&#x20AC;&#x2122; is not defined >>> Â&#x152;Âąw§ÚÂ?{Â&#x192;u import testmodule age=testmodule.age sayHello=testmodule.sayHello  ´ k Ă&#x2DC; Ă&#x201C; § ^from  Â? { §testmodule Ăš Â&#x2021; Âś i § Âż v k import ? 5 § Â? Ă&#x2019; ´ ` §  cname space ÂĽ v ktestmodule Ăš  Â&#x2DC; Â&#x2021;name§ import testmodule Ă&#x2019; Â&#x152; Âą 3  cname space ÂĽ M ĂŻ Â&#x2DC; Â&#x2021;testmodule Ăš  Â&#x2DC; Â&#x2021; name" Â&#x152; Âą ^ from testmodule import * òtestmodule ÂĽname space ÂĽ ¤ kname Ă&#x161; ?   c name space ¼§Ă?LĂš name§Â&#x2013;ÂŻname¤Â?ĂŠÂ&#x2013;" Â&#x2026;import testmodule § X Jtestmodule.py? U L § Â&#x152; Âą ^reload(testmodule)­#\1testmodule"

§1.11.2 NoĂŠmodule python^ÂąeĂ&#x161;½ĂŠÂ&#x2DC;Â&#x2021;module§¹import testmoduleÂ?~f" â&#x20AC;˘ 3c8š¼ĂŠtestmodule.py" â&#x20AC;˘ evĂŠ§3Â&#x201A;¸CĂž(environment variables) PYTHONPATHÂĽʧĂ&#x2019;Â&#x2013;3PATHÂĽ ĂŠÂ&#x152;Â&#x2030;1ŠÂ&#x2021;Â&#x2DC;" â&#x20AC;˘ e Ă&#x192;PYTHONPATHC Ăž § @ o 3 S C 8 š ÂĽ  ĂŠ § 3unix ÂĽ ´.:/usr/local/lib/python Ă&#x2122;¢§python´3sys.pathÂĽ¤k8š¼ĂŠmodule"Â&#x152;Âąwsys.path" >>> import sys >>> print sys.path [â&#x20AC;&#x2122;â&#x20AC;&#x2122;, â&#x20AC;&#x2122;/usr/lib/python2.2â&#x20AC;&#x2122;, â&#x20AC;&#x2122;/usr/lib/python2.2/plat-linux2â&#x20AC;&#x2122;, â&#x20AC;&#x2122;/usr/lib/python2.2/lib-dynloadâ&#x20AC;&#x2122;, â&#x20AC;&#x2122;/usr/lib/python2.2/site-packagesâ&#x20AC;&#x2122;] lĂŠ^SĂžw§¡Â&#x201A;Â&#x152;ÂąXJ\3c8šïå Â&#x2DC;Â&#x2021;Ă&#x161;IOÂĽÂĽÂ&#x2018;kI OmodulekÂ&#x192;Ă&#x201C;Âśi@oÂŹ^\module Â&#x201C;OXĂ&#x161;module§)#ÂśĂ&#x2122;ŠÂŻK§¤ ¹¡Â&#x201A;Â&#x2021;5¿§gCmodule ÂśiĂ&#x2DC;Â&#x2021;Ă&#x161;XĂ&#x161;moduleÂśiÂ&#x192;Ă&#x201C;" annCharles@tom.com

141Â?,208Â?

Python Ă&#x2020;S)P


Â&#x2DC; Python0

§1.11.3 package(Â?) package ´Â&#x2DC;|module 8Ă&#x153;"^ÂąeÂ?{MĂŻÂ&#x2DC;Â&#x2021;package" â&#x20AC;˘ y3c8šMĂŻÂ&#x2DC;Â&#x2021;8štestpackage â&#x20AC;˘ 3testpackage MĂŻÂ&#x2DC;Â&#x2021;Â&#x2DC;ŠÂ&#x2021;__init__.py â&#x20AC;˘ 3testpackage ÂĽMĂŻÂ&#x2DC;Â&#x2021;testmodule"py§p¥škÂ&#x2DC; Â&#x201C;è"ĂšpÂ? {ߧĂ&#x2019; Ă&#x161;testmodule.pyÂ&#x2DC;" ĂĽĂ&#x201E;python >>> import testpackage.testmodule >>> testpackage.testmodule.sayHello() Hello package ´ Â&#x2DC; ÂŤ | Â&#x201E;module  Â? { § J ø Â&#x2DC; Â&#x2021;name space§ Â&#x201C; Â&#x17D; u ) Âś i Ă&#x20AC; â"package ÂĽÂ&#x201E;Â&#x152;Âąkpackage§¤¹ÚÂ?ÂŞÂ&#x152;¹ÊĂ?|Â&#x201E;Â&#x2DC;Â&#x2021;äG(§^5+ nmodules"

§1.12 name space(¡œÂ&#x2DC;m) 3cÂĄ0 ¼§Ă&#x2DC;Â&#x17D;Â&#x2DC;gJname space§y0 name space Vg§Ú´Â&#x2DC;Â&#x2021; p?Vg§´XJn)Œ§ÊþĂ&#x20AC;Ă&#x153;Ă&#x2018;ĂŠN´n)"Ă&#x201C;Â&#x17E;Â?ÂŹaĂşpython ´Â&#x2DC;ÂŤ/ÂŞ {ߧVgÂ&#x2DC;Ă&#x;§VgĂ&#x161;Â&#x2DC;Â&#x160;Ăł" Â&#x;o´name space? name space ´lϴ(name)ĂŠÂ&#x2013;(object)ĂžN(map)"Â&#x2DC; Â&#x2021;name NÂ&#x2DC;Â&#x2021;object ĂžÂ&#x17E;§¡Â&#x201A;`ĂšÂ&#x2021;name Ă&#x161;ĂšÂ&#x2021;objectkÂ?½(bind)'X§½Ü` ĂšÂ&#x2021;name Â?Â&#x2022;ĂšÂ&#x2021;object" ­E`§python ÂĽÂ&#x2DC;Â&#x192;Ă&#x2018;´object §Â?)function §module §class §package  "Ăš objectsĂ&#x2018;k3S¼ýý3§Ă&#x2019;Â&#x201D;)š3­ÞzÂ&#x2DC;Â&#x2021;<"´¡Â&#x201A; NoĂŠĂš objectsQ? ^name! Â&#x2030;zÂ&#x2021;object ĂĽÂ&#x2021;Âśi"zÂ&#x2021;name Â?ĂŠAÂ&#x2DC;Â&#x2021;object Â&#x2DC;Â&#x2021;objectÂ&#x152;ÂąkĂľÂ&#x2021;Âśi"´name Ă&#x2DC;´object §Ă&#x2019;Â&#x2013;Â&#x2DC;Â&#x2021;<ÂśiCharles§ ´Charles Ă&#x2DC;´ÚÂ&#x2021;<§´ÚÂ&#x2021;<Âśi§ÚÂ&#x2021;<´kĂ&#x2030;kSÂŹĂĄ§Charles Ă&#x2DC; §Charles´Â&#x152;Âą3Â&#x2019;Ăž"Â&#x2DC;Â&#x2021;<Â?Â&#x152;ÂąkĂľÂ&#x2021;Âśi" PythonÂĽ k ĂŠ Ăľ name space§ ~ ^  k: build-in name space (S 3  ¡œ Â&#x2DC; m) global name space (Ă&#x203A;¡œÂ&#x2DC;m)§local name space(Ă&#x203A;Ă&#x153;¡œÂ&#x2DC;m)"3Ă&#x2DC;Ă&#x201C;name space ÂĽname ´Â&#x2DC;:'XÂ?vk"$Â&#x2013;iÂĄĂžÂ&#x192;Ă&#x201C;name§Â?Â&#x2021;ÂŚÂ&#x201A;3Ă&#x2DC;Ă&#x201C;name space ¼§@oÂŚÂ&#x201A;Ă&#x2019;Ă&#x17D;Ă&#x192;'ĂŠ"UClocal name space ÂĽnamebind 'X§Ă&#x2DC;ÂŹKÂ?global name space ÂĽÂ&#x192;Ă&#x201C;name" zÂ&#x2021;object Ă&#x2018;kgCname space"Â&#x152;ÂąĂ?Lobject.name Â?ÂŞÂ&#x2013;ÂŻobject name space ÂĽname"zÂ&#x2021;object name space ´Ă&#x2022;ĂĄ"â&#x20AC;&#x153;Ă&#x2022;ĂĄâ&#x20AC;?Âżg´`§Â&#x2DC;Â&#x2021;object annCharles@tom.com

142Â?,208Â?

Python Ă&#x2020;S)P


§1.12 name space(¡œÂ&#x2DC;m) name space ÂĽÂ&#x2DC;Â&#x2021;name§Ă&#x161;Ă&#x2122;§name space ÂĽname ´Â&#x2DC;:'XÂ?vk§$Â&#x2013; ĂźÂ&#x2021;iÂĄĂžwĂĽ5Â&#x2DC;name§Â?´Ă&#x17D;Ă&#x2DC;Â&#x192;Z"Ă&#x2019;Â&#x201D;â&#x20AC;&#x153;Â?fâ&#x20AC;? ĂšÂ&#x2021;object§3ÂŚname space ÂĽkÂ&#x2DC;Â&#x2021;â&#x20AC;&#x153;Ă´Ă&#x161;â&#x20AC;?§ÚÂ&#x2DC;Â&#x2021;name §LÂŤÂ&#x2DC;Â&#x2021;Â?fĂ´Ă&#x161;§ â&#x20AC;&#x153;Â&#x2019;fâ&#x20AC;?ĂšÂ&#x2021;object §3 ÂŚname space ÂĽÂ?kÂ&#x2DC;Â&#x2021;â&#x20AC;&#x153;Ă´Ă&#x161;â&#x20AC;?§ÚÂ&#x2021;name LÂŤÂ&#x2019;fĂ´Ă&#x161;§ŒĂ&#x161;Â?fÂ&#x2DC;:'XÂ?v k§Œ+ÂŚÂ&#x201A;Ă&#x2018;â&#x20AC;&#x153;Ă´Ă&#x161;â&#x20AC;?" ¡@Â?ÂŚ+name space ´Â&#x2DC;Â&#x2021;p?Vg§´Œ´ÊÂ&#x2DC;Ă&#x;Vg§Â&#x2DC;Â&#x2021;N´n)V g"{ĂźVg ÂĄĂ&#x203A;ĂľXÂ&#x152;ÂŻ"name space ´ÚÂ&#x2021;)PÂĽ` þ§ Ă&#x203A;Â&#x2DC;Â&#x2021;V g"¡@Â?§Œ´python Ă&#x2DC;%Vg§Ă&#x2019;Â&#x201D;file ĂšÂ&#x2021;Vgunix ÂĽÂ&#x2DC;" z Â&#x2DC; Â&#x2021;object § Xmodule§class§function§ Â&#x2DC; Â&#x2021;instance § Ă&#x2018; k g C name space"name space ´Ă&#x201E;MĂŻ"zÂ&#x2DC;Â&#x2021;name space )Â&#x17E;mÂ?Ă&#x2DC;Â&#x2DC;" Â&#x2DC;Â&#x2021;module name space ´ÚÂ&#x2021;module import Â&#x17E;ĂżMĂŻ" kÂ&#x2DC;Â&#x2021;AĂ?module §Â&#x2DC;?\python)ºÏ§Ă&#x2019;ĂŻĂĄ Â&#x2DC;Â&#x2021;module§ÚÂ&#x2021;module name space Ă&#x2019;´global name space§Â&#x2DC;Â&#x2021;Ă&#x203A;Â?Â&#x2DC;name space"ĂšÂ&#x2021;module Â&#x2DC;Â&#x2021;S Ă&#x153;attribute§__name__ ^5IÂŁmodule§ÚÂ&#x2021;module__name__ ´__main__" >>> print __name__ __main__ zÂ&#x2DC;Â&#x2021;module Ă&#x2018;kÂ&#x2DC;Â&#x2021;__name__attribute§^5LÂŤcmodule Âśi"¤¹z Â&#x2DC;Â&#x2021;module Ă&#x2018;kĂšÂ&#x201C;è" if __name__ == "__main__" sayHello() # ÿà Â&#x201C;è ^ umodoule Ăż Ă " Ă? Â? 3 Â&#x2DC; Â&#x2021;module 3 import Â&#x17E; Ăż § ÂŚ name space ÂĽ M ĂŻ

Â&#x2DC; Â&#x2021; S Â&#x2DC; name§__name__§ ^ 5 L ÂŤmodule  Š Â&#x2021; Âś ÂĄ " ¤ Âą 3 import  Â&#x17E; Ăż § Ăż Ă Â&#x201C; è Ă&#x2019; Â&#x2013; Ă&#x2DC;  3 Â&#x2DC;  § Ă? Â?__name__§ [  Ă&#x2DC; ÂŹ ´â&#x20AC;&#x153;__main__â&#x20AC;?"  ´ X J ^python testmodule.py  Â? ÂŞ Â&#x2020;  $ 1 Â&#x2DC; Â&#x2021;module  Â&#x17E; Ăż § Ă&#x2DC; ´import§ @ omodule name space Ă&#x2019; ´global name space , Ăš Â&#x17E;python g Ă&#x201E; rglobal name space ÂĽ__name__ Â?â&#x20AC;&#x153;__main__â&#x20AC;?§@oĂ&#x2019;Â&#x152;Âą$1ÿà Â&#x201C;è " Â&#x2DC;Â&#x2021;N^Â&#x2DC;Â&#x2021;functionÂ&#x17E;ÿ§functionlocal name space MĂŻ §functionÂ&#x2C6; ÂŁÂ&#x17E;ÿ§½Üfunction Ă&#x2018;exceptionÂ&#x17E;ÿ§local name space Ă­Ă&#x2DC; " >>> def testfun(): ... print locals() ... print globals() ... >>> >>> testfun() annCharles@tom.com

143Â?,208Â?

Python Ă&#x2020;S)P


Â&#x2DC; Python0 {} {â&#x20AC;&#x2122;__builtins__â&#x20AC;&#x2122;: <module â&#x20AC;&#x2122;__builtin__â&#x20AC;&#x2122; (built-in)>, â&#x20AC;&#x2122;__name__â&#x20AC;&#x2122;: â&#x20AC;&#x2122;__main__â&#x20AC;&#x2122;, â&#x20AC;&#x2122;testfunâ&#x20AC;&#x2122;: <function testfun at 0x8174dd4>, â&#x20AC;&#x2122;__doc__â&#x20AC;&#x2122;: None} >>> locals()Ă&#x161;globals()Š O Â&#x2C6; ÂŁglobal name space Ă&#x161;local name space"name space Ă? ~ ^dictionary 5 L ÂŤ §dictionary ´ Â&#x2DC; Â&#x2021;(key§name)Ăš  pair  8 Ă&#x153; §key ´name§value´name ¤Â?object" Â&#x;o´scope(Â&#x160;^Â?)? scope Ă&#x2019;´python ÂĽÂ&#x201C;èliÂĄÂżĂ&#x201A;(textually)ĂžÂ&#x152;Âąâ&#x20AC;&#x153;Â&#x2020; Â&#x2013;ÂŻâ&#x20AC;?name 8Ă&#x153;"Ăšp)ºßÂ&#x2021;Vg: â&#x20AC;˘ â&#x20AC;&#x153;Â&#x2020;Â&#x2013;ÂŻâ&#x20AC;?Âżg´^unqualified reference name Ă&#x2019;Â&#x152;ÂąÂ&#x2020;ĂŠname ¤Â?ĂŠÂ&#x2013;" â&#x20AC;˘ unqualified reference Ă&#x2019;´Ă&#x2DC;šk.name"a Ă&#x2019;´Â&#x2DC;Â&#x2021;unqualified name§a.b Ă&#x2019;Ă&#x2DC; ´" LGB 5 K ^scope V g 5 ) Âş Ă&#x2019; ´: 3 ? Ă&#x203A; Â&#x201C; è Â&#x2030; 1  Â&#x17E; Ăż § Ă&#x2018; Â&#x2013;  k n Â&#x2021;scope§Â&#x2DC;Â&#x2021;´local name space |¤scope"Â&#x2DC;Â&#x2021;´cmodule global name space |¤scope§Â&#x201E;kbuildin name space |¤scope"lS Â?gĂŠÂ&#x2DC;Â&#x2021;unqualified name"L Â?local§G Â?gloabl§B Â?buildin" globalÂ&#x160;ĂŠÂ&#x152;ÂąUCrÂ&#x2DC;Â&#x2021;unqualified name scope§Â&#x2020;global name space ÂĽ ĂŠ" function alias Âżg´Â?alias=module_name.funcname Â?ÂŞMĂŻÂ&#x2DC;Â&#x2021;function OÂś" >>> def sayHello(): ... print "Hello" ... >>> saidHello=sayHello >>> saidHello <function sayHello at 0x8174bb4> >>> sayHello <function sayHello at 0x8174bb4> >>> sayHello() Hello >>> saidHello() Hello Â&#x152;ÂąwsayHello§saidHelloÂŚÂ&#x201A;Ă&#x2DC;L´ßÂ&#x2021;Âśi§ŒÂ&#x201A;Â?´Ă&#x201C;object"Ă&#x2019;Â&#x2013;Â&#x2DC; Â&#x2021; < k Ăź Â&#x2021; Âś i Â&#x2DC;  "a=[1,2]Ăš  Â&#x160; ĂŠ § ÂŹ 3  S Ă&#x153; name space Ăž M ĂŻ Â&#x2DC; Â&#x2021;name annCharles@tom.com

144Â?,208Â?

Python Ă&#x2020;S)P


§1.12 name space(¡œÂ&#x2DC;m) Ă&#x161;[1,2]ĂšÂ&#x2021;object Â?½(bind)"ڍDÂ&#x160;Â&#x160;ĂŠĂ&#x2DC;ÂŹÂ&#x20AC;êâ§Â?´3namespaceÂĽMĂŻ

Â&#x2DC;Â&#x2021;#name§Â?Â&#x2022;Â&#x2DC;Â&#x2021;object"ÚÊ­Â&#x2021;"Ă&#x2019;Â&#x201D;java ¼¤kCĂžĂ&#x2018;´Ă&#x161;^(reference)Â&#x2DC; §Â&#x201E;Ă&#x161;C ÂĽpointer(Â?)k aq"3n)Â&#x2DC; §SÂ&#x17E;ÿ§Ú´ÊkÂ?Ă?" ^delÂ&#x160;ĂŠÂ&#x152;Âąlname spaceĂ­Ă&#x2DC;Â&#x2DC;Â&#x2021;name" >>> a=1 >>> a 1 >>> del a >>> a Traceback (most recent call last): File "<stdin>", line 1, in ? NameError: name â&#x20AC;&#x2122;aâ&#x20AC;&#x2122; is not defined Ă­Ă&#x2DC;Â&#x2DC;Â&#x2021;CÞ¿g´l SĂ&#x153;name space Â&#x2DC;Ă&#x2DC;Â&#x2DC;Â&#x2021;name Ă&#x161;object Â?½(bind) 'X§ XJvkĂ&#x2122;ÂŚnameĂ&#x161;ĂšÂ&#x2021;ĂŠÂ&#x2013;bind§@oâýĂ­Ă&#x2DC;object"ĂšĂ&#x161;java ÂĽ-Ă&#x192;ÂŁĂ&#x201A;k

aq"Ă&#x161;CĂ&#x161;C++ÂĽÂ&#x153;UÂ?EâÊÂ&#x201D;" ¢Spython ÂĽĂ&#x2019;´Œ^ Â&#x153;UÂ?Eâ§zÂ&#x2021;name Ă&#x2018;Ă&#x161;Â?Â&#x2022;objectÂ?Â&#x192;' ĂŠ § z Â&#x2DC; Â&#x2021;objectĂ&#x2018; k Â&#x2DC; Â&#x2021;referece counter P 4 k Ăľ  Â&#x2021;name Ă&#x161; Ăš Â&#x2021;object bind" z gbind§reference count Ă&#x2018;\1§zgĂ­Ă&#x2DC;bind 'X§Ă&#x2018;~1§Â?kreference counter C ¤0Â&#x17E;ÿâýĂ­Ă&#x2DC;ĂŠÂ&#x2013;" python ´Â&#x2DC;ÂŤra.§Ă&#x201E;a.Â&#x160;Ăł" r a . ´ Â? § z Â&#x2DC; Â&#x2021; ĂŠ Â&#x2013; Ă&#x2018; k Â&#x2DC; Â&#x2021; a . Xtuple §dictionary §list §string §int §long §float §module §function §class §methord Ă&#x161;?Ă&#x203A;^r½Ă&#x201A;½Ümodule ½Ă&#x201A; class"Basic Ă&#x2019;Ă&#x2DC;´Â&#x2DC;ÂŤra.§¤¹BasicN´Ă&#x161;ĂĽĂ&#x153;Ă&#x201A;§~X print "1" + "2" 12 print 1 + "2" 3 Â?N"1"+"2"§\Ă?"´"3" ½Ü"12"§´tĂ&#x2DC;Ă&#x192;\.Â&#x2021;Â&#x;o" zÂ&#x2021;ĂŠÂ&#x2013;Ă&#x2018;kgCĂ&#x2022;ĂĄname space"zÂŤa.kgCĂ&#x2022;ĂĄĂśÂ&#x160;Â?{"ĂŠÂ&#x2013;name space ÂĽname ÂŹĂ&#x161;,Â&#x2021;ĂśÂ&#x160;Â?{Â&#x192;ĂŠA"CĂž==´ÊÂ&#x2013;Âśi" Ă&#x201E;a.´Â?zÂ&#x2021;CĂžĂ&#x2018;Ă&#x2DC;^(²§Â&#x152;ÂąÂ?Â&#x2022;?Ă&#x203A;a.ĂŠÂ&#x2013;"½ÜC Ăž(variable)Â?Âśi(name)Â?Â?Ă&#x153;¡"CĂžÂ?´Â&#x2DC;Â&#x2021;ĂŠÂ&#x2013;Âśi§zÂ&#x2021;CĂž3,Â&#x2DC;Â&#x17E;Â?Â? Â&#x2022;Â&#x2DC;Â&#x2021;ĂŠÂ&#x2013;§´Â&#x2DC;Â&#x2021;ĂŠÂ&#x2013;Â&#x152;ÂąĂ&#x201C;Â&#x17E;kĂľÂ&#x2021;CĂžÂ?Â&#x2022;ΤĂ&#x2019;Â&#x201D;Ÿê§module §class Ă&#x2018;Â&#x152;Âą kalias (OÂś)"CĂž)Ă?Â&#x2021;Ă&#x161;ĂŠÂ&#x2013;)Ă?´Ă&#x2DC;Â&#x2DC;"vk?Ă&#x203A;CĂžÂ?Â&#x2022;Â&#x2DC;Â&#x2021;ĂŠ annCharles@tom.com

145Â?,208Â?

Python Ă&#x2020;S)P


Â&#x2DC; Python0 Â&#x2013;Â&#x17E;ÿ§ÚÂ&#x2021;ĂŠÂ&#x2013;âýíĂ&#x2DC;" Â&#x2DC;Â&#x2021;CĂžÂ?Â&#x152;ÂąÂ&#x2018;Â&#x17E;UCÂŚÂ?½'X§=Â?Â&#x2022;Ă&#x2122;ÂŚ ĂŠÂ&#x2013;" ڍLÂ&#x2C6;Â?ÂŞĂ&#x161;¡Â&#x201A;y¢­.´Â&#x2DC;Â&#x2014;" Â&#x;o´nest function: nest function Â?3function SĂ&#x153;½Ă&#x201A;function ĂŠÂ&#x2013;"outer funciton ´Â?½Ă&#x201A;function function "inter function ´Â?½Ă&#x201A;function " outer function Ă&#x161;inner function vkÂ&#x;ÂŤO§´²'X§outer function local name space 3inner function ¼´Ă&#x2DC;Â&#x152;Â&#x201E;" inner function ´outer function SĂ&#x153;MĂŻÂ&#x2DC;Â&#x2021;object §Â?Â&#x2022;inner function name 3uouter function local name space " outer function Â&#x152;ÂąĂ?LÂ&#x2C6;ÂŁÂ&#x160;Ă&#x2026;Â&#x203A;§rinner function ÂłÂ&#x2030;N^Ăś"

§1.13 a ÂĄ Â&#x2022; ĂŠ Â&#x2013;(OO)´ Â&#x2DC; ÂŤ ? § g Â&#x17D; Ă&#x2DC; ´ Â&#x2DC; ÂŤ Â&#x160; Ăł "Python´ ^CÂ&#x160; Ăł ´ ¢ y  ÂĄ Â&#x2022; ĂŠ Â&#x2013;  Â&#x160; Ăł "GTKÂ? ´ ^C Â?  ÂĄ Â&#x2022; ĂŠ Â&#x2013;  | Â&#x2021; ÂĽ "UnixĂś Â&#x160; X Ă&#x161; ÂĽ §â&#x20AC;&#x153;Â&#x2DC; Â&#x192; Ă&#x2018; ´ Š Â&#x2021;â&#x20AC;?§ , ÂŤ Âż Ă&#x201A; Ăž Ăš § ´ Â&#x2DC; ÂŤ ¤ Ăľ  ÂĄ Â&#x2022; ĂŠ Â&#x2013; § Š Â&#x2021; Ă&#x2019; ´ ½ Ă&#x201A; ĂŠ Aopen§write§read§close§ioctrl Â&#x2DC;|SĂ&#x2DC;Ÿê(½ÜÂ?{)ĂŠÂ&#x2013;" ÂĄÂ&#x2022;ĂŠÂ&#x2013;8´Â&#x201C;è­^§~­E5mu"ÂĄÂ&#x2022;ĂŠÂ&#x2013;´Â&#x201C;è­^Ă&#x2026;Â&#x203A;Â?)Âľ C(encapsulation)§UÂŤ(Inheritance)§þ(Polymorphism)" ÂĄÂ&#x2022;ĂŠÂ&#x2013;Ă&#x2DC;%´Ă&#x201E;Â&#x2013;(abstraction)§ŠlÂ?(interface)Ă&#x161;¢y(implemetation)"

§1.13.1 Â&#x;o´object Â&#x2DC;Â&#x192;Ă&#x2018;´object ! 3Python ¼§object Â&#x2DC;ckÂ?\2Â?šĂ&#x201A;§3Ă&#x2122;§Â&#x160;ó¼§XC++ ¼§object ´Â&#x2DC; Â&#x2021;class instance "´3Python ¼§object Â?Â?Â&#x2DC;Â&#x192;§Â?)§class, module, package, int, float, list, tuple, dict, function, class instance Ă&#x161;Â&#x2DC;Â&#x192;^r§S¼½Ă&#x201A;Ă&#x20AC;Ă&#x153;"

)AÂ&#x2021;Vg: name space name space ´name Ă&#x161;object Â&#x192;mN'X"zÂ&#x2DC;Â&#x2021;name Â?Â&#x2DC;Ă&#x161;Â&#x2DC; Â&#x2021;object Â&#x201D;½"Â&#x2DC;Â&#x2021;object Â&#x152;ÂąkĂľÂ&#x2021;name "XJvkname Ă&#x161;object Â&#x201D;½§@ oobject Ă&#x2019;ÂŹÂ&#x17E;Â&#x201D; "name space ´Â&#x2DC;Â&#x2021;Ă&#x201E;êâ(§dictionary " objname = object ÂŹMĂŻÂ&#x2DC;Â&#x2021;name " name name ´Â&#x2DC;Â&#x2021;iĂ&#x17D;G§Â?Â&#x2022;Â&#x2DC;Â&#x2021;object "name ´name space ÂĽÂ&#x2DC;Â&#x2021;Â&#x192;" object object ´Â&#x2DC;Â&#x2021;Ă&#x2022;ĂĄname space "object name space ^dictionary LÂŤ"þêÂ&#x153; še§obj.__dict__ LÂŤÂ&#x2DC;Â&#x2021;object name space "Ă&#x2122;ÂĽobj.__dict__.keys() L ¤kname list §obj.__dict__[name] LÂŤname ¤Â?object " annCharles@tom.com

146Â?,208Â?

Python Ă&#x2020;S)P


§1.13 a alias XJĂźÂ&#x2021;name Â?Â&#x2022;Ă&#x201C;Â&#x2DC;Â&#x2021;object §@oÚßÂ&#x2021;name pÂ?alias " attribute name Š Â? Ăź ÂŤ § Â&#x2DC; ÂŤ ´unqualified name § Â&#x2DC; ÂŤ ´qualified name " X Ă&#x201C;obj.attr /ÂŞname Ă&#x2019;´qualified name "XĂ&#x201C;obj /ÂŞname Ă&#x2019;´unqualified name " Attribute Ă&#x2019;´qualified name ÂĽâ&#x20AC;&#x153;.â&#x20AC;?

ÂĄĂ&#x153;Š"

â&#x20AC;˘ MĂŻattribute Â?{: obj.new_attribute = other ½Ü setattr(obj,"new_attribute",other) â&#x20AC;˘ Ă­Ă&#x2DC;Â&#x2DC;Â&#x2021;attribute Â?{: del obj.old_attribute ½Ü delattr(obj,"new_attribute") â&#x20AC;˘ Ă&#x17D;Â&#x2DC;Â&#x2021;attribute Â?{Âľ hasattr(obj,"new_attribute") â&#x20AC;˘ ¤kattribute Â?{Âľ dir(obj) kĂŠÂ&#x160;5ÂżÂ&#x2DC;:§setattr, getattr, delattr ÂĽ1Â&#x2021;Íê´Â&#x2DC;Â&#x2021;string §XJ Â&#x17D;~fÂĽ^~ĂžN^§Ă&#x2019;vkÂ&#x;o7Â&#x2021; §^ĂŠA1Â&#x2DC;ÂŤÂ?ÂŞÂ&#x152;Ă&#x2013;5ÂŹÂ?Ă?§ ´ŒÂ&#x201A;Â&#x152;ÂąĂ&#x2030;ĂŤĂŞCÞ§Â?Ă&#x2019;´§S3$1Â&#x17E;ĂżÂ&#x152;Âą?nattribute " Â&#x2DC; Â&#x2021;object name space ÂĽ  Â&#x2DC; Â&#x2021;name Â&#x2DC; ½ ´object  Â&#x2DC; Â&#x2021;attribute "  ´ Â&#x2DC; Â&#x2021;object attribute Ă&#x2DC;Â&#x2DC;½3object name space ÂĽ" Â&#x2DC;Â&#x2021;object name space Â?{´vars(obj) §Â&#x2DC;Â&#x2021;object ¤kattribute  Â?{´dir(obj) " Ă&#x2018;Ă&#x161;object Â&#x2DC;§Ú VgkÂ?\2Â?šĂ&#x201A;§'Ă&#x;3ĂŠĂľPython Â&#x160;Ă&#x201A;ÂĽ" ~X: Ÿê3ĂŤĂŞD4Â&#x17E;ÿ§´UÂ&#x160;D4§Â?O(/`§D4´Â&#x2DC;Â&#x2021;alias " def func(a) : return a+1 x=1 func(x) annCharles@tom.com

147Â?,208Â?

Python Ă&#x2020;S)P


Â&#x2DC; Python0 func /ªÍê´a §N^func(x) Â&#x17E;ÿ§¢SĂŤĂŞx §ĂźÂ&#x2021;name §ŒÂ&#x201A;pÂ?alias " UÂ&#x160;D4Âżg´`UC/ÂŞĂŤĂŞÂ&#x160;Ă&#x2DC;ÂŹKÂ?¢SĂŤĂŞ"´â&#x20AC;&#x153;UC/ÂŞĂŤĂŞÂ&#x160;â&#x20AC;? ´Â?aqa=2 UC§´Â?4/ÂŞĂŤĂŞÂ?Â&#x2022;#ĂŠÂ&#x2013;§´Â?UC /ÂŞĂŤĂŞÂ&#x201D;½'X" XJĂŠ/ÂŞĂŤĂŞĂśÂ&#x160;§Xl.append(1) §@oUCĂ&#x2DC;´/ªÍê§ ´/ÂŞĂŤ ê¤Â?ĂŠÂ&#x2013;" X J Ăź Â&#x2021;name p Â?alias § @ o ÂŚ Â&#x201A; A  Â&#x2DC;  Â&#x2DC;  § Ă&#x2019; Â&#x201D; Ă&#x201C; Â&#x2DC; Â&#x2021; < k Ăź Â&#x2021; Âś i"function object alias Â&#x2DC;Â?Â&#x152;ÂąN^"´'Â&#x2026;Â&#x2021;ŠÂ&#x2DC;Â&#x;oÂ&#x17E;ĂżUC´name §Â&#x;oÂ&#x17E;ĂżUC´name ¤Â?object " Ă&#x2019;â&#x20AC;&#x153;=â&#x20AC;? Âżg§Ă&#x2DC;2´DÂ&#x160;§ ´Â?4name Â?Â&#x2022;#object "4 module object SĂ&#x153;½Ă&#x201A;CÞ§Ÿê§aĂ&#x2018;´module object name space ÂĽobject " function object ½Ă&#x201A;i@Ÿê§´N^Â&#x17E;ÿ§3local name space ÂĽĂ&#x201E;MĂŻÂ&#x2DC; Â&#x2021;function object "ĂšÂ?Ă&#x2019;n)§Â?Â&#x;oinner function Ă&#x2DC;UÂ&#x2013;ÂŻouter function local name space "

§1.13.2 Â&#x;o´class oject Â&#x2DC;Â&#x2021; {Ăźclass object" >>> class SimplestClass: ... pass ... ÂŚÂ&#x;oÂ?vZ§´¡Â&#x201A;Â&#x152;ÂągĂ?`§¡k ¡1Â&#x2DC;Â&#x2021;class object" weÂĄ~fÂľ >>> ... ... ... >>> OK, >>> >>> OK, >>>

class SampleClass: def __init__(self): print "OK, I was born."

4

XJ´D[1]=something §@oLN^D. setitem

a=SampleClass() I was born. AClass = SampleClass b=AClass() I was born.

annCharles@tom.com

Ÿê

148Â?,208Â?

Python Ă&#x2020;S)P


§1.13 a class SampleClass 'Â&#x2026;i3cname space ÂĽ)¤Â&#x2DC;Â&#x2021;name §SampleClass §Â? Â&#x2022;Â&#x2DC;Â&#x2021;class object " ÂŚ ÂĄÂ&#x160;ĂŠĂ&#x2018;´Â&#x152;ÂąÂ&#x2030;1Â&#x160;ĂŠ"Ă&#x161;def Ă&#x2DC;Ă&#x201C;´§3)¤class object Â&#x17E;ÿ§$ 1ÂŚ ÂĄÂ&#x160;ʧÚ Â&#x160;ĂŠÂĽ)¤Â&#x2DC;Â&#x192;object §Ă&#x2018;3class object name space ÂĽ"Â&#x152;Âą ^SampleClass.var1 /ÂŞÂ&#x2013;ÂŻclass object name space ÂĽobject" Ăš Â&#x160;ĂŠĂ?~Ă&#x2018;´Â&#x2DC; {ĂźDÂ&#x160;Â&#x160;ʧĂ&#x161;def Â&#x160;ʧ^u3class object name space ÂĽMĂŻobject " ~f¼§AClass = SampleClass Ă&#x2019;Â&#x201D;function alias Â&#x2DC;§ïå Â&#x2DC;Â&#x2021;class alias" class object Ă&#x152;Â&#x2021;Â&#x160;^Ă&#x2019;´^5MĂŻclass instance " class object ´ Â&#x152; Âą Â&#x201D; Âź ĂŞ Â&#x2DC;  N ^  § N ^  Â&#x17E; Ăż § Ă&#x2018; \  ĂŤ ĂŞ Ă&#x2019; ´ Ă? Š z Âź ĂŞ__init__ ĂŤĂŞ"Ă&#x2122;ÂĽ1Â&#x2DC;Â&#x2021;ĂŤĂŞself Ă&#x2DC;^Ă&#x2018;\§Python ÂŹgĂ&#x201E;\ÞÚÂ&#x2021;ĂŤĂŞ" N^(J´Â&#x2C6;ÂŁÂ&#x2DC;Â&#x2021;class instance "~X: obj=ClassName()" 3ĂšÂ&#x2DC;:Þ§class object Ă&#x161;function object aq§ŒÂ&#x201A;Ă&#x2018;´callable "Â&#x152;Âą^Âź ĂŞcallable() 5uÂ&#x2DC;Â&#x2021;ĂŠÂ&#x2013;´Ă&#x2DC;´Â&#x152;ÂąN^" XJÂ&#x2DC;Â&#x2021;class object ¼­1 AĂ?Ÿê§@oÂŚ)¤class instance Â?´callable " 3PythonvkC++ÂĽEŸê5 Ă&#x161;Ă&#x203A;Ÿê"´kĂ?ŠzŸê§Â&#x2DC;Â&#x2021;objectMĂŻ Âą §gĂ&#x201E;N^__init__ §Ă&#x2122;8Ă&#x2DC;´Â? MĂŻÂ&#x2DC;Â&#x2021;ĂŠÂ&#x2013;§ ´Â? Ă?ŠzÂ&#x2DC;Â&#x2021;ĂŠÂ&#x2013; ÂĽêâ" EŸêĂ&#x161;Ă?ŠzŸê´kÂŤO§EŸêN^Â&#x17E;ÿ§ÊÂ&#x2013;Â&#x201E;vkMï§Â?Ă&#x2019; ´`§EŸê´3MĂŻĂŠÂ&#x2013;L§¼N^"´3Python ¼§ÊÂ&#x2013;MĂŻÂ&#x192; âN^ Ă?ŠzŸê§Â?Ă&#x2019;´`§3N^Ă?ŠzŸêÂ&#x17E;ÿ§ÊÂ&#x2013;Ž²MĂŻ " class object Ă&#x161;module object kaq/Â?"class object Ă&#x161;module object ': Â&#x192;Ă&#x201C; : class object Ă&#x161;module object ÂĽĂ&#x2018;škÂ&#x152;Âą$1Â&#x160;ĂŠ"Ăš Â&#x160;ĂŠĂ?~Ă&#x2018;´Â&#x2DC; { ĂźDÂ&#x160;Â&#x160;ʧĂ&#x161;def Â&#x160;ʧ^5½Ă&#x201A;CÞ§Ÿê" class object Ă&#x161;module objet Ă&#x2018;´Â&#x2DC;Â&#x2021;Ă&#x2022;ĂĄname space "Ă&#x2122;ÂĽÂ?šÊþ½Ă&#x201A;Ă?name Ă&#x161;object "Ăš object Ă?~´function object " module object ÂĽ~~Â?šclass object "class object ÂĽÂ?Â&#x152;Âąi@½Ă&#x201A;class object " class object Ă&#x161;module object Â&#x2DC;  § 1 Â&#x2DC; Â&#x2021;string  L Â&#x2C6; ÂŞ ´doc string " Â&#x152; Âą ^__doc__ Â&#x2013;ÂŻ" Ă&#x2DC;Ă&#x201C; : class object Ă&#x161;module object  Â&#x152;Ă&#x2DC;Ă&#x201C;Ă&#x2019;´§class object Â&#x152;Âą^ŸêN^/ÂŞ 5MĂŻÂ&#x2DC;Â&#x2021;#class instance" 5

3new style class ¼kEŸê

annCharles@tom.com

149Â?,208Â?

Python Ă&#x2020;S)P


Â&#x2DC; Python0 )¤module object Â?{´MĂŻÂ&#x2DC;Â&#x2021;Âąâ&#x20AC;&#x153;.pyâ&#x20AC;? (Â&#x2014;ŠÂ&#x2021;")¤class object Â?{´ ÂŚ^class 'Â&#x2026;i" 3cname space ÂĽMĂŻmodule object Â?{´Œ^import Â&#x160;ĂŠ"module 1 Â&#x2DC;gimport ½Üreload Â&#x17E;ÿ§$1Ă&#x2122;ÂĽÂ&#x160;ĂŠ" 3cname space ÂĽMĂŻmodule object Â?{´Œ^class Â&#x160;ĂŠ"$1Ăš^Â&#x160;ĂŠ Â&#x17E;ÿ§^S$1class object ÂĽÂ&#x160;ʧ3Ă&#x2122;name space ÂĽMĂŻobject "

§1.13.3 property Ă&#x161;methord ĂšpÂŚ^property Ă&#x161;methord ĂźÂ&#x2021;âÂ&#x160;§´Ă?Â?ÂŚÂ&#x201A;^Ăľ "3Python ¼§5 vkÚßÂ&#x2021;Vg" Ă&#x192; Ă&#x2DC; ´property Â&#x201E; ´methord Ă&#x2018; ´attribute "property ´data attribute §methord ´function attribute " cÂĄ`L§Â&#x2DC;Â&#x2021;object name space ÂĽÂ&#x2DC;Â&#x2021;name Â&#x2DC;½´object Â&#x2DC;Â&#x2021;attribute " ´Â&#x2DC;Â&#x2021;object attribute Ă&#x2DC;Â&#x2DC;½3object name space ÂĽ"Ú´Ă?Â?§attribute ´UĂŹ Âąe5K|¢ 1Â&#x2DC;Â&#x2021;name " 1. |¢object name space 2. XJobject ´Â&#x2DC;Â&#x2021;class instance §|¢object ¤åclass object name space " 3. XJobject ´Â&#x2DC;Â&#x2021;class object §Ă?`k|¢object ¤kykname space " 4. XJobject k__getattr__ Ÿê§N^ĂšÂ&#x2021;Ÿê§Œ^Â&#x2C6;ÂŁ(J" UĂŹeÂ&#x2013;Â&#x201C;è£ãÂ&#x17D;{ def search_name(obj,name): #1. |¢ object  name space if name in obj.__dict__: return obj.__dict__[name] else: try: # 2. XJ object ´Â&#x2DC;Â&#x2021; class instance § # |¢ object ¤å class object  name space " return search_class(obj.__class__,name) except AttributeError: if obj.has_attr(__getattr__): #4.XJ object k __getattr__ Ÿê§N^ĂšÂ&#x2021;Ÿê§Œ^Â&#x2C6;ÂŁ(J return obj.__getattr__(name) annCharles@tom.com

150Â?,208Â?

Python Ă&#x2020;S)P


§1.13 a else: raise AttributeException, "%s not found"%name def search_class(clsobj) # 3.XJ object ´Â&#x2DC;Â&#x2021; class object §Ă?`k|¢ # object ¤kyk name space " if len(clsobj.__bases) == 0: if clsobj.has_attr(__getattr__): return clsobj.__getattr__(self raise AttributeError, "%s not found"%name for base in clsobj.__bases__: return search_name(base,name) Â&#x2DC; Â&#x2021;class object  __bases__ § L ÂŤ ÂŚ  ¤ k Â&#x2020;  I a " Â&#x2DC; Â&#x2021;class instance __class__ §LÂŤMĂŻÂŚclass object " ~X: class A: # Â&#x2DC;Â&#x2021;{Ăźa a=1 # a ´ A ÂĽ name obj = A() print vars(obj) # # print dir(obj) # # # obj.a=2 # print vars(obj) # print obj.a # del obj.a # print obj.a # A.a = 100 # obj =A() # print obj.a # del obj.a # print obj.b # A.b = 200 # print obj.b #

Â&#x2039;< obj  name space, Ă&#x2018;Ă&#x2018; {}, Ă?Â? obj  name space ´Â&#x2DC; Â&#x2039;< obj  ¤k attribute , [â&#x20AC;&#x2122;__doc__â&#x20AC;&#x2122;, â&#x20AC;&#x2122;__module__â&#x20AC;&#x2122;, â&#x20AC;&#x2122;aâ&#x20AC;&#x2122;] Ă?Â? attribute |¢Â&#x17D;{ MĂŻÂ&#x2DC;Â&#x2021; attribute Ă&#x2018;Ă&#x2018; {â&#x20AC;&#x2122;aâ&#x20AC;&#x2122;: 2} Ă&#x2018;Ă&#x2018; 2,k3 obj  name space ÂĽĂŠa" Ă­Ă&#x2DC;Â&#x2DC;Â&#x2021; attribute Ă&#x2018;Ă&#x2018; 1,3 A  name space ÂĽĂŠ a " UC A ÂĽ a MĂŻ#ĂŠÂ&#x2013; Ă&#x2018;Ă&#x2018; 100,§3 A  name space ÂĽĂŠ a " )Ă&#x2030;~"Ă?Â? obj ÂĽvk a " )Ă&#x2030;~"attribute |¢Â&#x17D;{Ă&#x192;{ĂŠb" 3AÂĽMĂŻb Ă&#x2018;Ă&#x2018; 200 "attribute |¢Â&#x17D;{3AÂĽĂŠb"

annCharles@tom.com

151Â?,208Â?

Python Ă&#x2020;S)P


Â&#x2DC; Python0 class instance obj Ă&#x161;class object ,A Ă&#x2018;kgCĂ&#x2022;ĂĄname space §Ă&#x2019;Â&#x201D;¤kobject Â&#x2DC;§Œ Â&#x201A;Ă&#x2018;Â&#x152;ÂąĂ&#x2022;ĂĄÂ&#x2018;Â&#x17E;ïå§Â&#x2018;Â&#x17E;Ă­Ă&#x2DC;Ă&#x2122;name space ÂĽname " class instance obj Ă&#x161;class object ,A 5´Ă&#x2022;ĂĄ§vk'X§´attribute  |¢Â&#x17D;{rÂŚÂ&#x201A;ĂŠX3Â&#x2DC;ĂĽ" attribute |¢Â&#x17D;{Â?rIaĂ&#x161;faĂŠX Â&#x2DC;ü§Ú¢y UÂŤĂ&#x2026;Â&#x203A;" zÂ&#x2DC;Â&#x2021;a¢~Ă&#x2018;kÂ&#x2DC;Â&#x2021;attribute §Â&#x2030;__class__ §3%@Â&#x153;še§ Ă&#x2018;Ă&#x2018;ĂšÂ&#x2021;attribute §ΫÂ&#x152;Âą^"

dir Â?Ă&#x2DC;

Ă&#x2DC;Ă&#x201C;class instance kgCĂ&#x2022;ĂĄname space "~X: >>> class B: ... def __init__(self): ... self.a=1 ... >>> obj1=B() # Ă?ŠzŸêÂ?zÂ&#x2DC;Â&#x2021; instance MĂŻ a >>> obj2=B() >>> obj1.a # obj1 Ă&#x161; obj2 ÂĽĂ&#x2018;k 1 # a >>> obj2.a 1 >>> del obj2.a # Ă­Ă&#x2DC; obj2 ÂĽ a >>> obj2.a # vk ,Ă&#x2DC;U3^ obj2.a

Traceback (most recent call last): File "<stdin>", line 1, in ? AttributeError: B instance has no attribute â&#x20AC;&#x2122;aâ&#x20AC;&#x2122; >>> obj2.b=1 # MĂŻÂ&#x2DC;Â&#x2021; obj2.b >>> obj2.b # obj2 k b, vk a 1 # obj1 k a, vk b ÂŚ+ÂŚÂ&#x201A;Ă&#x201C;´ # class B  instance

§1.13.4 bound methord Ă&#x161;unbound methord 3|¢Â&#x2DC;Â&#x2021;object attribute Â&#x17E;ÿ§XJattribute ´Â&#x2DC;Â&#x2021;function object §@oĂ&#x2019; Â&#x2021;kAĂ??n§rĂšÂ&#x2021;function object C¤Â?bound methord ½Üunbound methord " bound methord Ă&#x161;unbound methord ÂŤO bound methord Ă&#x161;Â&#x2DC;Â&#x2021;class instance Â&#x201D;½" unbound methord Ă&#x2DC;Ă&#x161;Â&#x2DC;Â&#x2021;class instance Â&#x201D;½" annCharles@tom.com

152Â?,208Â?

Python Ă&#x2020;S)P


§1.13 a bound methord ÂŹgĂ&#x201E;rclass instance Â&#x160;Â?1Â&#x2DC;Â&#x2021;Íꧤ¹N^Â&#x17E;ĂżÂ&#x2021;D4Â&#x2DC; Â&#x2021;ĂŤĂŞ" unbound methord KĂ&#x2DC;§N^Â&#x17E;ÿ§Ă&#x2DC;UD4Â&#x2DC;Â&#x2021;ĂŤĂŞ" ~X: class A: def h(self): pass a=A() Ă&#x2122;¼§a.h ´bound methord "A.h ´unbound methord " N^bound methord Â?{´ a.h() §DÂ&#x2DC;Â&#x2021;ĂŤĂŞself §^a Â&#x201C;Oself "51 Â&#x2DC;Â&#x2021;ĂŤĂŞÂ&#x152;¹´?Ă&#x203A;Âśi§Ă&#x2DC;Â&#x2DC;½Â&#x161;Â&#x2021;´self §´Ú´Â&#x2DC;Â&#x2021;ĂŠĂ?S." N^unbound methord Â?{´A.h(a) §Ă&#x2DC;UDĂŤĂŞ" ¡Â&#x201A;Â&#x152;þêÂ&#x153;šŒ^bound methord §Â&#x153;šŒ^unbound methord " ÂŚ^unbound methord ;.Â&#x153;šĂ&#x2019;´§N^Iaunbound methord " bound methord Ă&#x161;unbound methord Â&#x192;Ă&#x201C;: ÂŚÂ&#x201A;1Â&#x2DC;Â&#x2021;ĂŤĂŞĂ&#x2018;´Â&#x2DC;Â&#x2021;class instance §ÚÂ&#x2021;class instance Ă&#x161;methord Ă&#x201C;ĂĄuĂ&#x201C;Â&#x2DC; Â&#x2021;class object " ÂŚ Â&#x201A; Ă&#x2018; ´class object name space ÂĽ function object § Â&#x2DC; Â&#x201E; Ă&#x2DC; ´class instance name space ÂĽ name § Ă&#x2DC; Â&#x161; ² w  3class instance name space ÂĽ M ĂŻ Â&#x2DC; Â&#x2021; Ă&#x201C; Âś name " bound methord §unbound methord Ă&#x161;Ă&#x160;Ă?function object ' Ăšp¤`Ă&#x160;Ă?function ´Â?3class Â&#x160;ĂŠÂ&#x203A;Â&#x203A;Â&#x2030;Â&#x152;Â&#x192; ½Ă&#x201A;function object " â&#x20AC;˘ Â&#x192;Ă&#x201C;: ÂŚÂ&#x201A;Ă&#x2018;´function object §Â&#x;ĂžÂ&#x2DC;"methord Â&#x192;ĂŠuĂ&#x160;Ă?function 5`§3? nclass instance Ă&#x161;class object Â&#x17E;ÿ§¿vkÂ&#x;oĂ&#x2DC;Â&#x2DC;A"=Ϋ bound methord ½Üunbound methord §class object name space ¼§ŒÂ&#x160;^Â?S§Â? Ă&#x2DC;Â?šclass object ÂĽname §Â?Ă&#x2019;´`§ŒĂ&#x161;Ă&#x160;Ă?function ĂŚ^Â&#x2DC; LGB { K§Ă?ĂŠÂ&#x2DC;Â&#x2021;name " Python ÂĽvkĂ&#x2122;ÂŚÂ&#x160;ó¼aqthis ½Üme CĂž"zÂ&#x2021;methord §Ă&#x2018;´class object Â&#x2DC;Â&#x2021;attribute §ŒÂ&#x201A;Ă&#x201A;1Â&#x2DC;Â&#x2021;ĂŤĂŞĂ&#x2019;´self "ÂŚĂ&#x161;Ă&#x160;Ă?ŸêÂ&#x2DC;§Ă&#x2018;Â&#x2021;Ă? Lself 5Â&#x2013;ÂŻclass instance attribute "ÂŚĂ&#x161;Ă&#x160;Ă?ŸêÂ&#x2DC;§Ă&#x2018;Â&#x152;ÂąÂ?class instance Mï§íĂ&#x2DC;attribute " annCharles@tom.com

153Â?,208Â?

Python Ă&#x2020;S)P


Â&#x2DC; Python0 â&#x20AC;˘ Ă&#x2DC;Ă&#x201C;: XJbound methord ½Üunbound methord ¤åclass object ´AObj §@omethord 1Â&#x2DC;Â&#x2021;ĂŤĂŞ7L´AObj class instance ½ÜAObj fÂ&#x161;class instance "Ă&#x160;Ă? function object vkĂšÂ&#x2021; Â&#x203A;"

§1.13.5 UÂŤ(inherit) UÂŤÂ&#x160;{Â&#x201A;ª´ class <name>(superclass1,superclass2,...): Â&#x152; Âą k Ăľ Â&#x2021; I a " Â&#x2013; ÂŻ I a methord   ~ ^  Â? { ´ ÂŚ ^unbound methord§superclass.methord(self,...)" zÂ&#x2DC;Â&#x2021; class object Ă&#x2018;kÂ&#x2DC;Â&#x2021;__bases__ attribute §´Â&#x2DC;Â&#x2021;tuple §^uPšŒ ¤kÂ&#x2020;IÂ&#x160;" attribute |¢Â&#x17D;{¢y UÂŤĂ&#x2026;Â&#x203A;" AĂ&#x2DC;^Â&#x201D;C++ ÂĽ@AO)ÂşÂ&#x;o´­1§ Â&#x192;"

attribute |¢Â&#x17D;{Ž²`² Â&#x2DC;

Â&#x160;âattribute |¢Â&#x17D;{§kÂąe­1JÂľ 1. Â&#x2DC;Â&#x2021;class instance  name space ÂĽname ÂŹÂ&#x201C;OÂŚ name §Ă&#x201E;k|¢" 2. Â&#x2DC;Â&#x2021;

class object ÂĽĂ&#x201C;Âś

class object name ÂŹÂ&#x201C;OIaÂĽĂ&#x201C;Âśname §Ă&#x201E;k|¢"

´3þ­UÂŤÂ&#x17E;ÿ§Â?Ă&#x2019;´`§kĂľÂ&#x2021;IaÂ&#x17E;ÿ§Â&#x2021;5ÂżIa3½Ă&#x201A;ÂĽĂ&#x2018;y^ S§Ă?Â?ÂŚÂ&#x160;âattribute |¢Â&#x17D;{ݽ Ă&#x2019;IaÂ&#x192;m­1'X" ÂĄÂŹkÂ?\\ ?Ă&#x2DC;"

§1.13.6 ¡¤ CĂž Â?N\^LC++½ÜJava¼¡¤ CÞ§Ă&#x2019;´Ă&#x201C;Â&#x2DC;Â&#x2021;class Ă&#x2DC;Ă&#x201C;instance Â?Ă&#x201C;Â&#x2DC; Â&#x2021;CĂž"python Â?kڍĂ&#x2026;Â&#x203A;§´§Ă&#x2DC;´Ă&#x161;?#Ă&#x20AC;Ă&#x153;§Ă?Â?zÂ&#x2021;class instance kÂ&#x2DC; Â&#x2021;obj.__class__ attribute Â?Â&#x2022;MĂŻclass instance class object "|^ĂšÂ&#x2DC;:§¡Â&#x201A;Â&#x152; ¹¢y¡¤ CÞþU" >>> class A: ... count = 0 ... def __init__(self): ... self.__class__.count= self.__class__.count + 1 ... #5ÂżĂ&#x2DC;´self.count annCharles@tom.com

154Â?,208Â?

Python Ă&#x2020;S)P


§1.13 a >>> A.count #Â&#x201E;vkA instance 0 >>> a=A() # MĂŻÂ&#x2DC;Â&#x2021;A instance >>> a.count # a.count Ă&#x161; A.count ´3ĂźÂ&#x2021;Ă&#x2DC;Ă&#x201C; name space ÂĽ 1 >>> a.count = 2 # UC a.count >>> a.count 2 >>> A.count # Ă&#x2DC;ÂŹKÂ? A.count 1 # y3A Â?kÂ&#x2DC;Â&#x2021;instance >>> a.__class__ # a name space kÂ&#x2DC;Â&#x2021; __class__  name <class __main__.A at 0x81566d4> >>> a.__class__ is A # ĂšÂ&#x2021; name Ă&#x161; A Ă&#x2018;Ă&#x161;Ă&#x201C;Â&#x2DC;Â&#x2021; class ĂŠÂ&#x2013;kbind 'X. 1 # Â?Ă&#x2019;´`,ÂŚÂ&#x201A;´Â&#x2DC;ÂŁÂŻ,Â?´Ă&#x201C;Â&#x2DC;Â&#x2021;Ă&#x20AC;Ă&#x153; >>> b=A() #3MĂŻÂ&#x2DC;Â&#x2021; instance >>> A.count # __init__ ÂĽ self.__class__ O\ 1 2 # self.__class__ Ă&#x161; A Â?´Ă&#x161;Â&#x2DC;Ă&#x20AC;Ă&#x153;. # y3 AkĂźÂ&#x2021; instance .

§1.13.7

Abstrace Class

Java kinterface §C++ ÂĽabstract class §@opython QÂş class AbstractClass: def AbstrctMethord(self): raise NotImplementedError Ă&#x2DC; Ă&#x2030;~exceptionÂ&#x192; §vk0 #Vg"Ă&#x201C;Â&#x17E;Â?áv abstract class Â&#x2021;ÂŚ"Ă?Ă&#x2020;ÂĄ Â&#x2022;ĂŠÂ&#x2013;?§§úÚ´Ă&#x192;Â&#x201C;è§Â&#x;oÂ?vkZ§Ă&#x2020;LÂ&#x192; §uyÚ´¥Â&#x2022;ĂŠÂ&#x2013;Ă&#x2DC;%g Â&#x17D;Â&#x192;Â&#x2DC;§ŠlÂ?Ă&#x161;¢y"

§1.13.8 hkattribute XJ3class object ¼½Ă&#x201A;ÂśiáveÂĄ^Â&#x2021;Âľ 1.  ¹ßÂ&#x2021;eyÂ&#x201A;â&#x20AC;&#x153;__â&#x20AC;? mĂ&#x17E;" 2.  þ¹Â&#x2DC;Â&#x2021;eyÂ&#x201A;â&#x20AC;&#x153;__â&#x20AC;? mĂ&#x17E;" Ăšattribute §Ă&#x2019;´hk" ¢yhkattribute Â?{§âÂ&#x160;Â&#x2030;name mangle " annCharles@tom.com

155Â?,208Â?

Python Ă&#x2020;S)P


Â&#x2DC; Python0 ¯¢Þ§Python ÂĽvkÂ?{¢yĂ˝hkattribute §Python ¢yÂ?{Ă&#x2DC;L´U Âśi Ž§Â?Â&#x2021;3½Ă&#x201A;class object ÂĽÂ&#x160;ĂŠÂĽ-ávÞ¥^Â&#x2021;name §Python Ă&#x2018;gĂ&#x201E; \Ăžâ&#x20AC;&#x153; _classnameâ&#x20AC;? § ~X: >>> class A: ... __prv_a=100 ... >>> vars(A) {â&#x20AC;&#x2122;__module__â&#x20AC;&#x2122;: â&#x20AC;&#x2122;__main__â&#x20AC;&#x2122;, â&#x20AC;&#x2122;_A__prv_aâ&#x20AC;&#x2122;: 100, â&#x20AC;&#x2122;__doc__â&#x20AC;&#x2122;: None} >>> A._A__prv_a=200 >>> vars(A) {â&#x20AC;&#x2122;__module__â&#x20AC;&#x2122;: â&#x20AC;&#x2122;__main__â&#x20AC;&#x2122;, â&#x20AC;&#x2122;_A__prv_aâ&#x20AC;&#x2122;: 200, â&#x20AC;&#x2122;__doc__â&#x20AC;&#x2122;: None} 5Âż__prv_a C¤ _A__prv_a "ĂšÂ&#x2030;JĂ&#x2019;´Â&#x201C;Â&#x17D; Âż Â&#x2013;ÂŻ IaĂ&#x201C; Âśattribute " ´§3§SÂĽÂ&#x201E;´kÂ&#x152;UÂ&#x2013;ÂŻhkattribute "Þ¥~fÂĽĂ&#x2019;´Â&#x2013;ÂŻhkattribute Â?{"ÂŚ^ڍÂ?{3Nà §SÂ&#x17E;ÿ´Êk^" Ă&#x2DC;Â&#x161;¿ÚoÂ&#x2030;§Ă&#x201E;KÂ&#x2013;ÂŻhkattribute Ă&#x2026;´§ÚĂ&#x2026;Â&#x203A;Â&#x152;Âą3,§Ă? ĂžÂ&#x201C;Â&#x17D;§S Â&#x2039;Â&#x2020;Ă&#x2DC;"

§1.13.9 Python ¼class A�methord e¥A�

methord Â&#x152;Âą­1§¢yaq

C++ ÂĽĂśÂ&#x160;Ă&#x17D;­1ĂľU"

3Python ÂĽkĂŠĂľclass AĂ?methord§Â&#x201D;__init__Ă&#x2019;´Ă&#x2122;ÂĽÂ&#x2DC;Â&#x2021;" â&#x20AC;˘ __init__ Ž²0 L §Ă&#x2019;´3obj=A_Class(arg,...)Â&#x17E;ĂżgĂ&#x201E;N^§§ĂŤĂŞĂ&#x2DC;

self Â&#x201E;kA_Class ÂĽD4ĂŤĂŞ" â&#x20AC;˘ __del__(self) 3ĂŠÂ&#x2013;Ă­Ă&#x2DC;Â&#x17E;ÿ§gĂ&#x201E;N^"Ă&#x2019;´`vkname Ă&#x161;ĂšÂ&#x2021;object kbind 'XÂ&#x17E;ÿ§N^ÂŚ" â&#x20AC;˘ __repr__(self) ÂŚ ^repr(obj)  Â&#x17E; Ăż § ÂŹ g Ă&#x201E; N ^obj __repr__ Âź ĂŞ § Ăš Â&#x2021; Âź ĂŞ Â&#x2C6; ÂŁ Ă&#x161;eval() o N  ĂŠ Â&#x2013; i Ă&#x17D; G L Â&#x2C6; ÂŞ § ^ u ­ ĂŻ ĂŠ Â&#x2013; § Â? Ă&#x2019; ´ ` § X Jeval(repr(obj)) ÂŹÂ&#x2DC;Â&#x2021;ĂŠÂ&#x2013;Â&#x20AC;" â&#x20AC;˘ __str__(self) Â&#x2018;BÂ&#x2C6;ÂŁÂ&#x2DC;Â&#x2021;iĂ&#x17D;GÂŁĂŁĂŠÂ&#x2013;"eÂĄ~f`² __repr__ Ă&#x161;__str__ Ă&#x2DC;Ă&#x201C;" >>> class A: ... def __repr__(self): ... return "A()" annCharles@tom.com

156Â?,208Â?

Python Ă&#x2020;S)P


§1.13 a ... ... ... >>> >>> ok, >>> A() >>> >>> A() >>>

def __str__(self): return "ok, I am here" x=A() print x I am here print repr(x) b = eval(repr(x)) b

eval(str) ´^5OÂ&#x17D;Â&#x2DC;Â&#x2021;python LÂ&#x2C6;ª§¿Â&#x2026;Â&#x2C6;ÂŁĂšÂ&#x2021;LÂ&#x2C6;ÂŞ"Ú´)ÂşÂ&#x160;ĂłĂ?^ A5§Â&#x152;Âą3§SÂĽ§S§´rڍÂ&#x201C;èÂ&#x20AC;Ă&#x2C6;¤C++ ´'(J§Ă?Â?IÂ&#x2021; k)ÂşÂ&#x2030;1LÂ&#x2C6;ÂŞÂŹ"ĂšÂ&#x152;Ă&#x2DC;´Â&#x2DC;Â&#x2021;N´ĂłÂ&#x160;" â&#x20AC;˘ __cmp__(self,other) Â&#x2DC;Â&#x2021;'ĂśÂ&#x160;Ă&#x17D;"0 LÂŤÂ&#x192;§1LÂŤÂ&#x152;u§â&#x2C6;&#x2019;1LÂŤu" >>> ... ... ... ... ... >>> >>> ... >>> ... ok >>> ... ok >>>

class Dog: def __cmp__(self,other): if other > 0 : return 1; elif other < 0 : return -1; else: return 0 dog = Dog() if dog > -10 : print "ok" if dog < -10 : print "ok"

if dog == 0 : print "ok"

ÚãÂ&#x201C;èÂ?´`²__cmp__ ^{§Ă&#x2122;¢Ú´Ê¡Ă?Â&#x2DC;ĂŁÂ&#x201C;è§Ă&#x161;ĂŞikÂ&#x;oĂ? '? ÂŚÂ?´`² pythonÂ&#x160;ĂłA:§Ă&#x2019;Â&#x17D;Ă&#x2020;ÂŹ Â&#x2DC;Â&#x20AC;Â&#x160;ó§Â?Â&#x2DC;ÂŹÂ&#x160;Ă&#x192;Ă&#x201D; g" annCharles@tom.com

157Â?,208Â?

Python Ă&#x2020;S)P


Â&#x2DC; Python0 â&#x20AC;˘ __hash__(self)§Â&#x2C6;ÂŁÂ&#x2DC;Â&#x2021;32 Â?hash value"­1ĂšÂ&#x2021;ŸêÂ&#x192; §Ú class instance Ă&#x2019;Â&#x152;ÂąÂ&#x160;Â? dictionary êâ(ÂĽkey " â&#x20AC;˘ __nozero__(self)§¹c¡Â&#x201A;5ÂżNone§"" §() Ă&#x2018;LÂŤĂ&#x153;6b§Ă&#x2122;ÂŚĂ&#x2018;´ ý§Ă&#x2122;¢Ă&#x2DC;ʧÚpÂ&#x152;¹½Ă&#x201A;Â&#x2DC;Â&#x2021;ĂŠÂ&#x2013;´Ă&#x201E;´Ă&#x153;6b"XJÂ&#x2C6;ÂŁ0 LÂŤĂ&#x153;6b§ Â&#x2C6;ÂŁ1 LÂŤĂ&#x153;6Ă˝" >>> class Dog: ... alive=0 ... def __nonzero__(self): ... if self.alive==0 : return 0 ... else: return 1 ... >>> dog = Dog() >>> dog.alive 0 >>> if dog : print "the dog is alive" ... else: print " the dog is dead" ... the dog is dead >>> dog.alive =1 >>> if dog : print "the dog is alive" ... else: print " the dog is dead" ... the dog is alive >>> ÚãÂ&#x201C;èwĂĽ5'ĂžÂ&#x2DC;Â&#x2021;~fÂ&#x201E;´N´Ă&#x192;"Â&#x2013;ÂŚvk`l" â&#x20AC;˘ __len__(self)§3^SÂ&#x2DC;ŸêlenN^ĂŠÂ&#x2013;Â&#x17E;ÿ§N^§Â&#x2C6;ÂŁobjectĂ?" XJvk½Ă&#x201A;ĂšÂ&#x2021;Ÿê§ N^len(obj)ÂŹÂ&#x2014;Ă&#x2030;~" >>> class EmptyClass: ... pass ... >>> obj=EmptyClass() >>> len(obj) Traceback (most recent call last): File "<stdin>", line 1, in ? AttributeError: EmptyClass instance has no attribute â&#x20AC;&#x2122;__len__â&#x20AC;&#x2122; >>> class Dog : annCharles@tom.com

158Â?,208Â?

Python Ă&#x2020;S)P


§1.13 a ... def __len__(self): ... return 1000 ... >>> dog = Dog() >>> len(dog) 1000 cÂĄÂ&#x2DC;Ă&#x153;Š`² vk½Ă&#x201A;__len__ ÂŹÂ&#x2014;Ă&#x2030;~§ ÂĄ~f`² ½Ă&#x201A; __len__ Ă&#x2019;Â&#x152;Âą §Â&#x201E;´Â? `²Â&#x160;Ăł§ Â&#x2DC;ĂŁ ĂŚÂ&#x201C;è§NoÂŹkĂ? QÂşlen(dog)Â&#x2DC;Â&#x2021;Ă?? Ă&#x17D;Ă&#x192;ÂżĂ&#x201A;"´3\kĂšoÂ&#x2DC;ÂŤĂ&#x2026;Â&#x203A;Â&#x152;Âą Â&#x2030;Ă?§Â?N\3muÂ&#x2DC;Â&#x2021;EmailBody class Â&#x17E;ĂżĂ&#x2019;Â&#x152;Âą^len(a_email_body) Â&#x2C6;ÂŁÂ&#x2DC;Â&#x2021;>feÂ&#x2021;SNĂ?" ÂĄÂ&#x201E;ÂŹÂ&#x2DC; Ă&#x192;ÂżĂ&#x201A;Â&#x201C;è§Â?´Â? `²Â&#x160;Ăł A:" â&#x20AC;˘ __getitem__(self,key)§Â&#x2C6;ÂŁself[key] ^5[list§dictionary§tuple êâ( " >>> class Zoo: ... def __getitem__(self,key): ... if key == "dog" : return "dog" ... elif key == "pig" : return "pig" ... elif key == "wolf" : return "wolf" ... else : return "unknown" ... >>> zoo=Zoo() >>> zoo["dog"] â&#x20AC;&#x2122;dogâ&#x20AC;&#x2122; >>> zoo["pig"] â&#x20AC;&#x2122;pigâ&#x20AC;&#x2122; >>> zoo["wolf"] â&#x20AC;&#x2122;wolfâ&#x20AC;&#x2122; 5¿§__getitem__ Â&#x152;¹ŒÂ&#x2DC;Â&#x2021;ĂŠÂ&#x2013;Â&#x201D;sequence Â&#x2DC;"3python ÂĽâÂ&#x160;´§object ¢y __getitem__ protocol (Ă&#x2020;)§aqjava ÂĽinterface"Â?Ă&#x2019;´`Â&#x2DC; SÂ&#x2DC;Â&#x160; ʧfor ÂŹÂŚ^ĂšĂ&#x2020;" >>> class A: ... def __getitem__(self,key): ... print "debug: key is %s"%key ... if key >=0 and key <=5: return key * key annCharles@tom.com

159Â?,208Â?

Python Ă&#x2020;S)P


Â&#x2DC; Python0 ... raise IndexError ... return None ... >>> a=A() >>> for k in a: print k ... debug: key is 0 0 debug: key is 1 1 debug: key is 2 4 debug: key is 3 9 debug: key is 4 16 debug: key is 5 25 debug: key is 6 >>> raise IndexError ´LÂŤ(ĂĽ"return None Cvk^ "for Â&#x160;ĂŠl0 mŠ§ ^Â&#x2DC;Â&#x2021;Ă&#x2DC;ä4Okey la ÂĽĂŠÂ&#x2013;"^whileÂŁĂŁÂŚĂ&#x2019;´ __tmp__ = 0 while(1): try : k = a[__tmp__] ... # for SÂ&#x160;ĂŠ __tmp__ = __tmp__ +1 except IndexError: break Ú´Â? `² for k in a Â&#x160;Ă&#x201A;§,^for Â&#x160;ĂŠÂ?\{Ăś"\[Ă&#x2DC;ÂŹÂŚ^Ăš ÂŤwhileÂ&#x160;ĂŠÂ&#x201C;Ofor Â&#x160;ĂŠ" â&#x20AC;˘ __setitem__(self,key,value)§[ obj[key]=value" >>> class A: ... def __setitem__(self,key,value): annCharles@tom.com

160Â?,208Â?

Python Ă&#x2020;S)P


§1.13 a ... print "debug: you want to set [%s] to [%s]"% ... (key,value) ... >>> a=A() >>> a["key"]="value" debug: you want to set [key] to [value] >>> â&#x20AC;˘ __delitem__(self,key)§[ del obj[key] Â&#x17E;§N^TŸê >>> class A: ... def __delitem__(self,key): ... print "debug: you want to del [%s]"%(key,) ... >>> a=A() >>> del a["key"] debug: you want to del [key] __delitem__§__setitem__§__getitem__ Â?´JøÂ&#x2DC;ÂŤ*Ă?a.Â&#x160;{§äNÂ&#x160; Ă&#x201A;§ATd\§Sݽ§Â&#x152;¹´Ă?§S§Â?Â&#x152;ÂąĂ&#x2018;4<tĂ&#x2DC;Ă&#x192;§S" __getslice__(self,i,j)§__setslice__(self,i,j,value)§ __delsclice__(self,i,j) ´ a q  " 5 Âż X J v k Â? ½ Ăž  ½ Ăś e  § ÂŚ ^ Â&#x2DC;Â&#x2021; Â&#x152;ĂŞĂ&#x161;0Â&#x201C;O" >>> class A: ... def __getslice__(self,i,j): ... print "you want to get the slice %d:%d"%(i,j) ... def __setslice__(self,i,j,value): ... print "you want to set the slice %d:%d to %s"% ... (i,j,value) ... def __delslice__(self,i,j): ... print "you want to del the slice %d:%d"%(i,j) ... >>> a=A() >>> print a[1:2] you want to get the slice 1:2 None >>> print a[:] you want to get the slice 0:2147483647 annCharles@tom.com

161Â?,208Â?

Python Ă&#x2020;S)P


Â&#x2DC; Python0 None >>> a[2:3]= [1,2] you want to set the slice 2:3 to [1, 2] >>> del a[:] you want to del the slice 0:2147483647 >>> â&#x20AC;˘ __contains__(self,other) Â&#x152;¹Œobject Â&#x201D;sequence Â&#x2DC;§?nin Â&#x160;ĂŠ >>> class A: ... def __contains__(self,other): ... if other=="ok" : return 1 ... return 0 ... >>> a=A() >>> if "ok" in a: print "ok in a" ... else : print "ok not in a" ... ok in a â&#x20AC;˘ __call__(self,arg1,arg2,...) 4object Â&#x201D;ŸêÂ&#x2DC;§Â&#x152;ÂąN^" >>> class A: ... def __call__(self,*arg):#ĂšpÂŚ^Â&#x152;CĂŤĂŞĂ&#x2026;Â&#x203A;,Â&#x2039;<¤kD?5ĂŤ ĂŞ ... for k in arg: ... print k ... >>> a=A() >>> a("hello","World") hello World >>> â&#x20AC;˘ Ă&#x2122;ÂŚÂ&#x17D;âÜÂ&#x160;Ă&#x17D;§XL1.13-4

kÊþŸê¢y ĂśÂ&#x160;Ă&#x17D;­1Ă&#x2026;Â&#x203A;§A¤kpython ĂśÂ&#x160;Ă&#x17D;Ă&#x2018;kڍ­1Ă&#x2026;Â&#x203A;" \Â&#x152;ÂąÂ&#x2DC;Â&#x2021;gCclass §4ÂŚwĂĽ5§Â&#x201D;list §dictionary Â&#x2DC;§|¹¤klist  ¤kĂśÂ&#x160;Ă&#x17D;Ă&#x161;Â&#x160;ĂŠ"3python module lib ¼Ž²kĂšclass§Â&#x152;Âą wÂŚÂ&#x201A; annCharles@tom.com

162Â?,208Â?

Python Ă&#x2020;S)P


§1.13 a �{ __add__(self,other) __sub__(self,other) __mul__(self,other) __div__(self,other) __mod__(self,other) __divmod__(self,other) __pow__(self,other) __pow__(self,other,modulo) __lshift__(self,other) __rshift__(self,other)

(J self + other self - other self * other self / other self % other divmod(self,other) self ** other pow(self,other,modulo) self << other self >> other

L 1.13-4: Â&#x152;¹­1Â&#x17D;âÜÂ&#x160;Ă&#x17D;Ÿê Â&#x201C;è§Â&#x161;~姴ÊkdÂ&#x160;"3lunix ÂĽÂ&#x152;Âą3/usr/lib/python2/ ÂĽĂŠUserList.py UserDict.py"

§1.13.10 Â&#x2DC; AĂ?­1Ÿê^{Ă&#x17E;~ |^ bases

class

ĂĄ5Â&#x2039;<aUÂŤ(

3C++ ¼§class Â&#x160;Ê´Â&#x2DC;Â&#x2021;(²Â&#x160;ʧ´3Python ¼§class ´Â&#x2DC;Â&#x2021;Ă&#x203A;šDÂ&#x160; Â&#x160;ʧŒ)¤ Â&#x2DC;Â&#x2021;aĂŠÂ&#x2013;(class object) §5ÂżaĂ&#x161;Ÿê§ÂŹÂ&#x2DC;§Â?´Â&#x2DC;Â&#x2021;ĂŠ Â&#x2013;§aĂŠÂ&#x2013;(class object)Ă&#x161;a¢~(instance) ´Ă&#x2DC;Ă&#x201C;Ă&#x20AC;Ă&#x153;" zÂ&#x2DC;Â&#x2021;a¢~Ă&#x2018;kÂ&#x2DC;Â&#x2021;ĂĄ5§Â&#x2030;__class__ §Â?Ă&#x2019;´instance object name space ÂĽÂ&#x2DC;Â&#x2021;Âśi§LÂŤ)¤ÚÂ&#x2021;a¢~aĂŠÂ&#x2013;"¤¹ x = obj.__class__() ÂŹ)¤Ă&#x161;obj Ă&#x201C;a.¢~" eÂĄÂ&#x201C;èÂ&#x152;ÂąÂ&#x2039;<Â&#x2DC;Â&#x2021;aĂŠÂ&#x2013;(class object) ½Ü¢~ĂŠÂ&#x2013;(class instance)UÂŤ( " # browseclass.py import types indent = 0 def printBases(clsobj): # XJ clsobj ´Â&#x2DC;Â&#x2021; class instance if hasattr(clsobj,"__class__"): return printBases(clsobj.__class__) # XJ clsobj Ă&#x2DC;´Â&#x2DC;Â&#x2021; class object annCharles@tom.com

163Â?,208Â?

Python Ă&#x2020;S)P


˜ Python0 if type(clsobj) != types.ClassType: raise "must input a class objcet as argument" global indent print " "*indent + str(clsobj); indent = indent +2 for b in clsobj.__bases__: printBases(b) indent = indent -2 if __name__ == "__main__": import Tkinter printBases(Tkinter.Button) b = Tkinter.Button() printBases(b) $1(J: $ python browseclass.py Tkinter.Button Tkinter.Widget Tkinter.BaseWidget Tkinter.Misc Tkinter.Pack Tkinter.Place Tkinter.Grid Tkinter.Button Tkinter.Widget Tkinter.BaseWidget Tkinter.Misc Tkinter.Pack Tkinter.Place Tkinter.Grid hasattr Œ±^5䘇閴Ĺk,‡attribute" ­1 setattr

¢yÖá5

~X: annCharles@tom.com

164,208

Python ÆS)P


§1.13 a #readonlyattr.py class A: readonlyValue=100 def __setattr__(self,attr,value): if attr=="readonlyValue": raise "can not change the readonly value" if __name__ == "__main__": a=A() print a.readonlyValue a.readonlyValue = 102

$1(J: python readonlyattr.py 100 Traceback (most recent call last): File "readonlyattr.py", line 12, in ? a.readonlyValue = 102 File "readonlyattr.py", line 7, in __setattr__ raise "can not change the readonly value" can not change the readonly value 3ĂšÂ&#x2021;~f¼§ĂŠÂ&#x2DC;Â&#x2021;ĂŠÂ&#x2013;ĂĄ5DÂ&#x160;Â&#x17E;ÿ§N^__setattr__ Ÿê§Ă&#x201A; ÍêŠO´§ÊÂ&#x2013;(self)§attribute Âśi(attr) §Ă&#x161;Â&#x2021;DÂ&#x160;(value)" __setattr__Ÿêu§SÂ&#x2021;?U, Â?Ă&#x2013;ĂĄ5§Ă&#x2019;Ă&#x2018;Ă&#x2030;~" ­1 getattr

¢yÂ&#x201C;na

lattribute |¢Â&#x17D;{Â&#x152;Âąw__getattr__ AĂ?Â&#x160;^" ­1__getattr__ §Â&#x152;ÂąĂ?L|Ă&#x153;ĂŠÂ&#x2013;Â?{§Â&#x201C;OUÂŤĂ&#x2026;Â&#x203A;" UÂŤĂ&#x2026;Â&#x203A;ĂŠN´4aĂ&#x152;äCĂŠÂ&#x152;§XJÂ&#x2DC;Â&#x2021;ak10 Â&#x201C;¹Þyma§@oÂ&#x2021; Â&#x17D;Ă&#x2013;Ă&#x192;ڍa´Ê(J" ^|Ă&#x153;ĂŠÂ&#x2013;Â?ª§Â&#x152;Âą~aÂ&#x192;mE,UÂŤ'X§ Â&#x201C;Â&#x192;´ÊÂ&#x2013;Â&#x192;m|Ă&#x153;' X" aUÂŤĂ&#x161;|Ă&#x153;ĂŠÂ&#x2013;´¥Â&#x2022;ĂŠÂ&#x2013;ߍ ~^E^Â&#x201C;èÂ?ÂŞ"ÂĄÂ&#x2022;ĂŠÂ&#x2013;OÂĽkÂ&#x2DC; Â&#x2021;K§â&#x20AC;&#x153;`kÂŚ^ĂŠÂ&#x2013;|Ă&#x153;§ Ă&#x2DC;´aUÂŤâ&#x20AC;? " annCharles@tom.com

165Â?,208Â?

Python Ă&#x2020;S)P


˜ Python0 ~f: #agentclass.py class B: def printMe(self): print "I am B" def printOk(self): print "B say:OK" class C: def printMe(self): print "I am B" def printOk(self): print "C say:OK" class A: __realobj__ = B() def __getattr__(self,attr): return getattr(self.__realobj__,attr) def printMe(self): print "I am A"

if __name__ =="__main__": a=A() a.__realobj__ a.printMe() a.printOk()

= B()

a.__realobj__ a.printMe() a.printOk()

= C()

$1(J: $ python agentclass.py I am A annCharles@tom.com

166,208

Python ÆS)P


§1.13 a B say:OK I am A C say:OK 3ĂšÂ&#x2021;~f¼§class instance a Ă&#x161;Œ¤åclass object A ¼½Ă&#x201A; printMe § Â&#x160;âattribute |¢Â&#x17D;{§__getattr__ ´ Â&#x2DC;Ă&#x161;§XJ3class instance ÂĽĂ&#x161;Ă&#x2122;Â&#x2020; ½Üm¤åclass object ÂĽĂ&#x2018;vkĂŠattribute §@orĂšÂ&#x2021;attribute =gÂ&#x2030;Ă˝ ĂŠÂ&#x2013;__realobj__ Ăž" UC__realobj__ Ă&#x2019;Â&#x152;ÂąUCa ĂŠÂ&#x2013;¤|Âąattribute "Â&#x152;ÂąwÂ&#x2030;´Ă&#x201E;U§ ½Ü`^|Ă&#x153;ĂŠÂ&#x2013;Â?ª¢y UÂŤ" Ă?Â?UÂŤĂ&#x2026;Â&#x203A;Ă&#x2019;´dattribute |¢Â&#x17D;{¢y§ __getattr__ ŸêĂ&#x2019;´Â&#x17D;{ ÂĽ Â&#x2DC;Â&#x2021; Â&#x20AC;§|^ΤÂ&#x152;¹¢yUÂŤĂ&#x2026;Â&#x203A;" ^setattr Â?ĂŠÂ&#x2013;Ă&#x201E;O\attribute ~f: #dynamicattr.py class A: def __init__ (self,**kws): for k,v in kws.items(): setattr(self,k,v) def DumpObj(self): for k,v in vars(self).items(): print "%10s:%s"%(k,v) if __name__ =="__main__": D = {"one":1,"two":2,"three":3} a=A(five=5, six=6) for k , v in D.items(): setattr(a,k,v) DumpObj(a) $1(J: python dynamicattr.py one:1 annCharles@tom.com

167Â?,208Â?

Python Ă&#x2020;S)P


Â&#x2DC; Python0 six:6 five:5 three:3 two:2 lĂšÂ&#x2021;~fÂ&#x152;Âąw§Â&#x2DC;Â&#x2021;ĂŠÂ&#x2013;Ă&#x2019;´Â&#x2DC;Â&#x2021;dictionary p?êâ(" ĂŠÂ&#x2013;ĂłÂ&#x201A;¢y Â&#x;o´ÊÂ&#x2013;ĂłÂ&#x201A;ºÊÂ&#x2013;ĂłÂ&#x201A;Ă&#x2019;´)ĂŠÂ&#x2013;/Â?"3C++ ¼§Â? (š)¤Ă&#x2DC;Ă&#x201C; ĂŠÂ&#x2013;§Ì^ ĂŠĂľÂ?{)¤ÊÂ&#x2013;" 3Python ÂĽÂ?kaqÂ?{§LÂ&#x2C6;Â?\;n§Ă?3uPython ÂĽclass Â?´Â&#x2DC; Â&#x2021;ĂŠÂ&#x2013;"" ~f: #objFactory.py class ObjFactory: def __init__(self,clsobj=None,*args,**keyargs): self.clsobj = clsobj and clsobj or self.__class__ self.args = args self.keyargs= keyargs def createObj(self): return self.clsobj(*self.args,** self.keyargs) class testClass: def __init__(self,value1,value2,*args,**keyargs): for k,v in keyargs.items(): setattr(self,k,v) self.args = args self.value1 = value1 self.value2 = value2 def DumpObj(self): for k,v in vars(self).items(): print "%10s:%s"%(k,v) if __name__ == "__main__": f = ObjFactory(testClass,100,200,300,one=1,two=2,three=3) DumpObj(f.createObj()) annCharles@tom.com

168Â?,208Â?

Python Ă&#x2020;S)P


§1.13 a

$1(J: % python objFactory.py one:1 value2:200 value1:100 args:(300,) three:3 two:2 `²: 1. callableobj(*args,**keys)  Â&#x201A; ÂŞ ´ Â&#x203A; Š ( š  N ^ Â? ÂŞ "args ´ Â&#x2DC; Â&#x2021;tuple , keys ´Â&#x2DC;Â&#x2021;dictionary "ĂšN^Ÿêcallablobj Â&#x17E;ÿ§callableobj largs ÂŻ K¤kÂŚÂ&#x2021;ĂŤĂŞ(positional argument)§¯Â?eÂ&#x160;Â??ÂżÂ&#x2021;ĂŞĂŤĂŞ(arbitrary argument)§keys Â&#x160;Â?i;ÍꧽÜ'Â&#x2026;iĂŤĂŞ(keyword arguments)"ڍÂ?ÂŞ 'N^apply ŸêÂ?\Â?B" 2. UCĂłÂ&#x201A;ĂŠÂ&#x2013;f §Ă&#x2019;Â&#x152;Âą)Ă&#x2018;Ă&#x2DC;Ă&#x201C;ĂŠÂ&#x2013;5"~XÂ&#x2DC;Â&#x2021;?)è§S¼§XJ|Âą Ă&#x2DC;Ă&#x201C;?)èÂ?Y§@oÂ&#x152;ÂąÂ&#x160;âŠÂ&#x2021;Ă&#x17E;&E§Ă&#x201E;)¤?)èÏÊÂ&#x2013;§@o?) è?nL§Ă&#x2019;Â&#x152;¹­^ "XJÂą Â&#x2021;|ÂąÂ?Ăľ?)èÂ?Y§Â?Â&#x2021;½Ă&#x201A;#?) èÏÊÂ&#x2013;Ă&#x2019;Â&#x152;Âą" ­1 iter

a§4ĂŠÂ&#x2013;wĂĽ5Â&#x2013;SÂ&#x201C;ĂŹ

Â&#x;o´SÂ&#x201C;ĂŹ(iterator) ºŒĂ&#x152;Â&#x2021;^uH{Â&#x2DC;Â&#x2021;êâ(§ ĂšÂ&#x2021;êâ(Â&#x2DC;Â&#x201E;´´Â&#x2DC; Â&#x2021;NϧĂ&#x2122;ÂĽÂ?škÊþÊÂ&#x2013;" ~^SÂ&#x201C;ĂŹĂ&#x2019;´sequence SÂ&#x201C;ĂŹ" for i in "abc": print i 3ÂŚ^for Â&#x160;ĂŠÂ&#x17E;ÿ§¢SN^in ÂĄĂŠÂ&#x2013;iter() Â?{§Â&#x2DC;Â&#x2021;SÂ&#x201C;ĂŹĂŠ Â&#x2013;i §, Ă&#x2DC;äN^i.next() Â&#x2DC;Â&#x2021;ĂŠÂ&#x2013;§Â&#x2020;u)StopIteration Ă&#x2030;~" eÂĄ~f`² for Â&#x160;ĂŠĂ&#x2026;Â&#x203A;" >>> s = â&#x20AC;&#x2122;abcâ&#x20AC;&#x2122; >>> it = iter(s) >>> it <iterator object at 0x00A1DB50> >>> it.next() annCharles@tom.com

169Â?,208Â?

Python Ă&#x2020;S)P


Â&#x2DC; Python0 â&#x20AC;&#x2122;aâ&#x20AC;&#x2122; >>> it.next() â&#x20AC;&#x2122;bâ&#x20AC;&#x2122; >>> it.next() â&#x20AC;&#x2122;câ&#x20AC;&#x2122; >>> it.next() Traceback (most recent call last): File "<pyshell#6>", line 1, in -toplevelit.next() StopIteration ½Ă&#x201A;Â&#x2DC;Â&#x2021;|ÂąSÂ&#x201C;ĂŹclass object ĂŠ{Ăź"­1__iter__() §Â&#x2C6;ÂŁÂ&#x2DC;Â&#x2021;object§ÚÂ&#x2021; ĂŠÂ&#x2013;|Âąnext() attribute "XJclass object knext Â?{§@o__iter__() Â?Â&#x152;Âą Â&#x2C6;ÂŁgC" ~f: #itertor1.py class Container: def __iter__(self): return TestIter(0,5) class TestIter: def __init__(self,start=0,end=10,step=1): self.start=start self.end = end self.step = step def next(self): if self.start == self.end: raise StopIteration try: return self.start finally: self.start = self.start + self.step if __name__ == "__main__": c = Container() for i in c: print i annCharles@tom.com

170Â?,208Â?

Python Ă&#x2020;S)P


§1.13 a $1(J: 0 1 2 3 4 try ... finally Â&#x160;Ê´Ă&#x2030;~?nÂ&#x160;ĂŠ" ĂšÂ&#x2021;~fÂĽ^Â&#x2C6;ÂŁÂ&#x2DC;Â&#x2021;#ĂŠÂ&#x2013;§TestIter(0,5) §ÚÂ&#x2021;ĂŠÂ&#x2013;|Âąnext() attribute " eÂĄĂšÂ&#x2021;~f¼§__iter__() Â&#x2C6;ÂŁĂŠÂ&#x2013;§ ĂŠÂ&#x2013;q|Âąnext() Â?{"Â&#x152;Âą Ă&#x201C;J" #itertor1.py class Container: def __iter__(self): self.index = 0 return self def next(self): if self.index == 5 : raise StopIteration try: return self.index finally: self.index = self.index + 1 if __name__ == "__main__": c = Container() for i in c: print i SÂ&#x201C;ĂŹÂ&#x160;^´ŠlH{Â&#x17D;{Ă&#x161;NÏêâ("kNÏêâ(´ÊE,§~X ä§Ă&#x153;êâ("H{Â&#x17D;{´þþ§Œ^SÂ&#x201C;ĂŹÂ&#x152;ÂąĂ&#x203A;ĂľÂ&#x17D;{[!§4ÂŚ^ ܹĂ&#x161;Â&#x2DC;/ÂŞN^"ڍÂ?{4§SLÂ&#x2C6;CĂŠ{'§Â&#x2DC;Â&#x2014;" \½Ă&#x201A;Â&#x2DC;Â&#x2021;LÂ&#x2C6;ä(Â&#x17E;ÿ§Â&#x152;¹½Ă&#x201A;Ă&#x2DC;Ă&#x201C;Â?{§Â&#x2C6;ÂŁĂ&#x2DC;Ă&#x201C;SÂ&#x201C;줢yĂ&#x2DC; Ă&#x201C;H{Â?ÂŞ" for node in tree.leftfirst(): print node for node in tree.rightfirst(): print node annCharles@tom.com

171Â?,208Â?

Python Ă&#x2020;S)P


Â&#x2DC; Python0 ´§Ă?~½Ă&#x201A;Â&#x2DC;Â&#x2021;SÂ&#x201C;ĂŹÂ&#x17E;ÿ§Ă&#x2018;Â&#x2021;ÂŚ^Â&#x2DC;Â&#x2021;CĂž5Âąc Â&#x2DC;§~XÞ¥~ fÂĽself.count self.index §Â&#x152;UÂ&#x201E;Â&#x2021;kÂ&#x2DC;Â&#x2021;Ă˝êâNϧÂ&#x152;Âą^self.index l ÂĽĂ˝k^ĂŠÂ&#x2013;§ Ă&#x2DC;´{Ăźself.index §Ă&#x201E;K^range ŸêĂ&#x2019;Â&#x152;Âą " XJ\Â&#x2021;SÂ&#x201C;Ï´Ê{ĂźÂ&#x17D;{§Â&#x201E;Â&#x2021;½Ă&#x201A;AOCÞ§self.index §AOÂź ĂŞself.next Ă&#x161;Ă&#x2018;Ă&#x2030;~raise StopIteration §ÚĂ&#x2019;ĂŠĂŚÂ&#x2020; §Ă?Â?\SÂ&#x201C;ĂŹÂ&#x17D;{ ´Xd{ߧĂ&#x2DC;Â&#x2013;uÂ&#x2039;Ă&#x201E;Z{§¤¹eÂĄĂšÂ&#x2021;Â?{AOk^§âÂ&#x160;)¤ÏGenerator" ~X: def gen(): yield 1 yield 2 yield 3 yield 4 g = gen() print g.next() print g.next() print g.next() print g.next() print g.next()

# # # # #

Â&#x2039;< 1 Â&#x2039;< 2 Â&#x2039;< 3 Â&#x2039;< 4 Ă&#x2018;Ă&#x2030;~

ÂŚ^yield Â&#x160;ĂŠÂ&#x152;ÂąMĂŻÂ&#x2DC;Â&#x2021;Generator"yield Â&#x160;ĂŠÂ?UĂ&#x2018;y3Ÿê¼"XJÂ&#x2DC;Â&#x2021;Âź ĂŞÂĽkyield Â&#x160;ʧ@oĂšÂ&#x2021;ŸêĂ&#x2019;Â&#x2030;generator "- yield Â&#x160;ĂŠÂ&#x192; §ŸêÂ&#x2C6;ÂŁÂ&#x2DC; Â&#x2021;iterator §¿Â&#x2026;P4v &E§PÂ&#x2030;¼ä:"|^Ăš &E§§SÂ&#x152;Âąl¼ä:?­# $1§ 3ÂŚ^iterator Â&#x17E;ÿ§XJN^next() Â?{§@oĂ&#x2019;ÂŹĂ&#x2019;l¼ä:?­#$1" XJgenerator ŸêÂ&#x2C6;ÂŁ §Ă&#x2019;gĂ&#x201E;Ă&#x2018;StopIteration Ă&#x2030;~" 3list comprehension Ă&#x2026;Â&#x203A;¼§¢SÂ?Â&#x152;Âą^SÂ&#x201C;ĂŹ"~X: >>> x = [ i*i for i in gen()] >>> x [1, 4, 9, 16] w,Â&#x2DC;Â&#x2021;~f: #generator1.py def reverse(data): for index in range(len(data)-1, -1, -1): yield data[index] annCharles@tom.com

172Â?,208Â?

Python Ă&#x2020;S)P


§1.13 a for char in reverse(â&#x20AC;&#x2122;golfâ&#x20AC;&#x2122;): print char $1(J´: f l o g 'Â&#x2026;3uyield Â&#x160;ʧŒÂżg´`§ 1. ff?\Ă&#x152;Â&#x201A;Â&#x17E;ÿ§Ă?ŠN^reverse()" 2. reverse() ÂĽÂ&#x2030;1yeild Â&#x160;ĂŠÂ&#x17E;ÿ§reverse() 6Ă&#x160;§Â&#x2C6;ÂŁÂ&#x2DC;Â&#x2021;êâÊÂ&#x2013;" 3.  for êâ§Â&#x2030;1for Ă&#x152;Â&#x201A;NSÂ&#x160;ʧ?1?nêâ" 4. Â&#x2DC;Ă&#x201C;Ă&#x152;Â&#x201A;(ĂĽÂ&#x192; §lyield 6Ă&#x160;/Â?§UYÂ&#x2030;1reverse() ÂĽÂ&#x160;ĂŠ"XJq yield Â&#x160;ʧ@o2Â&#x2030;¹ÞÜÂ&#x160;" 5. Â&#x2020;reserver()Â&#x2C6;£§for Â&#x160;Êâ~(ĂĽ" 3zgIÂ&#x2021;N^next Â&#x17E;ÿ§Ă&#x2019;Â&#x2C6;ÂŁyield Â&#x160;ĂŠ ÂĄLÂ&#x2C6;ª§§S6Ă&#x160;§, for ÂĽ Â&#x160;ĂŠUY$1§eg2IÂ&#x2021;next Â&#x17E;ÿ§UYlyield 6Ă&#x160;?§UY$1§Â&#x2020;yield #êâ §2UYÂ&#x2030;1" ڍLÂ&#x2C6;Â?ÂŞÂŹ3ŸêÂ&#x2C6;ÂŁÂ&#x17E;ĂżgĂ&#x201E;Ă&#x2018;StopIteration Ă&#x2030;~" Â? Â?[yield Â&#x160;ĂŠ^{§eÂĄ~fÂ&#x2030; Â&#x2DC; ?U§Â?´O\ Â&#x2DC; Â&#x2039;<Â&#x160; ʧ^u`²§SÂ&#x2030;1^S" #generator2.py def reverse(data): print "reverse begin" for index in range(len(data)-1, -1, -1): print "begin yieding " + str(index) yield data[index] print "end yieding " + str(index) print "reverse returned" for char in reverse(â&#x20AC;&#x2122;golfâ&#x20AC;&#x2122;): print "begin getting a char " print char print "end getting a char" annCharles@tom.com

173Â?,208Â?

Python Ă&#x2020;S)P


Â&#x2DC; Python0 $1(JÂľ reverse begin begin yieding 3 begin getting a char f end getting a char end yieding 3 begin yieding 2 begin getting a char l end getting a char end yieding 2 begin yieding 1 begin getting a char o end getting a char end yieding 1 begin yieding 0 begin getting a char g end getting a char end yieding 0 reverse returned XJ3for ÂĽ- break Â&#x160;ʧ@o§SĂ&#x2019;Ă&#x2DC;2ÂŁyield 6Ă&#x160;/Â?§ ´Â&#x2020;a Ă&#x2018;Ă&#x152;Â&#x201A;§Â&#x2030;1Ă&#x152;Â&#x201A; ÂĄÂ&#x160;ĂŠ "~X: #generator3.py def reverse(data): print "reverse begin" for index in range(len(data)-1, -1, -1): print "begin yieding " + str(index) yield data[index] print "end yieding " + str(index) print "reverse returned" for char in reverse(â&#x20AC;&#x2122;golfâ&#x20AC;&#x2122;): print "begin getting a char " annCharles@tom.com

174Â?,208Â?

Python Ă&#x2020;S)P


§1.13 a print char if char == â&#x20AC;&#x2122;lâ&#x20AC;&#x2122; : break print "end getting a char" $1(J: reverse begin begin yieding begin getting f end getting a end yieding 3 begin yieding begin getting l

3 a char char 2 a char

§1.13.11 new style class new style class ´Python 2.2 #JĂ&#x2018;ĂľU"Ă?dÂ&#x192;ĂŠunew style class §Þ¥0 class object §Â&#x2030;classic class " XJÂ&#x2DC;Â&#x2021;class object yk´â&#x20AC;&#x153;objectâ&#x20AC;? §@oĂšÂ&#x2021;class object Ă&#x2019;´new style class " â&#x20AC;&#x153;objectâ&#x20AC;? ´Â&#x2DC;Â&#x2021;class object Âśi"Â?Ă&#x2019;´`§XJÂ&#x2DC;Â&#x2021;class object Â&#x2020;U½Üm UÂŤâ&#x20AC;&#x153;objectâ&#x20AC;? §@oĂ&#x2019;´new style class " Â&#x2020;UÂŤnew style class ~X: class newClass(object) mUÂŤ~fX: class newClass(dict) "Ă&#x2122;§Xint, float, list, dict, tuple, file  §Ă&#x2018;´â&#x20AC;&#x153;objectâ&#x20AC;? fa" new style class äkclassic class ¤kA5" kÂĄX­0 new style class Ă&#x161;classic class Ă&#x2DC;Ă&#x201C;Â&#x192;?" O\ ĂźÂ&#x2021;#methord Ă&#x2026;Â&#x203A; static methord weÂĄ~f" class AClass(object): def astatic( ): print â&#x20AC;&#x2122;a static methodâ&#x20AC;&#x2122; astatic = staticmethod(astatic) anInstance = AClass( ) AClass.astatic( ) # prints: a static method anInstance.astatic( ) # prints: a static method annCharles@tom.com

175Â?,208Â?

Python Ă&#x2020;S)P


Â&#x2DC; Python0 3½Ă&#x201A;Ÿê

§Œ^Â&#x160;ĂŠ

astatic = staticmethod(astatic) Â&#x152;ÂąMĂŻÂ&#x2DC;Â&#x2021;static methord " class instance Ă&#x161;class object Ă&#x2018;Â&#x152;ÂąN^static methord §JÂ&#x2DC;" static methord Ă&#x161;Ă&#x160;Ă?function AvkÂŤO" class methord weÂĄ~f" class ABase(object): def aclassmet(cls): print â&#x20AC;&#x2122;a class method aclassmet = classmethod(aclassmet) class ADeriv(ABase): pass bInstance = ABase( ) dInstance = ADeriv( ) ABase.aclassmet( ) # prints: a bInstance.aclassmet( ) # prints: a ADeriv.aclassmet( ) # prints: a dInstance.aclassmet( ) # prints: a

forâ&#x20AC;&#x2122;, cls._ _name_ _

class class class class

method method method method

for for for for

ABase ABase ADeriv ADeriv

`²: class methord Ă&#x161;bound methord aq"bound methord ´gĂ&#x201E;rclass instance Â&#x160;Â?1Â&#x2DC;Â&#x2021;ĂŤĂŞ"class methord ´gĂ&#x201E;rclass object Â&#x160;Â?1Â&#x2DC;Â&#x2021;ꐤ Ă&#x2DC;´class instance " Ă&#x192;Ă&#x2DC;´clsInstance.class_methord /ª§Â&#x201E;´clsObject.class_methord / ª§JÂ&#x2DC;" O\ #AĂ?Ÿê new __init__ ´Ă?ŠzŸê§Ă&#x2DC;´EŸê"3N^__init__ ŸêÂ&#x17E;ÿ§ÊÂ&#x2013;ÂŽ ²MĂŻĂ? "#O__new__ Ÿê§´ýEŸê" clsInstance = clsObject(...) du clsInstance = clsObject.__new__(clsObject,...) 5Âż§__new__ 1Â&#x2DC;Â&#x2021;ĂŤĂŞĂ&#x2DC;´Â&#x2DC;Â&#x2021;class instance § ´Â&#x2DC;Â&#x2021;class object "ÂŚ% @Ă&#x2019;´Â&#x2DC;Â&#x2021;Â&#x2DC;Â&#x2021;class methord §Ă&#x2DC;^ÂŚ^ annCharles@tom.com

176Â?,208Â?

Python Ă&#x2020;S)P


§1.13 a __new__ = staticmethod(__new__) 5AO(²Œ´Â&#x2DC;Â&#x2021;class methord " object.__new__ %@Ă&#x201E;Â&#x160;´MĂŻÂ&#x2DC;Â&#x2021;ĂŠÂ&#x2013;§, instance "

N^__init__ §Â&#x2C6;ÂŁÂ&#x2DC;Â&#x2021;class

­1__new__ Â&#x17E;ÿ§~~N^Ia(Xobject, list, tuple, dict, file ) __new__ Ÿê§, §2Â&#x160;Ă&#x2122;ÂŚ\Â&#x2021;ZÂŻÂ&#x153;" Â&#x2DC;Â&#x2021;;.~fĂ&#x2019;´Â&#x2C6;ÂŁÂ&#x2DC;Â&#x2021;Ž²3ĂŠÂ&#x2013;§¢ySingleton design pattern "~ fÂľ class Singleton(object): _singletons = { } def _ _new_ _(cls, *args, **kwds): if not cls._singletons.has_key(cls): cls._singletons[cls] = object._ _new_ _(cls) return cls._singletons[cls] ĂšÂ&#x2021;~f¼§Singleton zÂ&#x2DC;Â&#x2021;fÂ&#x161;a§Â?UkÂ&#x2DC;Â&#x2021;ĂŠÂ&#x2013;§Â?Ă&#x2019;´`§XJclsobj1, clsobj2, ..., clsobjn , Ă&#x2018;´Singleton fÂ&#x161;"@oclsobj1 ¤kclass instance Ă&#x2018;´ Ă&#x201C;Â&#x2DC;Â&#x2021;object §clsobj2 ¤kclass instance Ă&#x2018;´Ă&#x201C;Â&#x2DC;Â&#x2021;object §... §clsobjn ¤ kclass instance Ă&#x2018;´Ă&#x201C;Â&#x2DC;Â&#x2021;object "Ă&#x2DC;Ă&#x201C;fÂ&#x161;§Xclsobj1, Ă&#x161;clsobj2 class instance Ă&#x2DC;´Ă&#x201C;Â&#x2DC;Â&#x2021;object " getattribute __getattr__ ĂšÂ&#x2021;AĂ?Ÿê3attribute |¢Â&#x17D;{¼§´ Â&#x2DC;'" #O__getattribute__ ´1Â&#x2DC;'§Â?Ă&#x2019;´Œ:¤kattribute Ă&#x161;^Â&#x17E;ÂŚ" new style class class instance A5 property attrib = property(fget=None, fset=None, fdel=None, doc=None) Â&#x152;ÂąÂ?Â&#x2DC;Â&#x2021;new style class instance O\Â&#x2DC;Â&#x2021;attribute §Â&#x2030;attr " fget ´Ă&#x2013;property Â&#x17E;ÿ§N^bound methord "Ă&#x2DC;Ă&#x201A;ĂŤĂŞ"None LÂŤproperty Ă&#x2DC;Â&#x152;Ă&#x2013;"fset ´property Â&#x17E;ÿ§N^bound methord "Ă&#x201A;Â&#x2DC;Â&#x2021;ꐤLÂŤ \Â&#x;o"None LÂŤproperty Ă&#x2DC;Â&#x152;"fdel ´íĂ&#x2DC;property Â&#x17E;ÿ§Â?Ă&#x2019;´N^del obj.attr Â&#x160;ĂŠÂ&#x17E;ÿ§N^bound methord "Ă&#x2DC;Ă&#x201A;ĂŤĂŞ"None LÂŤproperty Ă&#x2DC; Â&#x152;Ă­"doc LÂŤdoc string " ~f: annCharles@tom.com

177Â?,208Â?

Python Ă&#x2020;S)P


Â&#x2DC; Python0 class Circle (object): def _ _init_ _(self,radius): self.radius = radius def getArea(self): return self.radius * self.radius * math.pi def setArea(self,value): self.radius = math.sqrt((value/math.pi)) area = property(getArea,setArea,doc=â&#x20AC;&#x2122;area of the circle â&#x20AC;&#x2122;) ĂšÂ&#x2021;~f¼§XJc ´Â&#x2DC;Â&#x2021;Circle Â&#x2DC;Â&#x2021;class intance "@o print c.area # N^ c.getArea c.area = 100 # N^ c.setArea(100) print c.area.__doc__ # Â&#x2039;< area of the circle " __slots__ ´Â&#x2DC;Â&#x2021;sequence (Â&#x2DC;Â&#x201E;´tuple )§Ă&#x2122;ÂĽzÂ&#x2DC;Â&#x2021;Â&#x192;´Â&#x2DC;Â&#x2021;string "Ú´Â&#x2DC;Â&#x2021; JpĂ&#x2021;Â?{"Ă?Â?object name space ´Â&#x2DC;Â&#x2021;dictionary §´Ă&#x201E;Â&#x17E;Ă&#x161;ÂşÂ&#x2DC; S§ÚĂ&#x2021;$"k __slots__ Â&#x192; §object name space Ă&#x2019;´Â&#x2DC;Â&#x2021;½S Â&#x152;§Ă&#x201C;Â&#x17E;§object Â?Ă&#x2DC;k__dict__ 5LÂŤname space " object #ĂŻattribute Âśi7L´__slots__ ÂĽÂśi" ½Ă&#x201A;__slots__ Ă&#x2DC;u½Ă&#x201A;attributes , Â&#x201E;Â&#x2021;MĂŻÂ&#x192;

âU^"

~f: slots â&#x20AC;&#x201D; >>> class OptimizedRectangle(object): ... __slots__= â&#x20AC;&#x2122;widthâ&#x20AC;&#x2122;,â&#x20AC;&#x2122;heigthâ&#x20AC;&#x2122; ... >>> r = OptimizedRectangle() >>> r.width # ½Ă&#x201A; __slots__ Ă&#x2DC;u½Ă&#x201A; attribute Traceback (most recent call last): File "<stdin>", line 1, in ? AttributeError: width >>> r.width,r.heigth=1,2 >>> print r.width,r.heigth 1 2 >>> r.high = 100 Traceback (most recent call last): File "<stdin>", line 1, in ? AttributeError: â&#x20AC;&#x2122;OptimizedRectangleâ&#x20AC;&#x2122; object has no attribute â&#x20AC;&#x2122;highâ&#x20AC;&#x2122; annCharles@tom.com

178Â?,208Â?

Python Ă&#x2020;S)P


§1.13 a ĂšÂ&#x2021;~f¼§MĂŻhigh ´Ă&#x2DC;#N" __slots__ Ă&#x2021;pĂ&#x2026;Â&#x203A;§´¹ã+Ă&#x201E;MĂŻattribute A5Â?Â&#x201C;d" Â?k3SÂĽĂ&#x201C;Â&#x17E;Â&#x152;Ăž3Ăšclass instance Â&#x17E;ÿ§Â&#x152;Þ´Â?AzÚêÞ ?§ Ă&#x2DC;´AZÂ&#x2021;ÚêÞ?§ Â&#x2026;zÂ&#x2DC;Â&#x2021;instance Â&#x2021;!Â&#x17D;AÂ&#x203A;Â&#x2021;i!§ÚJp Ă&#x2021;J²w"Ă&#x201E;KĂ&#x2019;vk7Â&#x2021; " new style class ÂĽPer-instance methords Â&#x2DC;Â&#x2021;class object Â&#x2DC;Â&#x2021;class instance Â&#x152;Âą Â&#x201D;½Â&#x2DC;Â&#x2021;attribute ?ÂżÂ&#x2DC;Â&#x2021;function object " ~X: >>> ... ... >>> >>> >>> >>> 100

class AClass: pass a = AClass() fakeGetItem=lambda idx:idx a.__getitem__=fakeGetItem a[100]

ĂšÂ&#x2021;~f¼§a Â&#x152;ÂąrAĂ?Ÿê__getitem__ §Â&#x201D;½?ÂżÂ&#x2DC;Â&#x2021;ŸêÞ§´Ú Â&#x17E;§a.__getitem__ Ă&#x2DC;´Â&#x2DC;Â&#x2021;bound methord § ´Â&#x2DC;Â&#x2021;Ă&#x160;Ă?Ÿê§Â?Ă&#x2019;´`§ŒĂ&#x2DC; UgĂ&#x201E;rclass instance Â&#x160;Â?1Â&#x2DC;Â&#x2021;ĂŤĂŞ" new style class Ă&#x161;classic class 3?nĂ&#x161;­1ĂśÂ&#x160;Ă&#x17D;Â&#x192;'N^AĂ?Ÿêk¤Ă&#x2DC;Ă&#x201C;" new style class ´k3class instance ¤åclass object name space ÂĽ|¢AĂ?Âź ê§ Ă&#x2DC;ÂŹ3class instance name space |¢" classic class Â&#x201E;´UĂŹ5|¢Â&#x17D;{§vkÂ&#x;oAĂ??n§Ă&#x2019;Â&#x201D;ĂžÂ&#x2DC;Â&#x2021;~f" ~X: >>> class NewStyleClass(object): ... pass ... >>> a = NewStyleClass() >>> a.__getitem__=fakeGetItem >>> a[100] Traceback (most recent call last): annCharles@tom.com

179Â?,208Â?

Python Ă&#x2020;S)P


Â&#x2DC; Python0 File "<stdin>", line 1, in ? TypeError: unindexable object >>> a.__getitem__(100) 100 Â&#x152;Âąw§ÜÂ&#x160;Ă&#x17D;­1Â&#x17E;ÿ§new style class ==ÂŹ3class object ÂĽ|¢AĂ? Âź ĂŞ "  ´ § X J Ă&#x2DC; ´ Ă? Â? Ăś Â&#x160; Ă&#x17D; ­ 1 § Â&#x2020;  N ^__getitem__ § Â&#x201E; ´ Ă&#x161; Ă&#x2122; ÂŚattribute |¢Â&#x17D;{Â&#x2DC;Â&#x2014;" new style class Ăľ ­UÂŤ  Â&#x203A; list, dict, file ĂŠÂ&#x2013;ÂĄÂ?SÂ&#x2DC;ĂŠÂ&#x2013;"ÂŚÂ&#x201A;UÂŤÂ&#x2020;¤ knew style class Ă&#x201E;aâ&#x20AC;&#x153;objectâ&#x20AC;?§3þ­U¼§ þÂ?UĂ&#x201C;Â&#x17E;UÂŤÂ&#x2DC;Â&#x2021;SÂ&#x2DC;ĂŠÂ&#x2013;Ă&#x161; Â&#x2DC;Â&#x2021;â&#x20AC;&#x153;objectâ&#x20AC;? " new style class Ă&#x161; classic class  methord |¢ ^ SĂ&#x2DC; Ă&#x201C; classic UĂŹattribute | ¢Â&#x17D;{§|¢Â&#x2DC;Â&#x2021;methord "~X: class D: pass class B(D): pass class C(D): pass class A(B,C): pass UĂŹ|¢Â&#x17D;{§classic class |¢^S´A, B, D, C, D " class D(object): pass class B(D): pass class C(D): pass class A(B,C): pass new style class |¢^S´A,B,C,D,object "Â?Ă&#x2019;´2Ă?`k|¢" new style class Ă&#x161; classic class N ^Ia Â?{Ă&#x2DC;Ă&#x201C; classic class ÂĽN^IaÂ?{§ Â&#x2DC;Â&#x201E;ÂŚ^unbound methord "~X: annCharles@tom.com

180Â?,208Â?

Python Ă&#x2020;S)P


§1.13 a class A: def met(self): print â&#x20AC;&#x2122;A.metâ&#x20AC;&#x2122; class B(A): def met(self): print â&#x20AC;&#x2122;B.metâ&#x20AC;&#x2122; A.met(self) class C(A): def met(self): print â&#x20AC;&#x2122;C.metâ&#x20AC;&#x2122; A.met(self) class D(B,C): def met(self): print â&#x20AC;&#x2122;D.metâ&#x20AC;&#x2122; B.met(self) x=D() x.met() 3ĂšÂ&#x2021;~f¼§B.met(self), C.met(self) Ă&#x2019;´unbound methord ^{"´¯K ´§ÚA.met Ă&#x2019;ÂŹN^Ăźg" $1(J´: D.met B.met A.met C.met A.met new style class )ĂťÂ?{Ă&#x2019;´§Œ^super "super(clsobj,obj) ÂŹÂ&#x2C6;ÂŁÂ&#x2DC;Â&#x2021;AĂ? clsobj Ia"¡Â&#x201A;^ super(clsobj,obj).somemethord(...) |¢somemethord Â&#x17E;ÿ§|¢^SĂ&#x161;Þ¥Ú|¢^S´Â&#x2DC;" ~X: class A(object): def met(self): annCharles@tom.com

181Â?,208Â?

Python Ă&#x2020;S)P


Â&#x2DC; Python0 print â&#x20AC;&#x2122;A.metâ&#x20AC;&#x2122; class B(A): def met(self): print â&#x20AC;&#x2122;B.metâ&#x20AC;&#x2122; super(B,self).met( class C(A): def met(self): print â&#x20AC;&#x2122;C.metâ&#x20AC;&#x2122; super(C,self).met( class D(B,C): def met(self): print â&#x20AC;&#x2122;D.metâ&#x20AC;&#x2122; super(D,self).met( x=D() x.met()

)

)

)

$1(J´¾ D.met B.met C.met A.met 3ĂšÂ&#x2021;~f¼§super(D,self).met() |¢met ^S´B,C,A "Ăš§Ă&#x2019;vkĂš Â&#x2021;ÂŻK "ĂŻĂ&#x2020;Âą new style class Ă&#x2018;^ڍÂ?{N^Iamethord "

§1.14 Ă&#x2030;~?n(exception) §1.14.1 Â&#x;o´Ă&#x2030;~?n§Â?Â&#x;oÂ&#x2021;kĂ&#x2030;~?n Ă&#x2030;~?n´Â&#x2DC;ÂŤĂ&#x2018;Â&#x2020;?nĂ&#x2026;Â&#x203A;"Â&#x2DC;½Â&#x2021;ĂŠĂ&#x2018;Â&#x2020;?nÂ&#x2030;upĂ?­Ă&#x20AC;§Â&#x2DC;Â&#x2021;rFS §S Â&#x201C;輧¿á Ă&#x2018;Â&#x2020;?n§XJĂ&#x2DC;Â&#x2021;Ă&#x2018;Â&#x2020;?n§@o Â&#x201C;è5ÂŹĂŠĂľ"\Â&#x152; ¹ÊÂ&#x2DC;Â&#x2021;Â&#x2018;8~f§wwpÂĄkĂľÂ&#x152;'~ Â&#x201C;è´Ă&#x2018;Â&#x2020;?n§Â&#x201E;kĂľÂ&#x152;'~´NĂ Â&#x201C; è"\Â&#x152;UÂŹuyĂ˝ZšÂ&#x201C;èĂ&#x201C;ĂŠ'~"Ă&#x2019;Â&#x17D;Â&#x2DC;Â&#x2021;~$1§S§ŒÂ&#x152;Ă&#x153;ŠÂ&#x17E; m$1Â&#x201C;èÂ?´\¤Â&#x201C;è¼4Â&#x2DC;Ă&#x153;Š"´Ă&#x2DC;UvkĂš Â&#x201C;觌Â&#x201A;Ă&#x2019;Â&#x2013;Â&#x17E;Â&#x201C;

§²Â&#x17E;ÂżvklÂŻ)ĂłÂ&#x160;§vkMEdÂ&#x160;§´Ă&#x2DC;UvkÂŚÂ&#x201A;§?Ă&#x203A;<Ă&#x2018;Â&#x17E;Â&#x201C;è

­Â&#x2021;5"C ÂĽÂ&#x2020;Ă&#x2DC;?nÂ?{´ int fun1() annCharles@tom.com

182Â?,208Â?

Python Ă&#x2020;S)P


§1.14 Ă&#x2030;~?n(exception) { ... if ( open(...) == -1 ){ return -1; } ... } int fun2() { ... if (fun1()==-1){ return -1; } ... } int main() { ... if(fun2()==-1){ return -1; } } lĂšÂ&#x2021;~f¼§¡Â&#x201A;Â&#x152;ÂąwCÂ&#x160;ĂłĂ&#x2018;Â&#x2020;?nkÂ&#x2021;ÂąeAÂ&#x2021;A:Âľ â&#x20AC;˘ §SzÂ&#x2DC;?Ă&#x2018;Â&#x2021;Â&#x2030;Ă&#x2018;Â&#x2020;?n§^5rÂ&#x2020;Ă&#x2DC;Ă?ĂžÂ&#x2DC;?Ÿê" Ă?Â?. ŸêĂ&#x2DC;ATNo?nÂ&#x2020;Ă&#x2DC;§Â?kŸêN^ܧÂ?Ă&#x2019;´ÞÂ&#x2DC;?ŸêâU §¤¹7LĂšÂ&#x2DC;?Â&#x2DC;?Ăž" ĂšÂ&#x2018;5ÂŻK´§?Ă&#x2018;´äĂ&#x2018;Â&#x2020;§Â&#x201C;èÂ&#x152;Ă&#x153;ŠĂ&#x2018;´Ă&#x2018;Â&#x2020;?n" â&#x20AC;˘ §SĂ?LÂ&#x2C6;ÂŁÂ&#x160;5LÂŤÂ&#x2020;Ă&#x2DC;" ĂšÂ&#x2018;5ÂŻK§Â&#x2C6;ÂŁÂ&#x160;kĂ&#x153;Ă&#x201A;"Â&#x2C6;ÂŁÂ&#x160;Ă&#x2DC;Â&#x2021;Â&#x2C6;ÂŁ~§SÂ&#x17D;Â&#x2021;êâ§Â&#x201E;Â&#x2021;Â&#x2C6; ÂŁÂ&#x2020;Ă&#x2DC;G§Ú§§Sâ&#x20AC;&#x153;kÂ&#x152;Uâ&#x20AC;?ÂŹrÂ&#x2020;Ă&#x2DC;G¤Â&#x2C6;ÂŁêâ5?n"~X: unsigned int r; r=read(fd,buffer,len_of_buffer); for(i=0;i<r;i++){ // do something } annCharles@tom.com

183Â?,208Â?

Python Ă&#x2020;S)P


Â&#x2DC; Python0 Úã§S§´Ê²wkÂŻK§XJread Ă&#x2018;Â&#x2020;§Â&#x2C6;ÂŁâ&#x2C6;&#x2019;1 ´§Svkä§for ¤Â?kĂ&#x152;Â&#x201A;",§Â&#x2DC;Â&#x201E;Ă&#x2DC;ÂŹĂ&#x2018;ĂšDÂ&#x201C;è§Êr DÂ&#x160;Â?ÂŹk?Ă&#x2C6;´w§a. Ă&#x2DC;Â&#x161;"´ÚÂ&#x2021;Â&#x201C;è`² \â&#x20AC;&#x153;kÂ&#x152;Uâ&#x20AC;?Ă&#x2018;ĂšÂ&#x201C;è§cĂ&#x2122;´§S'Â&#x152;Â&#x17E; ÿ§\Â&#x152;Uk?U ,Â&#x2021;ŸêÂ&#x2C6;ÂŁÂ&#x160;ÂŻk½"@o¤kŸêN^ĂśĂ&#x2018;kÂ&#x152;U Ă&#x2018;yÚ¯K" â&#x20AC;˘ Ă&#x2018;Â&#x2020;&E"Ă?Â?Â&#x2C6;ÂŁÂ&#x160;oĂŞÂ&#x2026;§¤¹Ă&#x2DC;U Â&#x2018;Â?ĂľĂ&#x2018;Â&#x2020;&E"~XXĂ&#x161;N ^read Â&#x2C6;ÂŁâ&#x2C6;&#x2019;1LÂŤĂ&#x2018;Â&#x2020;§Â&#x201E;Â&#x2021;errno 5LÂŤĂ&#x2018;Â&#x2020;è§Â&#x201E;IÂ&#x2021;Ă&#x2122;ÂŚŸêrĂ&#x2018;Â&#x2020;èC ¤Â&#x2020;Ă&#x2DC;&EŠiÂŁĂŁ" exceptionĂ&#x2026;Â&#x203A;´-Â&#x2DC;ÂŤĂ&#x2018;Â&#x2020;?nÂ?ª§ŒkÂąeA:: â&#x20AC;˘ Ă&#x161;return Â&#x2DC;§Ă&#x2018;Ă&#x2030;~Ă&#x201C;ŒŸêÂ&#x2C6;ÂŁ" â&#x20AC;˘ Ă&#x161;return Â?kÂŤO§XJreturn§ŸêN^܏Â&#x2C6;ÂŁÂ&#x160;§XJu)Ă&#x2030;~§Ÿ ĂŞN^ĂśĂ&#x2DC;ÂŹÂ&#x2C6;ÂŁÂ&#x160;" â&#x20AC;˘ gĂ&#x201E;|ÂąÂ&#x2020;Ă&#x2DC;Ăž"Ă&#x2030;~ÂŹ3ĂŚĂ&#x2019;ÂĽÂ&#x2022;Ăžk§Â&#x2020;k<Ă&#x201C;٤XJ,Â&#x2021;ŸêĂ&#x2018;

Ă&#x2030;~§ ŸêN^Ăśqvk?nĂ&#x2030;~(Ă&#x201C;ÂźĂ&#x2030;~)§@oĂ&#x2019;Â&#x2013;3ŸêN^?u)Ă&#x2030; ~Â&#x2DC;§ŸêN^ĂśÂ?ÂŹÂ&#x2C6;ÂŁ" â&#x20AC;˘ òĂ&#x2018;Â&#x2020;?nĂ&#x161;Â&#x2C6;ÂŁÂ&#x160;ĂľUŠm"Â?Â&#x2021;Â&#x2C6;ÂŁÂ&#x160;§@oÂŚĂ&#x2019;´§SÂ&#x17D;Â&#x2021;êâ§Ă&#x2DC; ÂŹkĂ&#x2122;ÂŚÂżg" ~X: def fun1() ... open file ... def fun2() ... fun1() ... def main() try : fun2() except exp : print "error message" return.

§1.14.2 Ă&#x201C;Âźexception(Ă&#x2030;~) kߍĂ&#x201C;ÂźĂ&#x2030;~Â?{"1Â&#x2DC;´ annCharles@tom.com

184Â?,208Â?

Python Ă&#x2020;S)P


§1.14 Ă&#x2030;~?n(exception) try : ... # statements 1 except ExceptionType : ... # statements 2 ÂŁĂŁXe: â&#x20AC;˘ Ă&#x201E;kÂ&#x2030;1statement 1§XJvkexception u)§@oĂ&#x2019;Â&#x2DC;Â&#x192;~§Ă&#x2019;Â&#x201D;vktry Â&#x160;ĂŠ Â&#x2DC;§UYÂ&#x2030;1 ÂĄÂ&#x160;ĂŠ" â&#x20AC;˘ X J u ) exception § @ o Ă&#x2019; rexception  a . Ă&#x161;except Â&#x160; ĂŠ ÂĄ ExceptionType '§wexception a.´Ă&#x201E;Ă&#x161;ExceptioinType Â&#x2DC;Â&#x2014;§ â&#x20AC;˘ XJÂ&#x2DC;Â&#x2014;§Ă&#x2019;Â&#x2030;1statement 2" â&#x20AC;˘ XJĂ&#x2DC;Â&#x2DC;Â&#x2014;Ă&#x2019;Â&#x2022;Â&#x2020;Â&#x2C6;£§rexception Â&#x2030;ŸêN^ܧ, Ă&#x2019;ĂšÂ&#x2DC;?Â&#x2DC;?Â&#x2022; Ăž§Â&#x2020;ktry Â&#x160;ĂŠĂ&#x201C;Âź exception" â&#x20AC;˘ evk?Ă&#x203A;try Â&#x160;ĂŠÂ&#x152;ÂąĂ&#x201C;٤@o§SĂ&#x2019;Ă&#x2030;~òĂ&#x2018;§3)ºÏ¼Â&#x2030;1{§Ă&#x2019;ÂŹÂ&#x201D; Âąc~fÂ&#x2DC;§Â&#x2039;<Ă&#x2018;5Ă&#x2030;~u)Â?[&E"Â&#x152;Âą^1/0 wÂ&#x2DC;e)0Ă&#x2DC;Ă&#x2030; ~" Â&#x152;Â&#x201E;§exception ´,Â&#x2DC;Ÿêreturn Â?ª§CÂ&#x160;ó½ÜĂ&#x2122;ÂŚvkexception Ă&#x2026;Â&#x203A;Â&#x160;ó§ ŸêÂ?kĂ?LÂ&#x2C6;ÂŁÂ&#x160;5Â?²ŸêĂ&#x2018;Â&#x2020;§¤¹zÂ&#x2DC;?ŸêĂ&#x2018;Â&#x2021;uŸêÂ&#x2C6;ÂŁÂ&#x160;"exception Ă&#x2026;Â&#x203A;Ă&#x2019;´JøĂ&#x2DC; Â&#x2C6;ÂŁÂ&#x160;Â&#x192; ,Â&#x2DC;ÂŤĂ&#x2018;Â&#x2020;?nÂ?{"ڍÂ?{|ÂąÂ&#x2020;Ă&#x2DC;Â&#x2022;Ăžk§ XJ,Â&#x2DC;?ŸêĂ&#x2DC;TNo?nÂ&#x2020;Ă&#x2DC;§@oĂ&#x2019;Ă&#x2DC;?n§3Â&#x2030;Â?ĂžÂ&#x2DC;?Ÿê?n"cĂ&#x2122; ´lib ÂĽmodule §ŒÂ&#x201A;Ă&#x2018;Â&#x2020;?nÂ&#x152;þêĂ&#x2018;Ă&#x2018;exception "Â&#x2DC;Â&#x2021;try Â&#x152;ÂąkĂľÂ&#x2021;except Â&#x160;ĂŠ" try : ... # statements 1 except (ExceptionType1,ExceptionType2) : ... # statements 2 except (ExceptionType3,ExceptionType4) : ... # statements 3 except: ... # statements 4  Â&#x2DC;Â&#x2021;exceptvkÂ?½exception a.§LÂŤĂ&#x201C;Âź?Ă&#x203A;a.exception"try Â&#x160;ĂŠÂ&#x152;Âą kÂ&#x2DC;Â&#x2021;else Â&#x160;ʧÂ&#x2DC;½Â&#x2DC;3 §LÂŤvku)exception Â&#x17E;ĂżÂ&#x2030;1else Â&#x2018;Â&#x2DC; Â&#x160; ĂŠ"~X: try: f = open("/home/chunywang/tmp/test.py","r") annCharles@tom.com

185Â?,208Â?

Python Ă&#x2020;S)P


Â&#x2DC; Python0 except IOError: print "can not open file" else: for i in f.readlines(): print i LÂŤXJÂ&#x2039;mŠÂ&#x2021;¤þ§Â?Ă&#x2019;´`§Â&#x2039;mŠÂ&#x2021;Â&#x17E;Ăżvku)Ă&#x2030;~Ă&#x2019;Ă&#x2013;ŠÂ&#x2021;"Ă?L'Âąe AÂ&#x2021;~f§Â&#x152;¹ÚÂ&#x2030;Ă??" try: f = open("/home/chunywang/tmp/test.py","r") for i in f.readlines(): print i except IOError: print "can not open file" ĂšÂ&#x2021;~frĂŠĂľÂ&#x160;ĂŠĂ&#x2018;Â&#x2DC;3try ¼§ÚÂ&#x2030;{§Â&#x2018;5ÂŻK§XJĂ&#x2018;y IOError§Â?Ă&#x2DC; Â&#x2DC;½´open Â&#x17E;Ăż)§readlines() Â?Â&#x152;Âą)ĂšÂ&#x2021;exception"¤¹Ă&#x2DC;Â&#x2021;rĂŠĂľÂ&#x160;ĂŠ Â&#x2DC;3try ¼§Ă?Â?ÂŚÂ&#x201A;ÂĽk Â?ÂŹ)exception§ Ăš exception ÂżĂ&#x2DC;´\Â&#x17D;Â&#x2021;§3 ~f¼§exceptÂ?Â&#x17D;Â&#x2021;Â&#x2039;mŠÂ&#x2021;Ă&#x2018;Â&#x2020;exception§ Ă&#x2DC;´Ă&#x2013;ŠÂ&#x2021;Ă&#x2018;Â&#x2020;"XJÂ&#x2021;?nĂ&#x2013;ŠÂ&#x2021; Ă&#x2018;Â&#x2020;"Â&#x152;Âą try: try: f = open("/home/chunywang/tmp/test.py","r") except IOError: print "can not open file" else: for i in f.readlines(): print i except IOError: print "read faid" $Â&#x2013;Ă&#x2019;Â&#x201D;5~fÂ&#x2DC;§Ă&#x2DC;Â&#x2030;?Ă&#x203A;?n§4ĂžÂ&#x2DC;?Ÿê?n"½Ü: try: f = open("/home/chunywang/tmp/test.py","r") except IOError: print "can not open file" else: try: for i in f.readlines(): print i except IOError: print "read faid" annCharles@tom.com

186Â?,208Â?

Python Ă&#x2020;S)P


§1.14 Ă&#x2030;~?n(exception) ,Â&#x2DC;Â&#x2021;'~f´ try: f = open("/home/chunywang/tmp/test.py","r") except IOError: print "can not open file" return None for i in f.readlines(): print i ڍÂ?{¼§XJĂ&#x2DC;\return Â&#x160;ʧ@o3ŠÂ&#x2021;Â&#x2039;mÂ&#x201D;}Â&#x17E;ÿ§readlines Â&#x201E;ÂŹÂ&#x2030;1§ Ăšw,´Ă&#x2DC;1§Ă&#x2013;Â&#x2DC;Â&#x2021;vkÂ&#x2039;mŠÂ&#x2021;§´Êä§gCÂ&#x2030;gCĂŠĂŚÂ&#x2020;"´return Â&#x160; ĂŠÂ? Â&#x203A;§Ă?Â?ŸêÂ&#x2020;Â&#x2C6;ÂŁ §Â?N\ÂżĂ&#x2DC;Â&#x17D;ĂšoZ"Ă&#x17E;Â&#x2021;~f§bÚãÂ&#x160;Ê´^5l Â&#x2DC;ŠÂ&#x2021;ÂĽĂ&#x2013;Â&#x2DC; XĂ&#x161;ꐤXJÂ&#x2039;Ă&#x2DC;mÂ&#x2DC;ŠÂ&#x2021;§Ă&#x2019;Â&#x2DC;Â?"Â&#x17D;Â&#x160;", 2Â&#x160;Ă&#x2122;ÂŚĂś Â&#x160;" Ă?^eÂĄÂ?Y" try: f = open (" Â&#x2DC;ŠÂ&#x2021;") except IOError: Â&#x2DC;"Â&#x17D;Â&#x160; else : lŠÂ&#x2021;ÂĽĂ&#x2013;XĂ&#x161;ĂŤĂŞ #y3XĂ&#x161;Íê´k

Â&#x160;Ă&#x2122;ÂŚĂśÂ&#x160; XJĂ&#x2DC;^else Â?{§Â&#x201E;kÂ&#x2DC;Â&#x2021;Â?Y´ isOpen=false try: f = open (" Â&#x2DC;ŠÂ&#x2021;") isOpen=true except IOError: isOpen=false if isOpen : lŠÂ&#x2021;ÂĽĂ&#x2013;XĂ&#x161;ĂŤĂŞ else: Â&#x2DC;"Â&#x17D;Â&#x160; #y3XĂ&#x161;Íê´k

Â&#x160;Ă&#x2122;ÂŚĂśÂ&#x160; ڍÂ?{O\ Â&#x2DC;Â&#x2021;#CÞ§Ă&#x161;else Â&#x160;ĂŠ'§Ă&#x2019;vk@oÂ&#x2DC;Ă&#x; "1ÂŤĂ&#x2030;~?n Â?{´ annCharles@tom.com

187Â?,208Â?

Python Ă&#x2020;S)P


Â&#x2DC; Python0 try: ... # statements 1 finally: ... # statements 2 ڍÂ?ÂŞĂ&#x2DC;UĂ&#x161;1Â&#x2DC;ÂŤÂ?ª¡^§Â?Ă&#x2019;´`§Ă&#x2DC;UÂ&#x2018;kexcept Ă&#x161;else § Ă?r§w¤ ,Â&#x2DC;ÂŤÂ&#x160;ĂŠ"Ă&#x192;Ă&#x2DC;´Ă&#x201E;u)exception §Â&#x201E;´return Â&#x160;ĂŠÂ&#x2C6;£§finallyfĂŠstatements 2 Ă&#x2018;ÂŹÂ&#x2030;1§ >>> def fun(): ... try: ... print "ok" ... return 1 ... finally: ... print "clean up" ... return 1 ... >>> fun() ok clean up 1 >>> ڍÂ?{¡Ă&#x153;uÂşÂ&#x2DC;] "XJÂ&#x2DC;Â&#x2021;ŸêkĂľÂ&#x2021;/Â?return @oĂ&#x2019;Â&#x2021;3zÂ&#x2DC;Â&#x2021;returnÂ&#x192;c ?AĂ&#x201C;ÂşÂ&#x2DC;] Â&#x201C;è§X'4ŠÂ&#x2021;§'4äÍ"finally Â?{Jø

Â&#x2DC;Â&#x2021;3ŸêÂ&#x2C6;ÂŁÂ&#x192;c§Â&#x2030;1Â&#x2DC; Â&#x201C;è§5'4] §ŸêÂ&#x2C6;ÂŁÂ&#x152;U´Ă?Â?return Â&#x160;ʧ½ Ăśu) vkĂ&#x201C;Âźexception

§1.14.3 Ă&#x2018;exception raise Â&#x160;ĂŠ^uĂ&#x2018;exception§3Ă&#x2018;exception Â&#x17E;ÿ§Â&#x152;¹´?Ă&#x203A;object§^uÂ? [ÂŁĂŁÂ&#x2020;Ă&#x2DC;a." >>> from UserList import * >>> try: ... raise UserList([1,2]) ... except UserList,arg: ... for k in arg: print k ... 1 2 annCharles@tom.com

188Â?,208Â?

Python Ă&#x2020;S)P


§1.14 Ă&#x2030;~?n(exception) 3except ÂĽÂ?Â&#x2021;exceptionTypeĂ&#x161;object a.Â&#x2DC;Â&#x2014;§Ă&#x2019;Â&#x152;ÂąĂ&#x201C;ŸÚÂ&#x2021;exception "a. Â&#x2DC;Â&#x2014;Âżg´Â?object ´Â&#x2030;a.Â&#x2DC;Â&#x2021;instance"XJÂ&#x2DC;Â&#x2021;object ¤åclass UÂŤ Ă&#x2122;ÂŚ class§@oĂšÂ&#x2021;object Â&#x152;¹´þÂ&#x2021;a.instance§Ú a.Â?)object ¤åclass I a§IaIa§IaIaIa... except Ă&#x2DC;Â&#x152;ÂąÂ?½exception a.§Â&#x201E;Â&#x152;ÂąĂ&#x201A;Ă&#x2018;5object" ĂžÂ&#x2DC;Â&#x2021;~fÂĽarg Ă&#x2019;´raise Â&#x160;ĂŠĂ&#x2018;5UserList([1,2]) Ăš§Ă&#x2019;Â&#x152;Âąk´L& EÂ&#x152;Âą^5ÂŁĂŁĂ&#x2018;Â&#x2020;Ă?"Â&#x2DC;Â&#x201E;5`§Ă&#x2018;´Ă&#x2018;Exception Ă&#x161;§fa§lĂ&#x192;Þ¼Â&#x152;Âą ĂŠĂľException a.§X: KeyError§IndexError§IOError "´pythonÂ&#x160; Ăłvk Â&#x203A;§\Â&#x152;ÂąĂ&#x2018;?Ă&#x203A;a.ĂŠÂ&#x2013;"^rÂ&#x152;ÂągCMĂŻÂ&#x2DC;Â&#x2021;Exception fa§5 LÂŤ^rf½Ă&#x201A;exception"raise Â&#x160;ĂŠÂ&#x201E;Â&#x152;¹´raise classname,objectname/ª§ Ă&#x2122;ÂĽobjectname Â&#x152;ÂąĂ&#x161;classname vkÂ&#x2DC;:'X§,ĂšÂ&#x2030;ĂŠĂ&#x2DC;²Â&#x153;§Â&#x2DC;Â&#x201E;classname Ă&#x161;objectnameÂ&#x201E;´k'X§^5L²\§SÂĽĂ&#x153;6'X" classname ĂŠAexcept Â&#x160;ĂŠÂĽexception a.§objectname ĂŠAexcept Â&#x160;ĂŠÂĽ arg >>> try: ... raise KeyError, "hello" ... except KeyError, arg: ... print arg ... hello Â&#x152;Â&#x201E;§Ă&#x2018;Ă&#x161;Ă&#x201C;Âźexception Jø Â&#x2DC;ÂŤÂ?BĂ&#x2018;Â&#x2020;?nĂ&#x2026;Â&#x203A;"ŸêĂ&#x2DC;^3Ă?LAĂ?Â&#x2C6;ÂŁ Â&#x160;5Ă?ĂžÂ&#x2DC;?Ÿê£ŸêN^Ăś)u) Â&#x2020;Ă&#x2DC;§ ´Ă?Lraise exception Â?ÂŞ" Â&#x2C6;ÂŁÂ&#x160;Ă&#x2019;´Ÿê~Â&#x2C6;ÂŁÂ&#x17E;ĂżATÂ&#x2C6;ÂŁĂ&#x20AC;Ă&#x153;" ڍÂ?{Â&#x152;Âą\ÂŻmuÂ&#x201E;Ă?§3muĂ?Ă?§Â&#x152;ÂąĂ&#x2DC;^?n?Ă&#x203A;Â&#x2020;Ă&#x2DC;§¹\¯§S. muÂ&#x201E;Ă?" ~§S¼§kĂŠĂľÂ&#x201C;è´Ă&#x2018;Â&#x2020;?n§Â&#x2DC;?Â&#x2DC;??n"XJKĂš ?n§Œ §SwĂĽ5ĂŠÂ&#x2DC;Ă&#x2122;§² "Â&#x2DC;Â&#x2021;Â?šÊĂ&#x2018;Â&#x2020;?n§S.ÂĽyÂ&#x2021;^rÂ&#x17E;ÿ§Œ+ÂŚ Ă&#x2DC;´ÊrF§´Â&#x152;ÂąkÂ&#x2DC;Â&#x2021;Ă˝Â&#x152;¹Œ^§SÂ&#x160;Â?ĂŤ§^5Ă&#x201A;8^rIΤá^ rIŒ§ÚÂ&#x152;Âą~Â&#x2018;8Âşx" Â&#x192;Â&#x2021;§XJÂ&#x2DC;Â&#x2021;§Smu ĂŠĂ&#x2C6;§Â?šÊþĂ&#x2018;Â&#x2020;?n§Â?ĂŠrF§´¼yÂ&#x2021;Â?r Â&#x17E;ÿ§%uy§5@Ă&#x2DC;´Â?rÂ&#x17D;Â&#x2021;§@´ÊĂ&#x;Ă&#x201D;§Â&#x201D;Â&#x201C;§L¤<ĂĽĂ&#x201D;ĂĽÂŻÂ&#x153;" Â&#x2013;uĂ&#x2018;Â&#x2020;?n§Â&#x152;Âą3Âą O\§Ă?Â?ŸêÂ&#x2C6;ÂŁÂ&#x160;Ă&#x161;Ă&#x2018;Â&#x2020;?nvk'X§§SĂ&#x152;Z ´Ă&#x2DC;IÂ&#x2021;UC§§S?n6§Ă&#x2DC;IÂ&#x2021;Cz"Â?Ă&#x2019;´`§Â&#x152;¢Ă&#x152;N(´Ă&#x2DC;^C§Â&#x2021; Â&#x2030;Â?´V<\"¡Â&#x17D;xxÂ?´kĂ&#x201C;n§Ă&#x2018;´kxÂ&#x2021;Ă&#x201C;+§, 2Â&#x2DC;Ă&#x161;Â&#x2DC;Ă&#x161;[z" annCharles@tom.com

189Â?,208Â?

Python Ă&#x2020;S)P


˜ Python0 XJvkexception ś{(~XCŠó)§\ÒI‡trace (|¢) .´=‡¼êˆ£

†Ø§ …´†Ø Þ§, 3¤kN^ù‡¼ê/Ñ\ä§þ†ØŠ§XJ k ¼êk{ÏLˆ£Š5þ†Ø§~X§˜‡¼êˆ£Š´˜‡iÎ(byte§õ0 – 255)§L«,256 «~G§y3‡2O\eZGL«Ñ†§@o‡o?U¼êˆ £Ša.§‡oO\#ëê§^uˆ£†Ø"oƒ´I‡?U§¯¤±§?U ´§Smuý‰" Ñyù«¯KÏÒ´“ˆ£ŠØ==´ˆ£Š”" ^exception ś§ÒŒ±3I‡Ñ†?n/§O\try Šé"Җ´ž“è § @pk»Ò•=p§ Ø´3?ۘ‡ŒUX»/Ñ˜ž“è §@¬é@§\ XÚ¥<AÑ´ž“è § ýZ¹<%é"½ö`Z¹<Ӟ‡ɞ“ Ôö§‡oꅧ‡ž“ §´·‚“¬©ó”´k?)ª" ^BJ˜e§Exception śI‡ÄS+nś§½ö`gÄ閣Âś" •C++ ¥kException ś§·úØÐ^§XJ\ј‡é–§@oX5£Âù ‡é–=º ¢yù‡ª§¬r5éE,C++ §t\E, "Python§Java ÒÐõ "Ø^ú%ÑÉ~¬)S¦" ÆSPython L§§ÚÆSC++ ÚJava L§§4·a§ÆS˜€Šó´g‡ §ÆS˜«?§gŽâ´Ì‡"k Šó, A5 ¡Ñ‘k˜‡?§gŽ3Ù¥" Šó´g‘1N" Python á  é õ k ?  ? § g Ž § X ó Š ó( glue language )§ ”Perl§VB Script §Java Script §Bash" X  . m u( prototype development )" X ¡ • é –(Object Oriented)§”C++§Java"Xra.(strong type) §Äa.(dynamic type) §”Scheme§LISP"XKLˆª(regular expression)§”Perl§Sed§Awk"XWeb ÑÖ ì?§§”Perl"„kDoc String§lambda¼ê§”LISP"„k¼êŒCëê§?¿‡ê ë꧷¶ë꧔C++§Java §VB" ¦„k˜‡gCA5§¦r ?ªŠŠ{˜Ü©§Œ„Ù´XdrŒNŒÖ 5"

annCharles@tom.com

190,208

Python ÆS)P


1Ă&#x2122;

m uPython ÂŚ ^ Ăł ä §2.1 ÂŚ^Emacs ?6Python §S Ă&#x2122;b½^rÂŚ^LEmacs §Emacs ´Â&#x2DC;Â&#x2021;Ă?Âś§SmuÂ&#x201A;¸§Ă&#x2DC;==´Â&#x2DC;Â&#x2021;?6 ĂŹ" python mode ´Emacs ÂĽÂ&#x2DC;Â&#x2021;?6python §SĂ&#x152;ÂŞ"

§2.1.1 SCpython mode XEmacs 21.4.4 ^rÂ&#x17D;ÂŻ §ŒgÂ&#x2018;kPython mode " XJ\XĂ&#x161;ÂĽvkpython mode {§UĂŹeÂĄSCĂ&#x161;½: 1. e1python-mode.el ŠÂ&#x2021;§3Python 2.3 SCÂ?¼§Misc 8š¼škĂšÂ&#x2021;ŠÂ&#x2021;" Â?Â&#x152;ÂąeÂĄÂ&#x152;e1 http://www.python.org/emacs/python-mode/python-mode.el 2. Â&#x20AC;python-mode.el Â&#x2DC;Â&#x2021;8š¼§~X: cp python-mode.el ~/emacs/ 3. 3~/.emacs ÂĽO\eÂĄSN" ;; Python ;; ;; 4 emacs Â&#x152;¹Ê python-mode.el (add-to-list â&#x20AC;&#x2122;load-path "~/emacs") ;; Â&#x2039;m *.py ŠÂ&#x2021;Â&#x17E;ÿ§gĂ&#x201E;\1 python mode annCharles@tom.com

191Â?,208Â?

Python Ă&#x2020;S)P


 muPython Œ^óä (setq (cons (setq (cons

auto-mode-alist â&#x20AC;&#x2122;("\\.py$" . python-mode) auto-mode-alist)) interpreter-mode-alist â&#x20AC;&#x2122;("python" . python-mode) interpreter-mode-alist)) (autoload â&#x20AC;&#x2122;python-mode "python-mode" "Python editing mode." t) ;; Â&#x160;{p wÂŤ (setq font-lock-maximum-decoration t) 4. uSC"3Emacs ÂĽ$1§ M-x locate-library RET python-mode RET ATÂ&#x152;¹Êpython-mode.el§XJĂŠĂ&#x2DC;§@oATuload-path ¼´Ă&#x2DC;´Â?½

(´œ¥"

§2.1.2 python mode Ă&#x201E;A5 SCĂ? Emacs python mode Â&#x192; A5"~XÂľ

§?6python Â&#x201C;èĂ&#x2019;kÂ&#x2DC; Ă&#x2DC;^Ă&#x2020;Ă&#x2019;ÂŹĂŠĂ?

â&#x20AC;˘ gĂ&#x201E;?n ?" ¡Â&#x201A;§python |^ ?Â&#x2030;Â?Â&#x160;{Â&#x2DC;Ă&#x153;Š§cĂ&#x2122;´TAB Ă&#x161;Â&#x2DC;Â&#x201A;¡Ă&#x153;Â&#x17E;ÿ§o ´kÂ&#x2DC; #ÂśĂ&#x2122;ŠÂ&#x160;{Â&#x2020;Ă&#x2DC;"ÂŚ^python mode Ă&#x201E;Â&#x152;Âą;Â?ڍ¯K "Ă?Â? ÂŚÂ&#x203A;ŠÂ&#x153;UgCä ?§XÂ&#x2018;kĂ&#x2019;§ Â&#x2026;§^backspace Ă­Ă&#x2DC;oÂ&#x2021; ?Â&#x2DC;Â&#x201A; Â&#x17E;§Â?^UÂ&#x2DC;eĂ&#x2019;

" Â&#x2026;3,Â&#x2DC;1ĂžUTAB Â&#x2026;§Ă&#x2019;ÂŹgĂ&#x201E;?n ?§ Â&#x2026;l5Ă&#x2DC; ^TAB iĂ&#x17D;5L ?§Ă&#x2018;´^Â&#x2DC;Â&#x201A;LÂŤ"Â&#x2018;5Ă??Ă&#x2019;´§Ă&#x192;Ă&#x2DC;^Â&#x;oóä w§ ?ĂĽlĂ&#x2018;´Â&#x2DC;" â&#x20AC;˘ gĂ&#x201E;Â&#x160;{\ " ĂŠĂľ61Ă??6ĂŹA:"'Â&#x2026;iĂ&#x2DC;Ă&#x201C;Â&#x160;{(Â&#x192;§^Ă&#x2DC;Ă&#x201C;Ă´Ă&#x161;L§ Â&#x2DC;8 ," â&#x20AC;˘ ÂŚ^backspace òĂžÂ&#x2DC;?Â&#x160;ĂŠÂŹÂ&#x17E;ÿ§gĂ&#x201E;JÂŤc ?/Â?´=Â&#x2DC;ÂŹ Â&#x160;ĂŠ(ĂĽ" â&#x20AC;˘ èßIM-Python ޚk§S(§Â?)a§¤ Ÿê§CĂž" â&#x20AC;˘ èßPython ĂžkĂŠĂľ~^ĂśÂ&#x160;"

§2.1.3 ~^ĂľUĂ&#x17E;~ 1. C-c ! ½Ü M-x py-shell Â&#x152;¹ÊĂ&#x201E;python )ºÏ" annCharles@tom.com

192Â?,208Â?

Python Ă&#x2020;S)P


§2.1 ÂŚ^Emacs ?6Python §S 2. C-c C-c ½Ü M-x py-execute-buffer Â&#x152;Âą$13?6python §S"XJĂŠĂ&#x201E; python )ºÏ§@oĂ&#x2019;ÂŹ3Python  )ºÏ¼Â&#x2030;1§Ă&#x2019;Â&#x201D;Â&#x2DC;Â&#x2021;Â&#x2DC;Â&#x2021;¡-Ă&#x2018;\Ă&#x2122;ÂĽÂ&#x2DC;" 3. C-c |

½Ü M-x py-execute-region

Â&#x152;Âą$1region ÂĽ§S"region ´Emacs ÂĽÂ&#x2DC;Â&#x2021; Ă&#x160;Ă?Vg§Ă&#x161;Ă&#x20AC;JÂŤÂ?a q"C-@ ½ÜC-<SPC> Â&#x152;¹½Ă&#x201A;Â&#x2DC;Â&#x2021;region mĂ&#x17E;§region (Â&#x2014;Ă&#x2019;´c1I Â&#x2DC;"ĂšÂ&#x2021;¡-Â&#x152;Âąrregion ÂĽĂ&#x153;ŠuxÂ&#x2030;)ºÏÂ&#x2030;1"XJĂŠĂ&#x201E; python )ºÏ§ @oĂ&#x2019;ÂŹ3Python )ºÏ¼Â&#x2030;1§Ă&#x2019;Â&#x201D;Â&#x2DC;Â&#x2021;Â&#x2DC;Â&#x2021;¡-Ă&#x2018;\Ă&#x2122;ÂĽÂ&#x2DC;" 4. C-c RET

½Ü M-x py-execute-import-or-reload

ĂšÂ&#x2021;¡-3muÂŹL§¼AOk^§Â&#x152;Âąr3?6ŠÂ&#x2021;Â&#x160;Â?Â&#x2DC;Â&#x2021;module § \Python )ºÏ¼"muÂŹÂ&#x17E;ÿ§²~Â&#x2021;rĂšÂ&#x2021;ÂŹimport ½Üreload "k

ĂšÂ&#x2021;ĂľU§@omu6§Ă&#x2019;´§?U§C-c RET §$1ÿà Â&#x201C;è§UY?U ÂŹ"ĂšÂ&#x152;Â&#x152;Jp muÂ&#x201E;Ă?"ĂšÂ&#x2021;¡-Ă&#x161;C-c C-c Â&#x192;'§kĂźÂ&#x2021;`:" (a) ¤kŸêĂ&#x161;CĂž½Ă&#x201A;Ă&#x2018;´3ÂŹSĂ&#x153;§ Ă&#x2DC;´)ºÏ¼Ă&#x203A;CĂž" (b) Python NĂ ĂŹÂ&#x152;¹ÊAŠÂ&#x2021;1꧴uÂ&#x2020;Ă&#x2DC;½ " 5. C-c C-s

½Ü M-x py-execute-string

ÂŹ3minibuffer Â&#x17E;ÂŚ^rĂ&#x2018;\Â&#x2DC;ĂŁpython Â&#x201C;è§, $1ÂŚ"Ăš3NĂ Â&#x2DC;Â&#x2021;Ÿê Â&#x17E;ÿ§ÊkÂ?Ă?"\Â&#x152;ÂąĂ&#x2018;\Ÿêœ¥§$1ĂšÂ&#x2021;Ÿê"½Ü\ĂŠ,Â&#x2021;Ÿê ^{Ă&#x2DC;Â&#x2019;½§½ÜÊ,ÂŤÂ&#x160;{Ă&#x2DC;Â&#x2019;½Â&#x17E;ÿ§Â?Â&#x152;ĂŠÂ?B$1{ĂźÂ&#x2DC;ĂŠ{ Â&#x201C;è"½ÜwÂ?Ă?Â?´Êk^§Â&#x152;Âą$1help(somefunc) Â&#x152;ÂąwÂ?Ă?§½Ü $1type(somevar) wa.§½Üdir(obj) wĂŠÂ&#x2013;¤kĂĄ5" 6. C-c C-#

½Ü M-x comment-region

Â&#x152;Âąrregion Ă&#x153;Š5ÂşK" M-x uncomment-region Â&#x152;Âąrregion Ă&#x153;Š5ÂşKĂ&#x153;Š§K5Âş"ÚÊNà §SĂŠkÂ?Ă?" 7. C-c C-k ½Ü M-x py-mark-block Â&#x152;Âąr1I ÂĄÂ&#x2DC;|Â&#x201C;菧IPÂ?Â&#x2DC;Â&#x2021;region §1IÂŹÂŁĂ&#x201E;Â&#x201C;èmĂ&#x17E;"Â&#x152; Âą^C-x C-x 5uregion mĂ&#x17E;Ă&#x161;(Â&#x2014;" 8. C-M-a ½Ü M-x py-beginning-of-def-or-class annCharles@tom.com

193Â?,208Â?

Python Ă&#x2020;S)P


 muPython ÂŚ^óä C-M-e ½Ü M-x py-end-of-def-or-class Š O L ÂŤ ÂŁ Ă&#x201E; 1 I  Â&#x2DC; Â&#x2021;def ½class ÂŹ  m Ă&#x17E; ½ Ăś ( Â&#x2014; " Â&#x152; Âą ÂŚ ^ ĂŤ ĂŞ " ~ X: C-u 1 C-M-a LÂŤÂŁĂ&#x201E;1IÞß?def ½class ÂŹmĂ&#x17E;ĂšÂ&#x2021;¡-A3Emacs ¤ k?§ÂŞÂĽĂĽÂ&#x160;^" 9. C-M-h ½Ü M-x py-mark-def-or-class LÂŤrÂ&#x2DC;Â&#x2021;def ½Üclass Â&#x160;ʏ§IPÂ?Â&#x2DC;Â&#x2021;region "Â&#x152;Âą^C-x C-x 5uregion mĂ&#x17E;Ă&#x161;(Â&#x2014;"Ă&#x201C;Â&#x152;¹Œ^ĂŤĂŞ"ĂšÂ&#x2021;¡-A3Emacs ¤k?§ÂŞÂĽĂĽÂ&#x160; ^" 10. C-c > ½Ü C-c C-r ½Ü C-c < ½Ü C-c C-l ½Ü

M-x py-shift-region-right M-x py-shift-region-left

ŠOLÂŤrregion Â&#x2022;Â&#x2020;ÂŁĂ&#x201E;§Ă&#x161;Â&#x2022;mÂŁĂ&#x201E;§^5UCÂ&#x201C;菠?" 11. C-M-j ½Ü M-x indent-new-comment-line 3?Ăľ15ÂşÂ&#x17E;ĂżÂ&#x203A;Šk^§LÂŤmŠÂ&#x2DC;Â&#x2021;#1§gĂ&#x201E;\Ăž5ÂşĂ&#x17D;Ă&#x2019;Ă&#x161;(  ?" 12. C-x $ ½Ü M-x set-selective-display LÂŤÂ?wÂŤÂ&#x2DC;Â&#x2021;ÂŹÂĽ¤kaĂ&#x161;Ÿêœ¥§ Ă&#x203A;ĂľaĂ&#x161;ŸêĂ&#x152;N§ÚĂŠ^ wÂ&#x2DC;Â&#x2021;ÂŹÂĽÂ&#x201C;èĂ&#x201C;+"ĂšÂ&#x2021;¡-´Â&#x152;ÂąĂ&#x2030;ĂŤĂŞ§~X: C-u C-x $ LÂŤĂ&#x203A; þ§C-x $ LÂŤwÂŤaĂ&#x161;ŸêĂ&#x152;N" 5ĂšÂ&#x2021;ĂľUĂ&#x2DC;´ÚÂ&#x2021;Âżg§5Âżg§Â?w ?Â&#x160;uÂ?½Íê1"~ XC-u 4 C-x $ XJÂ&#x2DC;1mĂ&#x17E;škÂ&#x2DC;Â&#x201A;ĂŞu4 §@oĂ&#x2019;wŒ§Ă&#x201E;KĂ&#x2019;Ă&#x2DC;w §C-x $ LÂŤw¤k1"TĂ?§python ÂŚ^ ?5LÂŤÂ&#x160;{(§¤¹^Â&#x2C6;Â&#x2021; ĂľUÂ&#x152;Âąw Â&#x201C;è(" Â&#x161;~Ă?^! cĂ&#x2122;´\§SĂŠÂ&#x152;Â&#x17E;ÿ§iruĂ&#x2122;m§Â&#x2018;qsĂ&#x152;&Ă&#x161;"

§2.2 Ă&#x2122;ÂŚ?6ĂŹ Â&#x152;Âą3eÂĄÂ&#x152;§wNĂľ?6ϧXJEmacs Ă&#x2DC;¡Ă&#x153;\§Ă&#x2019;Ă&#x20AC;JÂ&#x2DC;Â&#x2021;¡Ă&#x153;\ ?6ĂŹ" http://www.python.org/cgi-bin/moinmoin/PythonEditors ´§¡rĂ­ÂŚ^Emacs "JĂ˝Ă&#x2DC;Â&#x2020;" annCharles@tom.com

194Â?,208Â?

Python Ă&#x2020;S)P


§2.3 NÁ§S

§2.3 NÁ§S NÁ§SÄípdb §¦´python f‘NÁ¬"aqGDB §©i.¡§Ø ´éÐ^"´¦´˜‡. e§kÙ§.¡Ð§S|^pdb 5NÁ§S"ØLw˜ epdb Ï„kék^"

§2.3.1 ¦^DDD Úpydb NÁpython §S DDD ´˜‡Í¶ã/.¡NÁ§S§¦¦^. ´GDB "

NÁóä§;.Ò

 ÚDDD ܧpydb ´˜‡pdb U?‡" Uìe¡Ú½Œ±SCpydb Ú¦^DDD " 1. SCDDD §XJ\Unix ½öLinux muCé{§AT®²CÐ DDD "XJvk§wDDD SCÃþ" 2. e1pydb "·´l http://ftp.debian.org/debian/pool/main/p/pydb/pydb_1.01.orig.tar.gz e1"XJù‡ó”}{§\UéÐ/e1" 3. €pydb.py $PATH ¥˜‡8¹"Ò´`§Shell Œ±é¿…$1ù‡·-" ~X: $cp pydb.py /usr/bin/pydb 5¿‡U¶i§K.py *ж¡" 4. €pydbsupt.py Úpydbcmd.py §˜‡8¹§(import ·-Œ±é¦‚" ˜„´ $cp pydbsupt.py pydbcmd.py /usr/local/lib/python/ 5. $1 $ddd --pydb Ҍ±‹mã/.¡ " Œ±ÀJEdit/Preference.../Source èü§r“Refer to Program Source” ˜¤“by Full Path Name”§„Œ±U ?ŠÚ´Äw«1Ò" 6. ÀJFile/Open èü§‹m\‡ §S§ÒŒ±NÁ " Ϗ´ã/.¡§äNNÁ{§¹¢˜¬Ò¬ " annCharles@tom.com

195,208

Python ÆS)P


n Python ~^ÂŹ

1nĂ&#x2122;

Python ~ ^ ÂŹ ÂŹÂ?Ă&#x2DC;Â&#x201D;Ă&#x2DC;%Â&#x160;Ăł@o­½§Â&#x152;UÂŹC§Ă&#x2019;Â&#x201D;g,Â&#x160;ĂłÂ&#x160;{´'­½§´ Ă&#x2018;5ŠĂ&#x2122;(¢Z O"´kÂ&#x2DC; ~^´'­½"XJĂšp0 Ă&#x161;¢S Â&#x2021;Ă&#x2DC;Â&#x2DC;Â&#x2014;§Â&#x201E;´IÂ&#x2021;w #Ă&#x192;Ăž"

§3.1 SÂ&#x2DC;ÂŹ SÂ&#x2DC;´Ă&#x2DC;^import Ă&#x2019;Â&#x152;ÂąÂ&#x2020;ÂŚ^"§škĂŠĂľk^Ÿê"Ă&#x17E;Xe§äN Â&#x152;ÂąĂ&#x192;Þ§½Üprint obj.__doc__ wÂ?Ă?"

§3.1.1 ~^Ÿê ~^SÂ&#x2DC;Ÿê3L3.1-1ÂĽ" ~X: >>> help(dir) Help on built-in function dir: dir(...) dir([object]) -> list of strings Return an alphabetized list of names comprising (some of) the attributes of the given object, and of attributes reachable from it: No argument: the names in the current scope. Module object: the module attributes. Type or class object: its attributes, and recursively the annCharles@tom.com

196Â?,208Â?

Python Ă&#x2020;S)P


§3.1 SÂ&#x2DC;ÂŹ help(obj)

3Â&#x201A;Â?Ă?§obj Â&#x152;¹´?Ă&#x203A;a."

callable(obj)

w w Â&#x2DC; Â&#x2021;obj´ Ă&#x2DC; ´ Â&#x152; Âą Â&#x201D; Âź ĂŞ Â&#x2DC;  N ^ ÂŚ"

repr(obj)

obj LÂŤiĂ&#x17D;G§Â&#x152;Âą|^ĂšÂ&#x2021;iĂ&#x17D; G^eval Ÿê­ïTĂŠÂ&#x2013;Â&#x2DC;Â&#x2021;Â&#x20AC; str´Â&#x2DC;Â&#x2021;iĂ&#x17D;G§LÂŤĂ&#x153;{python LÂ&#x2C6; ÂŞ"Â&#x2C6;ÂŁĂšÂ&#x2021;LÂ&#x2C6;ÂŞ

eval(str) dir(obj) hasattr(obj§name) getattr(obj§name) setattr(obj§name§value) delattr(obj§name) vars(obj) locals() globals() type(obj) isinstance(obj§cls) issubclass(subcls§supcls)

wobj name space ÂĽÂ&#x152;Â&#x201E;name " w Â&#x2DC; w Â&#x2DC; Â&#x2021;obj name space ÂĽ ´ Ă&#x201E; kname Â&#x2DC;Â&#x2021;objname space ÂĽÂ&#x2DC;Â&#x2021;name" Â? Â&#x2DC; Â&#x2021;obj name space ÂĽ name Â? Â&#x2022;valueĂšÂ&#x2021;object lobj name space ÂĽĂ­Ă&#x2DC;Â&#x2DC;Â&#x2021;name Â&#x2C6; ÂŁ Â&#x2DC; Â&#x2021;object name space" ^dictionary LÂŤ Â&#x2C6;ÂŁÂ&#x2DC;Â&#x2021;Ă&#x203A;Ă&#x153;name space§^dictionary L ÂŤ Â&#x2C6;ÂŁÂ&#x2DC;Â&#x2021;Ă&#x203A;name space§^dictionary L ÂŤ wÂ&#x2DC;Â&#x2021;obj a. wwobj´Ă&#x2DC;´clsinstance wwsubcls ´Ă&#x2DC;´supcls fa

L 3.1-1: Python ­^SÂ&#x2DC;Ÿê

attributes of its bases. Otherwise: its attributes, its classâ&#x20AC;&#x2122;s attributes, and recursively the attributes of its classâ&#x20AC;&#x2122;s base classes. >>> callable(dir) #Â&#x152;N^ 1 >>> a=1 >>> callable(a) #Ă&#x2DC;Â&#x152;N^ 0 >>> a=dir #Ÿê aliase Â?´Â&#x152;N^ >>> callable(a) 1 annCharles@tom.com

197Â?,208Â?

Python Ă&#x2020;S)P


n Python ~^ÂŹ >>> a(" ") #Ă&#x161;dir(" ")Â&#x2DC;" [â&#x20AC;&#x2122;__add__â&#x20AC;&#x2122;, â&#x20AC;&#x2122;__class__â&#x20AC;&#x2122;, â&#x20AC;&#x2122;__contains__â&#x20AC;&#x2122;, â&#x20AC;&#x2122;__delattr__â&#x20AC;&#x2122;, â&#x20AC;&#x2122;__doc__â&#x20AC;&#x2122;, â&#x20AC;&#x2122;__eq__â&#x20AC;&#x2122;, â&#x20AC;&#x2122;__ge__â&#x20AC;&#x2122;, â&#x20AC;&#x2122;__getattribute__â&#x20AC;&#x2122;, â&#x20AC;&#x2122;__getitem__â&#x20AC;&#x2122;, â&#x20AC;&#x2122;__getslice__â&#x20AC;&#x2122;, â&#x20AC;&#x2122;__gt__â&#x20AC;&#x2122;, â&#x20AC;&#x2122;__hash__â&#x20AC;&#x2122;, â&#x20AC;&#x2122;__init__â&#x20AC;&#x2122;, â&#x20AC;&#x2122;__le__â&#x20AC;&#x2122;, â&#x20AC;&#x2122;__len__â&#x20AC;&#x2122;, â&#x20AC;&#x2122;__lt__â&#x20AC;&#x2122;, â&#x20AC;&#x2122;__mul__â&#x20AC;&#x2122;, â&#x20AC;&#x2122;__ne__â&#x20AC;&#x2122;, â&#x20AC;&#x2122;__new__â&#x20AC;&#x2122;, â&#x20AC;&#x2122;__reduce__â&#x20AC;&#x2122;, â&#x20AC;&#x2122;__repr__â&#x20AC;&#x2122;, â&#x20AC;&#x2122;__rmul__â&#x20AC;&#x2122;, â&#x20AC;&#x2122;__setattr__â&#x20AC;&#x2122;, â&#x20AC;&#x2122;__str__â&#x20AC;&#x2122;, â&#x20AC;&#x2122;capitalizeâ&#x20AC;&#x2122;, â&#x20AC;&#x2122;centerâ&#x20AC;&#x2122;, â&#x20AC;&#x2122;countâ&#x20AC;&#x2122;, â&#x20AC;&#x2122;decodeâ&#x20AC;&#x2122;, â&#x20AC;&#x2122;encodeâ&#x20AC;&#x2122;, â&#x20AC;&#x2122;endswithâ&#x20AC;&#x2122;, â&#x20AC;&#x2122;expandtabsâ&#x20AC;&#x2122;, â&#x20AC;&#x2122;findâ&#x20AC;&#x2122;, â&#x20AC;&#x2122;indexâ&#x20AC;&#x2122;, â&#x20AC;&#x2122;isalnumâ&#x20AC;&#x2122;, â&#x20AC;&#x2122;isalphaâ&#x20AC;&#x2122;, â&#x20AC;&#x2122;isdigitâ&#x20AC;&#x2122;, â&#x20AC;&#x2122;islowerâ&#x20AC;&#x2122;, â&#x20AC;&#x2122;isspaceâ&#x20AC;&#x2122;, â&#x20AC;&#x2122;istitleâ&#x20AC;&#x2122;, â&#x20AC;&#x2122;isupperâ&#x20AC;&#x2122;, â&#x20AC;&#x2122;joinâ&#x20AC;&#x2122;, â&#x20AC;&#x2122;ljustâ&#x20AC;&#x2122;, â&#x20AC;&#x2122;lowerâ&#x20AC;&#x2122;, â&#x20AC;&#x2122;lstripâ&#x20AC;&#x2122;, â&#x20AC;&#x2122;replaceâ&#x20AC;&#x2122;, â&#x20AC;&#x2122;rfindâ&#x20AC;&#x2122;, â&#x20AC;&#x2122;rindexâ&#x20AC;&#x2122;, â&#x20AC;&#x2122;rjustâ&#x20AC;&#x2122;, â&#x20AC;&#x2122;rstripâ&#x20AC;&#x2122;, â&#x20AC;&#x2122;splitâ&#x20AC;&#x2122;, â&#x20AC;&#x2122;splitlinesâ&#x20AC;&#x2122;, â&#x20AC;&#x2122;startswithâ&#x20AC;&#x2122;, â&#x20AC;&#x2122;stripâ&#x20AC;&#x2122;, â&#x20AC;&#x2122;swapcaseâ&#x20AC;&#x2122;, â&#x20AC;&#x2122;titleâ&#x20AC;&#x2122;, â&#x20AC;&#x2122;translateâ&#x20AC;&#x2122;, â&#x20AC;&#x2122;upperâ&#x20AC;&#x2122;] >>> repr({"one":1,"two":2}) # repr ^uiĂ&#x17D;G§^5LÂŤĂŠÂ&#x2013; "{â&#x20AC;&#x2122;twoâ&#x20AC;&#x2122;: 2, â&#x20AC;&#x2122;oneâ&#x20AC;&#x2122;: 1}" >>> a=[1,2] >>> eval(repr(a)) # eval Ă&#x161; repr Â&#x152;ÂąÂ&#x2DC;Â&#x2021;ĂŠÂ&#x2013;Â&#x20AC;" [1, 2] >>> a [1, 2] >>> hasattr(a,"append") 1 >>> getattr(a,"append")(3) >>> getattr(a,"append")(4) >>> a [1, 2, 3, 4] >>> type(a) <type â&#x20AC;&#x2122;listâ&#x20AC;&#x2122;>

§3.1.2 a.=Â&#x2020;Ÿê ~^a.=Â&#x2020;ŸêXL3.1-2 Ă&#x17E;~: >>> chr(65) â&#x20AC;&#x2122;Aâ&#x20AC;&#x2122; >>> [ord(k) for k in "ABC"] [65, 66, 67] >>> oct(65) , oct(65000),oct(650000000) (â&#x20AC;&#x2122;0101â&#x20AC;&#x2122;, â&#x20AC;&#x2122;0176750â&#x20AC;&#x2122;, â&#x20AC;&#x2122;04657433200â&#x20AC;&#x2122;) annCharles@tom.com

198Â?,208Â?

Python Ă&#x2020;S)P


§3.1 SÂ&#x2DC;ÂŹ chr(i) ord(i) oct(x) hex(x) str(obj) list(seq) tuple(seq) dict()§dict(list) int (x) long(x) float(x) complex(x) max(... min(...)

rÂ&#x2DC;Â&#x2021;ASCII ĂŞÂ&#x160;§C¤iĂ&#x17D; rÂ&#x2DC;Â&#x2021;iĂ&#x17D;½ÜunicodeiĂ&#x17D;§C¤ASCII ĂŞÂ&#x160; rĂŞx C¤l?Â&#x203A;LÂŤiĂ&#x17D;G rĂŞx C¤Â&#x203A;8?Â&#x203A;LÂŤiĂ&#x17D;G obj iĂ&#x17D;GÂŁĂŁ rÂ&#x2DC;Â&#x2021;sequence =Â&#x2020;¤Â&#x2DC;Â&#x2021;list rÂ&#x2DC;Â&#x2021;sequence =Â&#x2020;¤Â&#x2DC;Â&#x2021;tuple =Â&#x2020;¤Â&#x2DC;Â&#x2021;dictionary =Â&#x2020;¤Â&#x2DC;Â&#x2021;integer =Â&#x2020;¤Â&#x2DC;Â&#x2021;long integer =Â&#x2020;¤Â&#x2DC;Â&#x2021;2:ĂŞ =Â&#x2020;¤EĂŞ ÂŚÂ Â&#x152;Â&#x160; ÂŚÂ Â&#x160; L 3.1-2: a.=Â&#x2020;Ÿê

>>> hex(65) , hex(65000),hex(650000000) (â&#x20AC;&#x2122;0x41â&#x20AC;&#x2122;, â&#x20AC;&#x2122;0xfde8â&#x20AC;&#x2122;, â&#x20AC;&#x2122;0x26be3680â&#x20AC;&#x2122;) >>> str(10),str([1,2]),str({"one":1}) (â&#x20AC;&#x2122;10â&#x20AC;&#x2122;, â&#x20AC;&#x2122;[1, 2]â&#x20AC;&#x2122;, "{â&#x20AC;&#x2122;oneâ&#x20AC;&#x2122;: 1}") >>> list("abc"),list((1,2,3)) ([â&#x20AC;&#x2122;aâ&#x20AC;&#x2122;, â&#x20AC;&#x2122;bâ&#x20AC;&#x2122;, â&#x20AC;&#x2122;câ&#x20AC;&#x2122;], [1, 2, 3]) >>> tuple("abc"),tuple([1,2,3]) ((â&#x20AC;&#x2122;aâ&#x20AC;&#x2122;, â&#x20AC;&#x2122;bâ&#x20AC;&#x2122;, â&#x20AC;&#x2122;câ&#x20AC;&#x2122;), (1, 2, 3)) >>> dict(),dict([("one",1),("two",2)]) ({}, {â&#x20AC;&#x2122;twoâ&#x20AC;&#x2122;: 2, â&#x20AC;&#x2122;oneâ&#x20AC;&#x2122;: 1}) >>> dict([ ( str(x), x) for x in [1,2] ]) {â&#x20AC;&#x2122;1â&#x20AC;&#x2122;: 1, â&#x20AC;&#x2122;2â&#x20AC;&#x2122;: 2} >>> int(1),int("1"),int(1.4),int(1.6) (1, 1, 1, 1) >>> int("1.2") #Ă&#x2DC;1, 1.2 wĂĽ5Ă&#x2DC;Â&#x201D;ĂŞ Traceback (most recent call last): File "<stdin>", line 1, in ? ValueError: invalid literal for int(): 1.2 >>> long(1),long("1"),long(1.4),long(1.6) (1L, 1L, 1L, 1L) annCharles@tom.com

199Â?,208Â?

Python Ă&#x2020;S)P


n Python ~^ÂŹ >>> float(1),float("1.2"),float("1e-4") (1.0, 1.2, 0.0001) >>> min(1,2,3,4,5) 1 >>> min([1,2,3,4,5]) 1 >>> max([1,2,3,4,5]) 5 >>> max(1,2,3,4,5) 5

§3.1.3 ^uÂ&#x2030;1§SSÂ&#x2DC;Ÿê \ÂŹ import§\Â&#x2DC;Â&#x2021;module" Â&#x2030;1Â&#x201C;è exec code [ in globaldict[,localdict]]" >>> exec "a=1" #3c namespace ĂžÂ&#x2030;1Â&#x201C;è. >>> a 1 >>> mynamespace={} #MĂŻÂ&#x2DC;Â&#x2021;Â&#x2DC;dictionary,^u;namespace >>> exec "a=1" in mynamespace #3 mynamespace ĂžÂ&#x2030;1Â&#x201C;è. >>> print mynamespace.keys() #w(J [â&#x20AC;&#x2122;__builtins__â&#x20AC;&#x2122;, â&#x20AC;&#x2122;aâ&#x20AC;&#x2122;] #Ă&#x161;\ĂźÂ&#x2021;name >>> type(mynamespace["__builtins__"]) <type â&#x20AC;&#x2122;dictâ&#x20AC;&#x2122;> #eÂ&#x2DC;Â&#x2021;Â?ÂŻ<~f >>> class A: #Â&#x2DC;Â&#x2021;Â&#x2DC; class ... pass ... >>> exec "a=1" in vars(A) #O\Â&#x2DC;Â&#x2021;ĂĄ5 >>> A.a #¤þ 1 >>> exec "def abc(self): print â&#x20AC;&#x2122;okâ&#x20AC;&#x2122; " in vars(A) # Â&#x201E;UO\Â&#x2DC;Â&#x2021; methord >>> dir(A) #5Âż,k abc

annCharles@tom.com

1100Â?,208Â?

Python Ă&#x2020;S)P


§3.1 SÂ&#x2DC;ÂŹ [â&#x20AC;&#x2122;__builtins__â&#x20AC;&#x2122;, â&#x20AC;&#x2122;__doc__â&#x20AC;&#x2122;, â&#x20AC;&#x2122;__module__â&#x20AC;&#x2122;, â&#x20AC;&#x2122;aâ&#x20AC;&#x2122;, â&#x20AC;&#x2122;abcâ&#x20AC;&#x2122;] >>> x=A() >>> x.abc() #¤þ ok >>> ڍÂ?ª´Ê(šĂ&#x161;rÂ&#x152;§´ŒÊJÂ&#x20AC;Ă&#x2C6;¤Â?C++ ½ÜJava Â&#x160;Ăł"Ă&#x2DC;Â&#x161;§\( ½^Python Â&#x160;Â?§SmuĂ&#x152;NÂ&#x160;ó§ Â&#x2026;ĂŠPython 5UĂŠk&%§Ă&#x2DC;Â&#x17D;^Ă&#x2122;§Â&#x160;Ăł XC++ ­, ĂľUÂŹ"Â?Â&#x;oÂŹ^C++ ­§ Ă&#x2DC;´Â&#x2020;^C++ Q? Ăš9Â&#x2DC; Â&#x2021;^Â&#x2021;ó§Â&#x2018;K"{Ăź/`§^C++ Â&#x152;UÂ&#x2020;§ºxÂ&#x152;"Python Â?Â&#x152;UÂ&#x2020;§´ Âşx"C++ Ăž5Ă&#x2019;°H[Â?§(JÂ&#x160;ÂŹÂ&#x152;UĂ&#x2DC;´^rÂ&#x2021;"Python ´Â&#x192;£§^rÂ&#x152; ÂąkwÂ&#x2DC;Â&#x2021;Ă&#x201C;+§, 2°H[T§^C++ ­, ÂŹ" Â&#x2DC;´Ă&#x17D;Ă&#x2122;.§Ă&#x161;ĂĽÂşx\O§Â&#x2DC;´SÂ&#x201C;.§Ă&#x2026;Ă&#x161;[z§ºÂ&#x2DC;Âşx" ^C++­´Ă&#x192;ã§Ă&#x2DC;´8§8´ávÂ?rIÂŚ"XJÂ&#x152;¹áv^rIΤĂ&#x2019;Ă&#x2DC; ^­" Ă&#x2019;Â&#x17D;Ă&#x2DC;Uáv^rIΤÂ?Ă&#x2DC;Â&#x2021;:X?U§kÿÞ§ww5U´œ3=p§k Â&#x2DC;¼§O\Ă&#x;§¤ Êþüí§5UvkUCĂľ§ Ă&#x2DC;Ă&#x2DC;vó§python kprofile module ^uOÂ&#x17D;python §SÂĽzĂŁÂ&#x201C;è5U"ĂŠâ&#x20AC;&#x153;´œâ&#x20AC;?§(@â&#x20AC;&#x153;´œâ&#x20AC;?§, `z" ?Ă&#x2C6;Â&#x201C;è compile§XJÂ&#x2DC;ĂŁÂ&#x201C;è²~Â&#x2021;ÂŚ^§@ok?Ă&#x2C6;§2$1ÂŹÂ?ÂŻ" >>> c=compile("print â&#x20AC;&#x2122;helloâ&#x20AC;&#x2122;","abc","single") >>> exec c hello >>> c=compile("raise 1 ","abc","single") >>> exec c Traceback (most recent call last): File "<stdin>", line 1, in ? File "abc", line 1, in ? # 5¿ŠÂ&#x2021;ϫ abc TypeError: exceptions must be strings, classes, or instances, not int compileknÂ&#x2021;ꐤ1Â&#x2DC;Â&#x2021;Â&#x201C;èiĂ&#x17D;G"´ÊAPython §SŠÂ&#x2021;œ¥§Œ^u3 Â&#x2030;1Â&#x201C;è§)Ă&#x2030;~Â&#x17E;ÿ§Â&#x2039;<Ă&#x2018;Â&#x2020;&E"1nÂ&#x2021;Íê´â&#x20AC;&#x153;singleâ&#x20AC;?§â&#x20AC;&#x153;execâ&#x20AC;? â&#x20AC;&#x153;evalâ&#x20AC;?nĂśÂ&#x192; Â&#x2DC;§ÚĂťuÂ&#x201C;è´å=Â&#x2039;<(JÂ&#x160;ʧÂ&#x201E;´Â&#x2DC;|Â&#x160;ʧÂ&#x201E;´Â&#x2DC;Â&#x2021;LÂ&#x2C6;ÂŞ"eÂĄ~f' ?Ă&#x2C6;Ă&#x161;Ă&#x2DC;?Ă&#x2C6;5U O" >>> code="print â&#x20AC;&#x2122;Hello Worldâ&#x20AC;&#x2122;" annCharles@tom.com

1101Â?,208Â?

Python Ă&#x2020;S)P


n Python ~^ÂŹ >>> c=compile(code,"abc","exec") >>> profile.run("for i in range(10000): exec c") 10002 function calls in 0.250 CPU seconds Ordered by: standard name ncalls 1 10000 1

tottime 0.090 0.160 0.000

0

0.000

percall 0.090 0.000 0.000

cumtime 0.250 0.160 0.250 0.000

percall 0.250 0.000 0.250

filename:lineno(function) <string>:1(?) abc:1(?) profile:0(for i in range(10000): exec c) profile:0(profiler)

>>> profile.run("for i in range(10000): exec code") 10002 function calls (2 primitive calls) in 0.720 CPU seconds Ordered by: standard name ncalls tottime percall cumtime percall filename:lineno(function) 10001/1 0.720 0.000 0.720 0.720 <string>:1(?) 1 0.000 0.000 0.720 0.720 profile:0(for i in range(10000): exec code) 0 0.000 0.000 profile:0(profiler) Â&#x152;Âąw§Â&#x2DC;Â&#x2021;´0.250Â&#x2021;CPU seconds§Â&#x2DC;Â&#x2021;´0.720 CPU second"Â&#x152;ÂąJp5UÂ&#x152;3 " OÂ&#x17D;LÂ&#x2C6;ÂŞ eval(str) ^uÂ&#x2C6;ÂŁÂ&#x2DC;Â&#x2021;LÂ&#x2C6;ÂŞ"5ÂżLÂ&#x2C6;ÂŞÂ&#x160;{Ă&#x161;Â&#x160;ĂŠÂ&#x160;{´Ă&#x2DC;Ă&#x201C;" >>> a=2 >>> eval("a==1") 0 >>> eval("a=1") Traceback (most recent call last): File "<stdin>", line 1, in ? File "<string>", line 1 a=1 ^ annCharles@tom.com

1102Â?,208Â?

Python Ă&#x2020;S)P


§3.2 Ă&#x161;ĂśÂ&#x160;XĂ&#x161;Â&#x192;'N^ SyntaxError: invalid syntax

§3.2 Ă&#x161;ĂśÂ&#x160;XĂ&#x161;Â&#x192;'N^ Ă&#x161;XĂ&#x161;Â&#x192;'&EĂ&#x2018;3sys ¼§^import sysÂŚ^" ~X§¡-1ĂŤĂŞ(command line arguments)"sys.argv´Â&#x2DC;Â&#x2021;list§Â?š¤k ¡-1ĂŤĂŞ" IOĂ&#x2018;\Ă&#x2018;Ă&#x2018;"sys.stdout§sys.stdin§sys.stderr ŠOLÂŤIOĂ&#x2018;\Ă&#x2018;Ă&#x2018;§ Â&#x2020;Ă&#x2DC;Ă&#x2018;Ă&#x2018;ŠÂ&#x2021;ĂŠÂ&#x2013;" òĂ&#x2018;§S"sys.exit(exit_code)   X Ă&#x161; ÂĽ modules§sys.modules´ Â&#x2DC; Â&#x2021;dictionary § L ÂŤ X Ă&#x161; ÂĽ ¤ k Â&#x152; ^ module §~Xsys.modules["os"] LÂŤmodule os§Â?Ă&#x2019;´`ÂŚÂ&#x201A;Â?Â&#x2022;Ă&#x201C;Â&#x2DC;Â&#x2021;ĂŠÂ&#x2013;" $1ĂśÂ&#x160;XĂ&#x161;Â&#x201A;¸sys.platform sys.path ´Â&#x2DC;Â&#x2021;list§Â?²¤kĂŠmodule §package ´" Ă&#x161;ĂśÂ&#x160;XĂ&#x161;Â&#x192;'N^Ă&#x161;ĂśÂ&#x160;os ¼§^import osÂŚ^" os.environ

os.chdir(dir) os.cwd() os.getegid() os.getgid() os.getuid() os.geteuid() os.setegid() os.setgid() os.setuid() os.seteuid() os.getgroups() os.getlogin() os.getenv os.putenv os.umask

Â&#x2DC; Â&#x2021;dictionary§ Â? š Â&#x201A; ¸ C Ăž  N  ' X"os.environ["HOME"] Â&#x152;ÂąÂ&#x201A;¸CĂžHOME Â&#x160;" UCc8š c8š k|id |id ^rid k^rid Â&#x2DC;k|id Â&#x2DC;|id Â&#x2DC;^rid Â&#x2DC;k^rid ^r|ϴL ^ršœ¥ Â&#x201A;¸CĂž Â&#x2DC;Â&#x201A;¸CĂž Â&#x2DC;umask L 3.2-3: XĂ&#x161;N^Ă&#x17E;~

Ăľ §L3.2-3 ==Ă&#x2018;Â&#x2DC;Ă&#x153;Š"Â?Â&#x2021;UÂ&#x17D;XĂ&#x161;N^§3pythonÂĽĂ&#x2018;UĂŠ" annCharles@tom.com

1103Â?,208Â?

Python Ă&#x2020;S)P


n Python ~^ÂŹ eÂĄkAÂ&#x2021;~f" Â&#x2DC;Â&#x2021;{Ăźshell |^os.system() ?Â&#x2DC;Â&#x2021;{Ăźshell" #!/usr/bin/python import os,sys cmd=sys.stdin.readline() while cmd: os.system(cmd) cmd=sys.stdin.readline() os.system(cmd)|^XĂ&#x161;N^§$1lIOĂ&#x2018;\Ă&#x2013;5¡-" Ă&#x201E;ŠÂ&#x2021;ĂśÂ&#x160;ĂľU |^os ÂĽĂ&#x201E;ŠÂ&#x2021;ĂśÂ&#x160;ĂľU"k:aqshell§,Ă&#x2018;\Ă&#x2DC; {Ăś" >>> os.mkdir(â&#x20AC;&#x2122;/tmp/xxâ&#x20AC;&#x2122;) #MĂŻ8š >>> os.system("echo â&#x20AC;&#x2122;helloâ&#x20AC;&#x2122; > /tmp/xx/a.txt") 0 >>> os.listdir(â&#x20AC;&#x2122;/tmp/xxâ&#x20AC;&#x2122;) >>> os.listdir(â&#x20AC;&#x2122;/tmp/xxâ&#x20AC;&#x2122;) [â&#x20AC;&#x2122;a.txtâ&#x20AC;&#x2122;] >>> os.rename(â&#x20AC;&#x2122;/tmp/xx/a.txtâ&#x20AC;&#x2122;,â&#x20AC;&#x2122;/tmp/xx/b.txtâ&#x20AC;&#x2122;) >>> os.listdir(â&#x20AC;&#x2122;/tmp/xxâ&#x20AC;&#x2122;) [â&#x20AC;&#x2122;b.txtâ&#x20AC;&#x2122;] >>> os.remove(â&#x20AC;&#x2122;/tmp/xx/b.txtâ&#x20AC;&#x2122;) >>> os.listdir(â&#x20AC;&#x2122;/tmp/xxâ&#x20AC;&#x2122;) [] >>> os.rmdir(â&#x20AC;&#x2122;/tmp/xxâ&#x20AC;&#x2122;) >>> os.listdir(â&#x20AC;&#x2122;/tmp/xxâ&#x20AC;&#x2122;) #¤þíĂ&#x2DC; 8š Traceback (most recent call last): File "<stdin>", line 1, in ? OSError: [Errno 2] No such file or directory: â&#x20AC;&#x2122;/tmp/xxâ&#x20AC;&#x2122; Â&#x201E;kchown§chmod§unlink§symlink§link"Ă&#x2122;GUnix §ATÂ?Ă&#x2122;GĂš ĂśÂ&#x160;" os ÂĽÂ&#x201E;kÊþŸê§¯¢Þ§Â?Â&#x2021;´POSIX IOŸê¹93Â&#x152;þêUnix ²2Â? ÂŚ^Ÿê3Python Unix Â&#x2021;pÂĄĂ&#x2018;´|Âą"Ăš Ă&#x2018;´Â&#x201E;Ă&#x152;POSIX .~"k Ă&#x2013;Â&#x2030;5Advanced Programming In Unix Environments 6ĂŠĂ?0 Unix e?§" annCharles@tom.com

1104Â?,208Â?

Python Ă&#x2020;S)P


§3.2 Ă&#x161;ĂśÂ&#x160;XĂ&#x161;Â&#x192;'N^ Â?)pipe§dup§open ĂśÂ&#x160;+§ŠÂ&#x2021;ÂŁĂŁĂ&#x17D;§?§§ªà §?Ă&#x2013;§^r§^r| " ^os.path ?²Ă&#x192;'§S ^os.path ?  Ă&#x2022; ĂĄ u ²   § S " ¡ Â&#x201A;  Windows(DOS)§MAC Ă&#x161;Unix ' u Š Â&#x2021; Âś ÂĄ § 8 š Âś ÂĄ § ´ Âť Âś ÂĄ  ^ { ´ Ă&#x2DC; Ă&#x201C;  " Â&#x2DC; Â&#x2021; { Ăź  ~ f ´ §DOSe ¡ Â&#x201A; ^C:\temp\a.txt LÂŤÂ&#x2DC;Â&#x2021;ŠÂ&#x2021;Unix e´/tmp/a.txt"eÂĄ~fÂ&#x152;ÂąwÂ&#x2DC; ^{: >>> os.getcwd() â&#x20AC;&#x2122;/home/Charlesâ&#x20AC;&#x2122; >>> os.path.split(os.getcwd()) (â&#x20AC;&#x2122;/homeâ&#x20AC;&#x2122;, â&#x20AC;&#x2122;Charlesâ&#x20AC;&#x2122;) #^uŠmÂ&#x2DC;Â&#x2021;8šœ¥¼8šĂ&#x153;ŠĂ&#x161;ŠÂ&#x2021;ϴĂ&#x153;Š. >>> print os.path.join(os.getcwd(),os.pardir,â&#x20AC;&#x2122;aâ&#x20AC;&#x2122;,"a.doc") /home/Charles/../backup/a.doc #Ă&#x161;splitÂ&#x192;Â&#x2021;,Ă&#x153;¤´œ¥. #os.pardir LÂŤc²eLÂŤĂžÂ&#x2DC;?8šiĂ&#x17D; .. >>> print os.path.exists(os.getcwd()) 1 #äŠÂ&#x2021;´Ă&#x201E;3. >>> os.path.expanduser(â&#x20AC;&#x2122;~/dirâ&#x20AC;&#x2122;) â&#x20AC;&#x2122;/home/Charles/dirâ&#x20AC;&#x2122; #r ~ *Ă?¤^rÂ&#x160;8š. #3 Windows eÂ&#x152;U´ H:\Charles\dir >>> os.path.expandvars(â&#x20AC;&#x2122;$TMPâ&#x20AC;&#x2122;) â&#x20AC;&#x2122;/tmpâ&#x20AC;&#x2122; #*Ă?Â&#x201A;¸CĂž,Windows eÂ&#x152;U´ c:\temp >>> os.path.isfile(os.getcwd()) 0 #´ŠÂ&#x2021;œíº0, Ă&#x2DC;´ >>> os.path.isfile(os.path.expanduser("~/tmp/a.c")) 1 # ¡8šeÂĄk /home/Charles/tmp/a.cĂšÂ&#x2021;ŠÂ&#x2021; >>> os.path.isdir(os.getcwd()) 1 #´8šíº 1, ´ >>> os.path.islink(os.getcwd()) 0 annCharles@tom.com

1105Â?,208Â?

Python Ă&#x2020;S)P


n Python ~^ÂŹ #´Ă&#x17D;Ă&#x2019;ĂŤĂ­ÂşWindows eÂ&#x152;UĂ&#x2DC;U^ĂšÂ&#x2021;Ÿê >>> os.path.ismount(os.getcwd()) 1 #´ŠÂ&#x2021;XĂ&#x161;SC:Ă­ÂşWindows eÂ&#x152;UĂ&#x2DC;U^ĂšÂ&#x2021;Ÿê >>> os.path.samefile(os.getcwd(),â&#x20AC;&#x2122;/home/Charlesâ&#x20AC;&#x2122;) 1 #wwĂźÂ&#x2021;ŠÂ&#x2021;œ¥´Ă&#x2DC;´Â?Ă&#x201C;Â&#x2DC;Â&#x2021;ŠÂ&#x2021;. >>> def test_find(filename,dirname,names): ... if filename in names: ... print os.path.join(dirname,filename) ... >>> os.path.walk(â&#x20AC;&#x2122;/home/Charlesâ&#x20AC;&#x2122;,test_find,"a.c") /home/Charles/tmp/a.c  Â&#x2DC;Â&#x2021;~fĂŠkÂżg§os.path.walk(p,func,arg) 1Â&#x2DC;Â&#x2021;Íê´Â&#x2DC;Â&#x2021;8šœi§1 Â&#x2021;Íê´Â&#x2DC;Â&#x2021;ŸêÂśi§1nÂ&#x2021;ĂŤĂŞÂ&#x2018;B´Â&#x;o"os.path.walk ÂŹrH{p e¤k f8š§Â?)p§ÊuzÂ&#x2DC;Â&#x2021;8š§Ă&#x2018;ÂŹN^func§func(arg,dirname,names) 1Â&#x2DC;Â&#x2021; ĂŤĂŞĂ&#x2019;´§walk  Â&#x2DC;Â&#x2021;ĂŤĂŞarg§dirname´Â&#x2013;ÂŻ8šœ¥"names ´Â&#x2DC;Â&#x2021;list§Â? šdirname8še¤kSN"ĂšÞ¥@ 41§SÂżg´§3,Â&#x2021;8š¼§Ă&#x161;Œ¤ kf8š¼ʜ¥´a.c ŠÂ&#x2021;½Ü8š"¡´3Unix Â&#x201A;¸e§Windows eATa q"

§3.2.1 Â&#x2039;mŠÂ&#x2021; file ĂŠÂ&#x2013;´Â&#x2DC;Â&#x2021;Ă&#x161;string§integer§float Â&#x2DC;SÂ&#x2DC;ĂŠÂ&#x2013;a."ÂŚkÂąeÂ?{" f=open("filename","r") filename Â? ½ Š Â&#x2021; Âś ÂĄ §â&#x20AC;&#x153;râ&#x20AC;?Â? ^ Â? Ă&#x2013; Â? ÂŞ Â&#x2039; m §â&#x20AC;&#x153;wâ&#x20AC;?L ÂŤ  Â? ÂŞ §â&#x20AC;&#x153;rwâ&#x20AC;?L ÂŤ Ă&#x2013;  Â? ª§â&#x20AC;&#x153;rbâ&#x20AC;?LÂŤĂ&#x2013;?Â&#x203A;Â?ª§â&#x20AC;&#x153;wbâ&#x20AC;?LÂŤ?Â&#x203A;Â?ÂŞ"

§3.2.2 Ă&#x2013;ŠÂ&#x2021; openÂ&#x2C6;ÂŁÂ&#x2DC;Â&#x2021;file ĂŠÂ&#x2013;§Â&#x152;Âą^Â&#x2DC;eÂ?{Ă&#x2013;Â&#x2DC;Â&#x2021;ŠÂ&#x2021;" >>> f=open("/tmp/x.txt","w") >>> f.write("a") >>> f.close() >>> f=open("/tmp/x.txt","r") >>> f.read() â&#x20AC;&#x2122;aâ&#x20AC;&#x2122; >>> f.read() annCharles@tom.com

1106Â?,208Â?

Python Ă&#x2020;S)P


§3.3 regular expression â&#x20AC;&#x2122;â&#x20AC;&#x2122; ÚãÂ&#x201C;èkÂ&#x2039;mÂ&#x2DC;Â&#x2021;ŠÂ&#x2021;§,  Â&#x2DC;Â&#x2021;iĂ&#x17D;§, '4§2^Ă&#x2013;Â?ÂŞÂ&#x2039;m§Ă&#x2013;Ă&#x2018;5ff ?iĂ&#x17D;"f.read(size)LÂŤlŠÂ&#x2021;ÂĽĂ&#x2013;size Â&#x2021;iĂ&#x17D;§XJĂ&#x2018;size @oòr¤ kSNĂ&#x2013;Ă&#x2018;5"XJ ŠÂ&#x2021;(Â&#x2014;§f.read(size) ÂŹÂ&#x2C6;ÂŁÂ&#x2DC;Â&#x2021;Â&#x2DC;iĂ&#x17D;G"5ÂżÂ&#x2DC; iĂ&#x17D;GLÂŤĂ&#x153;6b§Â&#x152;Âą^eÂĄÂ?ÂŞÂ&#x2DC;Â&#x2021;Â&#x2DC;Â&#x2021;iĂ&#x17D;Ă&#x2013;" f.open("/tmp/x.txt","r") c=f.read(1) while c: print c c=f.read(1) f.readline() Ă&#x2013;Â&#x2DC;1§¡^u1ĂśÂ&#x160;"XJ ŠÂ&#x2021;(Â&#x2014;§Ă&#x2019;Â&#x2C6;ÂŁÂ&#x2DC;iĂ&#x17D;G" f.readlines() Ă&#x2013;ŠÂ&#x2021;¤kSN§Â&#x2C6;ÂŁÂ&#x2DC;Â&#x2021;list §list ÂĽzÂ&#x2DC;Â&#x2021;Â&#x192;LÂŤÂ&#x2DC;1§ Â?šâ&#x20AC;&#x153;\nâ&#x20AC;?" f.write(str)rÂ&#x2DC;Â&#x2021;iĂ&#x17D;G\ŠÂ&#x2021;ÂĽ" f.tell() Â&#x2C6;ÂŁcŠÂ&#x2021;Ă&#x2013; Â&#x2DC;" f.seek(off,where) ^5½ ŠÂ&#x2021;Ă&#x2013; Â&#x2DC;"where= 0 LÂŤlmÂ&#x17D;ü§1LÂŤl c Â&#x2DC;Â&#x17D;ü§2LÂŤl(Â&#x2014;Â&#x17D;ĂĽ"offLÂŤÂŁĂ&#x201E; £Þ§ĂŞÂ&#x2022;ŠÂ&#x2021;(Â&#x2014;ÂŁĂ&#x201E;§KĂŞLÂŤ Â&#x2022;ŠÂ&#x2021;mĂ&#x17E;ÂŁĂ&#x201E;"5Âżsys ÂĽsys.stdout§sys.stderr §sys.stdin ´nÂ&#x2021;Â&#x203A;Šk^ ŠÂ&#x2021;ĂŠÂ&#x2013;" >>> import sys >>> a=sys.stdin.readline() Hello #Ă&#x2018;\Â&#x2DC;Â&#x2021;iĂ&#x17D;G >>> sys.stdout.write(a) Hello #Ă&#x2018;Ă&#x2018; >>> Ă&#x161;Ă&#x2013;ĂśÂ&#x160;ĂŠAĂśÂ&#x160;´writeline§write§writelines"

§3.2.3 '4ŠÂ&#x2021; Â?,Python ÂŹgĂ&#x201E;rvk'4ŠÂ&#x2021;Ă&#x2018;'K§´²wÂ?²'4ŠÂ&#x2021;o´Â&#x2DC;Â&#x2021;Ă?5 ¿§^ Ă&#x20AC;Ă&#x153;Â&#x2021;Â&#x2DC;ÂŹ §  äÂ&#x2021;PĂ&#x201A;Â?৯Â&#x152;Â&#x2021;PM"'M{ ߧf.close()(ĂĽ"

§3.3 regular expression regular expression (KLÂ&#x2C6;ÂŞ)§{ÂĄregexp§´?Ă&#x2C6;nÂĽÂ&#x2DC;Â&#x2021;Vg§3Unix  ­ . ÂĽ Ă&#x192; ¤ Ă&#x2DC; 3 §vi!emacs!sed!awk!perl Ă&#x2018; 2 Â?  ÂŚ ^ "python ÂĽ re§ ´ Â&#x2DC; annCharles@tom.com

1107Â?,208Â?

Python Ă&#x2020;S)P


n Python ~^ÂŹ Â&#x2021;regexp module Ă?LÂŚÂ&#x152;ÂąÂ&#x201D;perl ÂĽÂ&#x2DC;ÂŚ^regexp"regexp Ă&#x2019;´Â&#x2DC;ÂŤLÂŤÂ&#x2DC;Â&#x2021;iĂ&#x17D; G8Ă&#x153;(set)Â?{"`,Â&#x2021;iĂ&#x17D;GĂ&#x161;,Â&#x2021;regexp Â&#x161;(match¤§¿gĂ&#x2019;´`ĂšÂ&#x2021;iĂ&#x17D;G ´regexp ¤LÂ&#x2C6;8Ă&#x153;ÂĽÂ&#x2DC;Â&#x2021;Â&#x192;"3Python ¼§match Â&#x201E;LÂŤ,Â&#x2021;iĂ&#x17D;GmĂ&#x17E;Â&#x2DC; Ă&#x153;ŠĂ&#x161;,Â&#x2021;regexp match"

§3.3.1 {Ăźregexp  {Ăźregexp LÂŤkeZiĂ&#x17D;|¤§LÂŤiĂ&#x17D;" >>> p=re.compile("abc") >>> if p.match("abc") : print "match" ... match >>> Ăš p 0 Â&#x2DC; Â&#x2021; { Ăź  ^ { § Ă&#x201E; k Â&#x2021; ) ¤ ^re.compile("abc") Â&#x2DC; Â&#x2021;pattern ( ÂŞ)§pattern Â&#x2DC;Â&#x2021;match Â?{§XJĂ&#x161;,Â&#x2021;iĂ&#x17D;GÂ&#x161;§Ă&#x2019;Â&#x2C6;ÂŁÂ&#x2DC;Â&#x2021;match object§ Ă&#x201E;KĂ&#x2019;Â&#x2C6;ÂŁNone"Ă&#x2DC; , AĂ?iĂ&#x17D;metacharacter (iĂ&#x17D;) §Â&#x152;þêiĂ&#x17D;Ă&#x2018;Ă&#x161;gÂ&#x161;" Ăš AĂ?iĂ&#x17D;´ " ^ $ * + ? { [ ] \ | ( )

§3.3.2 iĂ&#x17D;8Ă&#x153; ^[]Â&#x152;ÂąLÂŤiĂ&#x17D;8Ă&#x153;"kÂąeAÂŤ^{ â&#x20AC;˘ Ă&#x2018;iĂ&#x17D;§X[abc] LÂŤÂ&#x161;a ½Üb ½Üc§½Ü`i1a§b§c Ă&#x2018;3[abc]LÂŤ 8Ă&#x153;ÂĽ"Â&#x152;þêmetacharacter 3[] ÂĽÂŹÂ&#x201D;metacharacter AĂ?ÂżĂ&#x201A;§Â?LÂŤ Ă&#x161;Â&#x161;"~X: >>> >>> >>> ... ... ... ... ... [.] [^] [$] [*]

a=".^$*+?{\\|()" p = re.compile("["+a+"]") for i in a: if p.match(i): print "[%s] is match"%i else: print "[%s] is not match"%i is is is is

match match match match

annCharles@tom.com

1108Â?,208Â?

Python Ă&#x2020;S)P


§3.3 regular expression [+] [?] [{] [\] [|] [(] [)]

is is is is is is is

match match match not match match match match

Â&#x152;Â&#x201E;Â&#x152;þêmetacharacter 3[]ÂĽĂ&#x2018;Ă&#x161;Â&#x161;§´koÂ&#x2021;metacharacter Ă&#x2DC;Ă&#x161; Â&#x161;§@Ă&#x2019;´â&#x20AC;&#x153;^[]\â&#x20AC;?§ ÂĄÂŹÂ&#x2DC;Â&#x2021;Â&#x2DC;Â&#x2021;`²§^ LÂŤÂ&#x2021;§ ÂĄ0 §[]XJĂ&#x2018;y 3[]¼§Ă&#x2019;ŠĂ&#x2DC;Â&#x2DC;Ă&#x2122;=p´mĂ&#x17E;=p´(Â&#x2014; "\ Â&#x160;^´^5LÂŤĂ&#x192;{^Â&#x2039;< iĂ&#x17D;" â&#x20AC;˘ XĂ&#x203A;3[]ÂĽÂ?š[]§LÂŤĂ&#x161;â&#x20AC;&#x153;[â&#x20AC;? ½Üâ&#x20AC;&#x153;]â&#x20AC;? Â&#x161;? >>> p=re.compile("[\]\[]") >>> p.match("]") <_sre.SRE_Match object at 0x815de60> >>> p.match("]") <_sre.SRE_Match object at 0x81585e8> >>> p.match("[") <_sre.SRE_Match object at 0x8158330> ^\[ Ă&#x161;\] LÂŤ â&#x20AC;˘ ^ Ă&#x2018;y3[]mĂ&#x17E;§LÂŤÂ&#x2021;§Ă&#x161;[]ÂĽiĂ&#x17D;Ă&#x2018;Ă&#x2DC;Â&#x161;§vkĂ&#x2018;yĂ&#x2019;Â&#x161;"[^abc] LÂŤÂ&#x161;Ă&#x2DC; a§b§cÂ&#x192; ¤kiĂ&#x17D;"^ Ă&#x2018;y3[] ÂĽm{§Ă&#x2019;vkĂšÂ&#x2021;Âżg § LÂŤ^iĂ&#x17D;"wÞ¥~f§^vkĂ&#x2018;y3mĂ&#x17E;§Ă&#x2019;Ă&#x161;gÂ&#x161;" â&#x20AC;˘ Â&#x152;Âą^-LÂŤÂ&#x2030;Â&#x152;"[a-zA-Z]Â&#x161;?Ă&#x203A;Â&#x2DC;Â&#x2021;=Ši1"[0-9]Â&#x161;?Ă&#x203A;Â&#x2DC;Â&#x2021;ĂŞi" â&#x20AC;˘ \ 3[] ÂĽĂ&#x2122;ŒŠ^" \d \D \s \S \w \W \t \x20

[0-9] [^0-9] [ \t\n\r\f\v] [^ \t\n\r\f\v] [a-zA-Z0-9_] [^a-zA-Z0-9_] LÂŤĂ&#x161;tab Â&#x161;§Ă&#x2122;ÂŚĂ&#x2018;Ă&#x161;iĂ&#x17D;GLÂŤ{Â&#x2DC;Â&#x2014; LÂŤĂ&#x161;Â&#x203A;8?Â&#x203A;ascii 0x20 Â&#x161;

k \ §Â&#x152;Âą3[] ÂĽLÂŤ?Ă&#x203A;iĂ&#x17D;"5¿§ßĂ&#x2022;Â&#x2DC;Â&#x2021;â&#x20AC;&#x153;.â&#x20AC;? XJvkĂ&#x2018;y[]¼§LÂŤ Ă&#x2DC; Â&#x2020;1\n Âą Â&#x161;?Ă&#x203A;iĂ&#x17D;"aq[^\n]" annCharles@tom.com

1109Â?,208Â?

Python Ă&#x2020;S)P


n Python ~^ÂŹ

§3.3.3 ­E Â&#x152;Âą^Â&#x2DC;eÂ?{LÂŤÂ&#x2DC;Â&#x2021;regexp ­E" â&#x20AC;˘ {m,n} L ÂŤ Ă&#x2018; ym Â&#x2021; Âą Ăž(Â? šmÂ&#x2021;)§nÂ&#x2021; Âą e(Â? šnÂ&#x2021;)" Xab{1,3}c Ă&#x2019; ÂŹ Ă&#x161;abc§abbc§abbbc Â&#x161;§´Ă&#x2DC;ÂŹĂ&#x161;ac§abbbbc Â&#x161;"m´e.§n´Þ."mÂ&#x152; ÂąÂ&#x17D;Ă&#x2018;§LÂŤe.´0§nÂ&#x152;ÂąÂ&#x17D;Ă&#x2018;§LÂŤĂž.´Ă&#x192; Â&#x152;" â&#x20AC;˘ * LÂŤ{,}§vkĂ&#x2018;y(0g)§­EĂ&#x2018;y1g¹Þ" â&#x20AC;˘ + LÂŤ{1,}§­EĂ&#x2018;y1g¹Þ â&#x20AC;˘ ? LÂŤ{0,1}§­EĂ&#x2018;y0g½Ü1g"  Â&#x152;Â&#x161;Ă&#x161; Â&#x161;ÂŻK"Â?Â&#x;oÂŹkĂšÂ&#x2021;ÂŻKÂşweÂĄ~f"[ab]* Ă&#x161;ababab ?1 Â&#x161;§@o´Ă&#x161;a Â&#x161;Â&#x201E;´Ă&#x161;ababab Â&#x161;QÂşXJĂ&#x161;a Â&#x161;§Â&#x2030; Â&#x161;§Ă&#x161;ababab Â&#x161; §Â&#x2030; Â&#x152;Â&#x161;"python ÂĽĂ&#x2018;´ Â&#x152;Â&#x161;" >>> re.compile("a*").match(â&#x20AC;&#x2122;aaaaâ&#x20AC;&#x2122;).end() 4 >>> re.compile("a*?").match(â&#x20AC;&#x2122;aaaaâ&#x20AC;&#x2122;).end() 0 match object endÂ&#x152; Âą   Â&#x161;    Â&#x2DC; Â&#x2021; i Ă&#x17D;   Â&#x2DC; " X J Â&#x2021;   Â&#x161;  § @ o Ă&#x2019; 3*§+§?§{m,n} ÂĄ\Â&#x2DC;Â&#x2021;?§C¤*?§+?§??§{m,n}?LÂŤÂ Â&#x161;"

§3.3.4 ÂŚ^ŠiĂ&#x17D;G ¡ Â&#x201A;   § i Ă&#x17D; G L ÂŤ  Â? { ÂĽ ^\\ L ÂŤ i Ă&#x17D;\§ 3regexp ÂĽ Â&#x152; Ăž  ÂŚ ^\§ ¤ Âą 3regexpÂĽ Ă&#x2018; y Â&#x152; Ăž\\Ăš  K Â? Â&#x152; Ă&#x2013; 5 § Â&#x2021; 3regexp ÂĽ Â&#x161; \ I Â&#x2021; Ăš  re.compile("\\\\") ڏÊÌÂ&#x2020;")ÝÚÂ&#x2021;ÂŻKÂ?{´¾3iĂ&#x17D;GcÂĄ\Â&#x2DC;Â&#x2021;r LÂŤraw Â&#x201A;ª§\AĂ?Â&#x160;^Ă&#x2019;Ă&#x2DC;Â&#x201E; "¤¹3python LÂŤregexpÂ&#x2DC;Â&#x201E;Ă&#x2018;^\rÂ?{"~ X >>> >>> \a >>> >>> \"a >>>

a=r"\a" print a a=r"\"a" print a

§3.3.5 ÂŚ^re ÂŹ ÂŚ^regexp§Ă?~^ÂąeAÂ&#x2021;Ă&#x161;½¾ annCharles@tom.com

1110Â?,208Â?

Python Ă&#x2020;S)P


§3.3 regular expression â&#x20AC;˘ k^re.compile Â&#x2DC;Â&#x2021;RegexObject§LÂŤÂ&#x2DC;Â&#x2021;regexp" â&#x20AC;˘ , ^pattern match§searchÂ?{§MatchObject" â&#x20AC;˘ 2^match object Â&#x161; Â&#x2DC;§Â&#x161;iĂ&#x17D;G&E" RegxObject ~^Ÿê: â&#x20AC;˘ RE_obj.match(str,[pos[,endpos]])§ X Jstr m Ă&#x17E; Ă&#x161;RE_objÂ&#x161;  §   Â&#x2DC; Â&#x2021;MatchObject Ă&#x201E;KÂ&#x2C6;ÂŁNone"5Âż´lstrmĂ&#x17E;mŠ?1Â&#x161;" >>> re.compile("a").match("abab") <_sre.SRE_Match object at 0x81d43c8> >>> print re.compile("a").match("bbab") None â&#x20AC;˘ RE_obj.search(str,[pos[,endpos]])§3strÂĽ|¢1Â&#x2DC;Â&#x2021;Ă&#x161;RE_objÂ&#x161;Ă&#x153;Š" >>> re.compile("a").search("abab") <_sre.SRE_Match object at 0x81d43c8> >>> print re.compile("a").search("bbab") <_sre.SRE_Match object at 0x8184e18> 5ÂżĂ&#x161;match()Ă&#x2DC;Ă&#x201C;"Ă&#x2DC;7lmĂ&#x17E;Ă&#x2019;Â&#x161;" â&#x20AC;˘ RE_obj.findall(str)§Â&#x2C6;ÂŁstrÂĽ|¢¤kĂ&#x161;RE_objÂ&#x161;Ă&#x153;Š"Â&#x2C6;ÂŁÂ&#x2DC;Â&#x2021;tuple§ Ă&#x2122;ÂĽÂ&#x192;´Â&#x161;iĂ&#x17D;G" MatchObject~^Ÿê â&#x20AC;˘ m.start() Â&#x2C6;£üŠ Â&#x2DC;§ÊuRE_obj.match()Â&#x2C6;ÂŁMatchObject§start()o´ Â&#x2C6;ÂŁ0 â&#x20AC;˘ m.end() Â&#x2C6;ÂŁ(ü Â&#x2DC;(Ă&#x2DC;Â?šT Â&#x2DC;iĂ&#x17D;)" >>> s="I say:helloworld" >>> m=re.compile("hello").search(s) >>> for i in range(m.start(),m.end()): ... print s[i] ... h e l l o >>> annCharles@tom.com

1111Â?,208Â?

Python Ă&#x2020;S)P


n Python ~^ÂŹ â&#x20AC;˘ m.span() Â&#x2C6;ÂŁÂ&#x2DC;Â&#x2021;tuple LÂŤ(m.start(),m.end())" â&#x20AC;˘ m.pos()§m.endpos()§m.re()§m.string() § Ăš Š O L ÂŤ ) ¤ Ăš Â&#x2021;MatchObjectŸê¼ĂŤĂŞ" RE_obj.match(str,[pos[,endpos]]),RE_obj.search(str,[pos[,endpos]]) ÂĽpos§endpos§RE_obj§str"Â?Ă&#x2019;´` m.re().search(m.string(),m.pos(),m.endpos()) ÂŹm" â&#x20AC;˘ m.finditer() Â&#x152;ÂąÂ&#x2C6;ÂŁÂ&#x2DC;Â&#x2021;iterator§^5H{¤kĂŠMatchObject" >>> ... ... (1, (3, (5, (7,

for m in re.compile("[ab]").finditer("tatbxaxb"): print m.span() 2) 4) 6) 8)

§3.3.6 p?regexp Ă&#x2DC; cÂĄ0 §Â&#x201E;kĂŠĂľk^LÂ&#x2C6;regexp Â?ÂŞ" â&#x20AC;˘ | LÂŤĂŠĂ&#x153;ĂľÂ&#x2021;regexp "XJA Ă&#x161;B ´ßÂ&#x2021;regexp §@oA|B LÂŤĂ&#x161;A Â&#x161;½ÜĂ&#x161;B Â&#x161;"´5Âż| OÂ&#x17D;`k? $§Good|Bad ÂŹĂ&#x161;â&#x20AC;&#x153;Goodâ&#x20AC;? ½Üâ&#x20AC;&#x153;Badâ&#x20AC;? Â&#x161;§Ă&#x2DC; ÂŹĂ&#x161;â&#x20AC;&#x153;Goodadâ&#x20AC;? ½Üâ&#x20AC;&#x153;GooBadâ&#x20AC;?Â&#x161;" â&#x20AC;˘ ^ LÂŤÂ?Â&#x161;Â&#x2DC;1mŠ1Ă&#x201E;"~Xâ&#x20AC;&#x153;^abcâ&#x20AC;?ÂŹĂ&#x161;â&#x20AC;&#x153;abcâ&#x20AC;?Â&#x161;§´Ă&#x2DC;ÂŹÂ&#x161;â&#x20AC;&#x153;xabcâ&#x20AC;?§c Ă&#x2122;´^search Â&#x17E;Ăż"^ Â?3mĂ&#x17E;âkڍAĂ?ÂżĂ&#x201A;§Ă&#x2019;´´`§Â?k3mĂ&#x17E;§^â ´metacharacter §Ă&#x201E;K^ Ă&#x2019;´Â&#x2DC;Â&#x2021;Ă&#x160;Ă?iĂ&#x17D;" â&#x20AC;˘ $ LÂŤÂ?Â&#x161;Â&#x2DC;1(Â&#x2014;"Ă&#x161;^ aq§Â?k3 Â&#x2DC;Â&#x2021;iĂ&#x17D;Â&#x17E;ÿ§$ âkڍAĂ?Âż g" â&#x20AC;˘ \A LÂŤÂ?Â&#x161;iĂ&#x17D;GmĂ&#x17E;"XJvk3Ăľ1ÂŞ(MULTILINE) eÂ&#x17E;ÿ§\A Ă&#x161;^ ´Â&#x2DC;Â&#x2021;Âżg§´3Ăľ1ÂŞe\A Â?Â&#x161;1Â&#x2DC;11Ă&#x201E;" ^Â&#x161;zÂ&#x2DC;11Ă&#x201E;" â&#x20AC;˘ \Z LÂŤÂ?Â&#x161;iĂ&#x17D;G(Â&#x2014;"XJvk3Ăľ1ÂŞ(MULTILINE) eÂ&#x17E;ÿ§\Z Ă&#x161;$ ´Â&#x2DC;Â&#x2021;Âżg§´3Ăľ1ÂŞe\Z Â?Â&#x161; Â&#x2DC;11Â&#x2014;" ^Â&#x161;zÂ&#x2DC;11Â&#x2014;" â&#x20AC;˘ \b Â?Â&#x161;c>.§3Ă&#x2021;Â&#x160;¼§c>.´ÊJ.½§´3=Â&#x160;ÂĽI:Ă&#x17D;Ă&#x2019;§Â&#x2DC; Â&#x201A;Ă&#x2018;Â&#x152;ÂąLÂŤÂ&#x2DC;Â&#x2021;Ăźc>.§Ă&#x2122;ÂŚÂ&#x160;ĂłÂ?kaq§äNXĂ&#x203A;.½§dlocale Ăť ½"~X\binfo\b Â?ÂŹÂ&#x161;â&#x20AC;&#x153;infoâ&#x20AC;? Ă&#x2DC;ÂŹÂ&#x161;â&#x20AC;&#x153;informationâ&#x20AC;?"´Â&#x2021;5ÂżeÂĄ~ f" annCharles@tom.com

1112Â?,208Â?

Python Ă&#x2020;S)P


§3.3 regular expression >>> print re.compile(r"\binfo\b").match("info ") <_sre.SRE_Match object at 0x817aa98> >>> print re.compile("\binfo\b").match("info ") None >>> print re.compile("\binfo\b").match("\binfo\b <_sre.SRE_Match object at 0x8174948>

#ÂŚ^ raw Â&#x201A;ÂŞ #\b LÂŤĂźc>. #vkÂŚ^ raw Â&#x201A;ÂŞ #\b LòÂ&#x201A;Ă&#x17D;Ă&#x2019; ")

5ÂżVĂ&#x161;Ă&#x2019;cÂĄr"3vk´^raw Â&#x201A;ÂŞÂ&#x17E;ÿ§\bLòÂ&#x201A;Ă&#x17D;Ă&#x2019;§0x8§Œ^raw Â&#x201A;ÂŞÂ&#x17E;Ăż\bLÂŤĂźc>." â&#x20AC;˘ \B LÂŤÂ&#x161;Â&#x161;Ăźc>." ¹Þ¤kmetacharacter ÂżĂ&#x2DC;Ă&#x161;Ă˝iĂ&#x17D;Â&#x161;§Â?´Â&#x2DC;ÂŤ^Â&#x2021;u§Ă&#x2DC;ÂŹÂŚ^Â&#x161; Ă&#x153;ŠO\Ă?"~X: ^abc Â&#x161;â&#x20AC;&#x153;abcâ&#x20AC;?§´Â&#x161;Ă?Â&#x201E;´3"1

§3.3.7 Š|(Group) Ă?~Â&#x153;š§\Ă˝Â&#x17D;Â&#x2021;Â?´Â&#x161;iĂ&#x17D;GÂĽÂ&#x2DC;Ă&#x153;Š§ Ă&#x2DC;´Ă&#x153;"regexp ²~^ 5rÂ&#x2DC;Â&#x2021;iĂ&#x17D;GŠ)¤AÂ&#x2021;Ă&#x153;Š§Ú~fÊþ§Xemail ¼Š)email header(&Ă&#x17E;) Ă&#x161;email body (Š)§email header ÂĽqÂ&#x2021;Š)u&<§Ă&#x201A;&<§email /Â&#x152;ÂĽqÂ&#x2021;Š )^rœ¥§Ă&#x161;^rÂ?Âś"~X§\^eÂĄÂ&#x201A;ÂŞ;Â&#x2DC;Â&#x2021;Ă?&š" name: Charles Address: BUPT telephone: 62281234 email: annCharles@tom.com name: Ann Address: BUPT telephone: 62284321 email: CharlesWang@peoplemail.com.cn ^Â&#x2DC;1ŠmPš"@Ă&#x2019;Â&#x2021;Charles §Ann ϴĂ&#x153;Š§BUPT /Â&#x152;Ă&#x153;Š"XĂ&#x203A;) ÝÚÂ&#x2021;ÂŻKQ? Group ! weÂĄ~f" >>> ... ... ... ... ... 1

x=""" name: Charles Address: BUPT telephone: 62281234 email: annCharles@tom.com

3lex ¼§â&#x20AC;&#x153;Ë&#x2020; abcâ&#x20AC;? Â&#x161;Ă?'â&#x20AC;&#x153;abcâ&#x20AC;? Â&#x152;

annCharles@tom.com

1113Â?,208Â?

Python Ă&#x2020;S)P


n Python ~^ÂŹ ... name: Ann ... Address: BUPT ... telephone: 62284321 ... email: CharlesWang@peoplemail.com.cn ... """ >>> p=re.compile( ... r"^name:(.*)\n^Address:(.*)\n^telephone:(.*)\n^email:(.*)\n",re.M) >>> for m in p.finditer(x): ... print "here is your friends list" ... print "%s,%s,%s,%s"%m.groups() ... here is your friends list Charles, BUPT, 62281234, annCharles@tom.com here is your friends list Ann, BUPT, 62284321, CharlesWang@peoplemail.com.cn ĂšÂ&#x2021;~fk:E,§´ATvkÂ&#x;oÂ&#x160;{Â?ÂĄÂŻK§þêÂ&#x153;šÂ&#x152;ÂąĂ&#x192;Ăž)ݯK" 'Â&#x2026;3p.compile()?§Ă&#x2122;ÂĽ(.*)ÂĽĂľ Â&#x2DC;Â&#x2021;)Ă&#x2019;§LÂŤgroup§Â?Ă&#x2019;´LÂŤÂ&#x161;Â&#x2DC;Ă&#x153; Š"3MatchObject ÂĽgroups() Â&#x2C6;£¤kÂ&#x161;group§~f¼ŠOLÂŤCharles  "MatchObject ÂĽstart() !end()!span() !group() Ă&#x2018;Â&#x152;ÂąD4ꐤLÂŤgroup Ă&#x2019;è§0o´3§ Â&#x2026;´"Â&#x17D;ꐤLÂŤÂ&#x161;oiĂ&#x17D;G"l1 mŠOê§Â&#x2DC; Â&#x2020;regexp ÂĽ Â&#x152;group ꧤ¹§~fÂĽm.start(1)LÂŤname §m.start(2) L ÂŤAddress ")Ă&#x2019;´Â&#x152;Âąi@§ÚÂ&#x17E;OÂ&#x17D;group Ă&#x2019;è§Ă&#x2019;ĂŞĂŞ(  Â&#x2DC;§~X: >>> re.compile("(a(b)c)d").match("abcd").groups() (â&#x20AC;&#x2122;abcâ&#x20AC;&#x2122;, â&#x20AC;&#x2122;bâ&#x20AC;&#x2122;) >>> kĂź|)Ă&#x2019;§êê(  Â&#x2DC;§k´abc §, ´b"p.finditer(x) 3cÂĄ0 L§Â&#x152;Âą^ 5H{¤kĂŠMatchObject" ÂĄprint Â&#x160;ĂŠ^m.groups() 5Â&#x201A;ÂŞzÂ&#x2DC;Â&#x2021;iĂ&#x17D;G" Ă?Â?m.groups() ´Â&#x2DC;Â&#x2021;tuple§Ă&#x2122;ÂĽzÂ&#x2DC;Â&#x2021;Â&#x192;´Â&#x2DC;Â&#x2021;string"group Ă&#x2DC; ڍ^{§Â&#x201E; Â&#x152;ÂąLÂŤOÂ&#x2020;§X: (\b\w+)\s+\1 Ă&#x2019;LÂŤÂ&#x161;ĂŤYĂ&#x2018;yĂźÂ&#x2021;Ă&#x201C;Ăźc" lÞ¥~f¼§wkĂšÂ&#x2DC;Â&#x2021;ÂŻK§^m.group(1) LÂŤname§ÊĂ&#x2DC;Â&#x2DC;Ă&#x2122;§ Â&#x2026; X J 3 O \ Â&#x2DC; Â&#x2021;group  { § Ă&#x2019; I Â&#x2021; N  ÂĄ ¤ k group  Ă&#x2019; è " X J U

^m.group(â&#x20AC;&#x2122;nameâ&#x20AC;&#x2122;) 5LÂŤname {§@oĂ&#x2019;Â&#x2DC;Ă&#x;Ăľ "ĂšÂ&#x2021;ÂŻK´Ú)Ăť§w eÂĄ~f: >>> p=re.compile(r"^name:(?P<name>.*)\n^Address:(?P<address>.*)\n" \ r"^telephone:(?P<telephone>.*)\n^email:(?P<email>.*)\n",re.M) >>> for m in p.finditer(x): annCharles@tom.com

1114Â?,208Â?

Python Ă&#x2020;S)P


§3.3 regular expression ... print m.groups() (â&#x20AC;&#x2122; Charlesâ&#x20AC;&#x2122;, â&#x20AC;&#x2122; BUPTâ&#x20AC;&#x2122;, â&#x20AC;&#x2122; 62281234â&#x20AC;&#x2122;, â&#x20AC;&#x2122; annCharles@tom.comâ&#x20AC;&#x2122;) (â&#x20AC;&#x2122; Annâ&#x20AC;&#x2122;, â&#x20AC;&#x2122; BUPTâ&#x20AC;&#x2122;, â&#x20AC;&#x2122; 62284321â&#x20AC;&#x2122;, â&#x20AC;&#x2122; CharlesWang@peoplemail.com.cnâ&#x20AC;&#x2122;) >>> matchs=[m for m in p.finditer(x)] >>> matchs[0].group(â&#x20AC;&#x2122;nameâ&#x20AC;&#x2122;) â&#x20AC;&#x2122; Charlesâ&#x20AC;&#x2122; >>> matchs[0].group(â&#x20AC;&#x2122;addressâ&#x20AC;&#x2122;) â&#x20AC;&#x2122; BUPTâ&#x20AC;&#x2122; >>> matchs[0].group(â&#x20AC;&#x2122;telephoneâ&#x20AC;&#x2122;) â&#x20AC;&#x2122; 62281234â&#x20AC;&#x2122; >>> matchs[0].group(â&#x20AC;&#x2122;emailâ&#x20AC;&#x2122;) â&#x20AC;&#x2122; annCharles@tom.comâ&#x20AC;&#x2122; >>> matchs[1].group(â&#x20AC;&#x2122;nameâ&#x20AC;&#x2122;) â&#x20AC;&#x2122; Annâ&#x20AC;&#x2122; >>> matchs[1].group(â&#x20AC;&#x2122;addressâ&#x20AC;&#x2122;) â&#x20AC;&#x2122; BUPTâ&#x20AC;&#x2122; >>> matchs[1].group(â&#x20AC;&#x2122;telephoneâ&#x20AC;&#x2122;) â&#x20AC;&#x2122; 62284321â&#x20AC;&#x2122; >>> matchs[1].group(â&#x20AC;&#x2122;addressâ&#x20AC;&#x2122;) â&#x20AC;&#x2122; BUPTâ&#x20AC;&#x2122; >>> matchs[1].group(â&#x20AC;&#x2122;emailâ&#x20AC;&#x2122;) â&#x20AC;&#x2122; CharlesWang@peoplemail.com.cnâ&#x20AC;&#x2122; 3ĂšÂ&#x2021;~f¼§^(?P<xxx>.*) Â&#x201C;O (.*)§Ă&#x2019;Â&#x152;Âą^m.group(â&#x20AC;&#x2122;xxxâ&#x20AC;&#x2122;)¢Ă&#x161;Â&#x161;group § Ă&#x2DC;´^group Ă&#x2019;è §3ĂŠE,regexp Â&#x17E;ÿ§wAOk^"ڍÂ?{ ´python gC*Ă?§Ă&#x161;Ă&#x2122;ÂŚÂ?{Ă&#x2DC;oN§f`Perl 5 Jø aqĂ&#x2026;Â&#x203A;§´Â?  ÂąÂ&#x2022; oNPython Â&#x201E;´3 ڍ*Ă?"3LÂŤOÂ&#x2020;Â&#x17E;ÿ§Ă&#x2019;^(?=<xxx>) 5Âżvk

regexp Ă&#x153;Š"X: (\b\w+)\s+\1 Ă&#x2019;LÂŤÂ&#x161;ĂŤYĂ&#x2018;yĂźÂ&#x2021;Ă&#x201C;Ăźc"Â&#x152;ÂąU¤ Â?§(?P<n>\b\w+)\s+(?=<n>)§´Â&#x2DC;Â&#x2021;Âżg"Â&#x201E;kÂ&#x2DC;ÂŤÂ?Y§¡Ă&#x153;uŽ²^group Ă&#x2019;è

§Â?´Â&#x17D;O\Â&#x2DC;Â&#x2021;group ´qĂ&#x2DC;Â&#x17D;KÂ?5Ă&#x2019;è^S"âÂ&#x160;Â&#x2030;Non-capture group" O\ Â&#x2DC;Â&#x2021;group§´Ă&#x2DC;Â?ŒŠĂ&#x2019;觴vkÂ?{3MatchObject ĂšÂ&#x2021;group  Â&#x161;Ă&#x153;Š "^(?:...)5LÂŤÂ&#x2DC;Â&#x2021;Non-capture group"Ă&#x2122;ÂĽ: LÚ)ĂťÂ?Y*Ă?Â? {"ĂšĂ&#x2DC;´Â&#x2021;Ă?Â?{"

§3.3.8 Compile Flag 3^re.compile RegxObject Â&#x17E;ÿ§Â&#x152;ÂąkÂ&#x2DC; flag ^5NRegxObject Â? [A" annCharles@tom.com

1115Â?,208Â?

Python Ă&#x2020;S)P


n Python ~^ DOTALL§S IGNORECASE§I LOCALES§L MULTILINE§M VERBOSE§X

4. Â&#x161;?ÂżiĂ&#x17D;§Â?)Â&#x2020;1Ă&#x17D;\n Ă&#x2018;Â&#x152; 4\w!\W!\b!\B Ă&#x161;clocaleÂ&#x2DC;Â&#x2014; Ăľ1ª§Â?KÂ?^Ă&#x161;$ verbose ÂŞ

§3.4 ^structÂŹ?n?Â&#x203A;êâ C Â&#x160;Ăł§S Â&#x152;UkĂš²{§½Ă&#x201A;Â&#x2DC;Â&#x2021;struct §,

Â&#x2020;^eÂĄÂ?ÂŞ?n"

struct{ ... } header; write(fd,(void*) &header,sizeof(struct)); read(fd,(void*) &header,sizeof(struct)); 3Ă&#x2013;?Â&#x203A;ŠÂ&#x2021;§X(Ă&#x2018;§ã¥§ãÂ&#x201D;§ŒÂ&#x201A;Â&#x2DC;Â&#x201E;Ă&#x2018;kÂ&#x2DC;Â&#x2021;ŠÂ&#x2021;Ă&#x17E;Â&#x201A;ÂŞ"ڍÂ?{4 Â?¡^"Â&#x201E;k3?näĂ?&§SÂ&#x17E;ÿ§Â?´Êk^"Python Â?kaq?nÂ?{" Â&#x2026;ĂŠ{Ăźk§Â?Â&#x2021;struct ÂŹÂĽpack§unpack§Ă&#x161;cacsize Ă&#x2019;t½ "ÂŚ^ĂšÂ&#x2021; ÂŹÂ&#x17E;ÿ§þIÂ&#x2021;ĂŠC Â&#x160;Ăłk

)"wÂ&#x2021;~f: $cat a.c #include <stdio.h> struct testheader{ int version; char tag[4]; } ; struct testheader header={0x00010002,"WAVE"}; int main(int argc, char **argv) { FILE * fp = fopen("test.dat","wb"); if(!fp) return 1; fwrite((void*)&header,1,sizeof(header),fp); fclose(fp); return 0; } $gcc -o x a.c $./x $xxd test.dat 0000000: 0200 0100 5741 5645 annCharles@tom.com

1116Â?,208Â?

....WAVE Python Ă&#x2020;S)P


§3.4 ^structÂŹ?n?Â&#x203A;êâ Â&#x2DC;Â&#x2021;C §S§ Â&#x2DC;Â&#x2021;ŠÂ&#x2021;Ă&#x17E;"Â?šÂ&#x2021;&EĂ&#x161;Â&#x2DC;Â&#x2021;iĂ&#x17D;~Ăž"xxd Â&#x152;ÂąwÂŤ?Â&#x203A;Š Â&#x2021;"little endian Â&#x201A;ÂŞ" >>> import struct >>> data = open(â&#x20AC;&#x2122;test.datâ&#x20AC;&#x2122;,â&#x20AC;&#x2122;rbâ&#x20AC;&#x2122;).read() >>> start,stop = 0 , struct.calcsize(â&#x20AC;&#x2122;hh4sâ&#x20AC;&#x2122;) >>> ver1,ver2,tag= struct.unpack(â&#x20AC;&#x2122;hh4sâ&#x20AC;&#x2122;,data[start:stop]) >>> ver 2 >>> subver 1 >>> tag â&#x20AC;&#x2122;WAVEâ&#x20AC;&#x2122; ĂšÂ&#x2021;~f¼§Â&#x152;Âą?Â&#x203A;ŠÂ&#x2021;Ă&#x17E;&E"unpack 1Â&#x2DC;Â&#x2021;ĂŤĂŞ^uÂŁĂŁstruct ( §1Â&#x2021;Íê´Ă&#x2018;\?Â&#x203A;êâ" Â&#x201A;ª½Ă&#x201A;XL3.4-4" L3.4-4kAÂ&#x2021;Â&#x160;5Âż/Â?" Â&#x201A;ÂŞ x c b B h H i I l L q Q f d s p P

C Â&#x160;Ăła.

Python a.

char char signed char unsigned char signed short unsigned short signed int unsigned int signed long unsigned long signed long unsigned long float double char[] char[] void*

Ă&#x192;(LÂŤWÂżi!) Ă?Â?1iĂ&#x17D;G Integer Integer Integer Integer Integer Integer Integer Integer Integer Integer Float Float String String Integer

L 3.4-4: struct ÂŹÂĽÂ&#x201A;ª½Ă&#x201A;

annCharles@tom.com

1117Â?,208Â?

Python Ă&#x2020;S)P


n Python ~^ÂŹ iĂ&#x17D; @ = < > !

i!^S

Ă?Ă&#x161;ĂŠĂ Â?ÂŞ

native native little-endian big-endian network (= big-endian)

native standard standard standard standard

L 3.4-5: i!^S½Ă&#x201A; â&#x20AC;˘ q§Q Â?k3Ă&#x2026;ĂŹ|Âą64  ÜÂ&#x160;Â&#x17E;ÿâkÂżĂ&#x201A;" â&#x20AC;˘ zÂ&#x2021;Â&#x201A;ÂŞcÂĄÂ&#x152;ÂąkÂ&#x2DC;Â&#x2021;ĂŞi§LÂŤĂľÂ&#x2021;"XÞ¥~fÂĽÂ&#x152;Âą¤" >>> struct.unpack(â&#x20AC;&#x2122;2h4sâ&#x20AC;&#x2122;,data[start:stop]) (2, 1, â&#x20AC;&#x2122;WAVEâ&#x20AC;&#x2122;) â&#x20AC;˘ x LÂŤW¿ §vkĂ&#x2018;Ă&#x2018;(J"X >>> struct.unpack(â&#x20AC;&#x2122;xxh4sâ&#x20AC;&#x2122;,data[start:stop]) (1, â&#x20AC;&#x2122;WAVEâ&#x20AC;&#x2122;) â&#x20AC;˘ s Â&#x201A;ÂŞĂ&#x2019;´LÂŤÂ&#x2DC;½Ă?iĂ&#x17D;G§4sLÂŤĂ?Â?4iĂ&#x17D;G"´p Ă&#x2DC;Ă&#x201C;§ŒL ÂŤâ&#x20AC;&#x153;Pascal Stringâ&#x20AC;?§?Â&#x203A;ê⼧ Â&#x2DC;Â&#x2021;i!LÂŤiĂ&#x17D;GĂ?§ Â&#x152;256§ ¥â´ TĂ?iĂ&#x17D;G" â&#x20AC;˘ P ^Ă&#x161;Ă&#x2026;ĂŹÂ&#x192;'Ă?§=Â&#x2020;Â&#x2DC;Â&#x2021;Â?"64  Ă&#x2026;ĂŹ^long integer§32  ^integer" 3"Â&#x17D;Â&#x153;še§struct ÂŹÂ&#x160;â/Ă&#x2026;ĂŹi!^S=Â&#x2020;§Â?Ă&#x2019;´`§Intel CPU ^little-endian§SPARC  CPU ^big-endian"i!ĂŠĂ Â?ÂŞĂ&#x161;/C Â&#x160;Ăł?Ă&#x2C6;ĂŹÂĽ ĂŠĂ Â?ª´Â&#x2DC;Â&#x2014;"Â&#x201E;Â&#x152;Âą^Â&#x201A;ÂŞÂĽ1Â&#x2DC;Â&#x2021;iĂ&#x17D;5UCڍÂ?ª§XeL3.4-5: ~X: >>> data â&#x20AC;&#x2122;\x02\x00\x01\x00WAVEâ&#x20AC;&#x2122; >>> struct.unpack(â&#x20AC;&#x2122;!hh4sâ&#x20AC;&#x2122;,data) (512, 256, â&#x20AC;&#x2122;WAVEâ&#x20AC;&#x2122;) >>> struct.unpack(â&#x20AC;&#x2122;<hh4sâ&#x20AC;&#x2122;,data) (2, 1, â&#x20AC;&#x2122;WAVEâ&#x20AC;&#x2122;) pack Ă&#x161;unpack ĂśÂ&#x160;Â&#x192;Â&#x2021;"

§3.5 ^Cmd ÂŹ?{Ăź¡-1Â? Â&#x152;Âą3/usr/lib/python2.2 eĂŠcmd.py§^ÂŚÂ&#x152;¹Ê{Ăź?Â&#x2DC;Â&#x2021;¡-1Â?§ ^uÂ&#x152;.§Sÿà §½ÜÂ&#x2020;Ă&#x2019;ÂŚ^ڍÂ?§Â&#x160;Â? ªÂŹ" annCharles@tom.com

1118Â?,208Â?

Python Ă&#x2020;S)P


§3.5 ^Cmd ÂŹ?{Ăź¡-1Â? Â? ÂŻÂ&#x201E;mu§S.§^uÂą muĂ&#x201E;:§Ú{ĂźÂ?rÂ&#x152; Â&#x2026;¡^§~ XGDB§Python p)ºÏ§Bash §Octave §Gnuplot §Ă&#x2019;´ÚÂ?" Cmd ÂŚ^ readline ¼§Ú¤k¹Þóä¼~^¡-1?6¡-Ă&#x2018;´üÂ&#x160;^§ Â&#x201E;k{¤?6ĂľU"XL3.5-6ÂĽÂ?š ~^Â&#x2DC; ĂľUÂ&#x2026;"Ăš 3¤kÂŚ^readline óä Ă&#x2018;´Ă?^§Â?)Þ¥Jgnuplot §S" ÂŁĂ&#x201E;1Ă&#x201E; ÂŁĂ&#x201E;1Â&#x2014; Ă­Ă&#x2DC;1Ă&#x201E; Ă­Ă&#x2DC;ĂžÂ&#x2DC;Â&#x2021;cÂ&#x160; Ă&#x160;bĂ­Ă&#x2DC;SN Â&#x2022;Â&#x2020;ÂŁĂ&#x201E;Â&#x2DC;Â&#x2021;Â&#x201A; Â&#x2022;mÂŁĂ&#x201E;Â&#x2DC;Â&#x2021;Â&#x201A; Â&#x2022;Â&#x2020;ÂŁĂ&#x201E;Â&#x2DC;Â&#x2021;Ăźc Â&#x2022;mÂŁĂ&#x201E;Â&#x2DC;Â&#x2021;Ăźc

C-a C-e C-u C-w C-y C-f C-b M-f M-b

L 3.5-6: ¡-1?6ÂŻ$Â&#x2026; Cmd ´XdĂĄ§4¡Â&#x152;ÂŻÂ&#x2DC;¯§cmd.pyk269 1§Â&#x201E;Â?)47 1Š "ĂŤ cmd.py  Â&#x201C;èÂ?Ăľ&E"

§3.5.1 {Ăź~f Â&#x201C;èdemo cmd.py XeÂľ # l cmd.py \ class Cmd from cmd import * # ½Ă&#x201A; Cmd fa class CmdInterface(Cmd): # ½Ă&#x201A;Â&#x2DC;Â&#x2021;¡# argc ´ÚÂ&#x2021;¡-¡-1ĂŤĂŞ def do_say_hello(self,argc): print "hello! " + argc if __name__=="__main__" : # welcome ½Ă&#x201A;XĂ&#x161; H&E welcome ="welcome a simple command interface demo demo" # ?\¡-)ÂşĂ&#x152;Â&#x201A;§Ă&#x2013;Â&#x2DC;Â&#x2021;¡-ÂżÂ&#x2026;)ÂşÂ&#x2030;1" CmdInterface().cmdloop(welcome) $1(J: annCharles@tom.com

1119Â?,208Â?

Python Ă&#x2020;S)P


n Python ~^ÂŹ %python demo_cmd.py welcome a simple command interface demo demo (Cmd) help Undocumented commands: ====================== help say_hello (Cmd) say_hello hello! (Cmd) say_hello Charles hello! Charles zÂ&#x2DC;Â&#x2021;¡-Ă&#x2018;´Â&#x2DC;Â&#x2021;¤ Ÿê§XJ½Ă&#x201A; do_foo ĂšÂ&#x2DC;Â&#x2021;¤ Ÿê§@o-foo ĂšÂ&#x2021;¡-Â&#x17E;ÿ§Ă&#x2019;ÂŹN^do_foo"argc Ă&#x2019;´foo xxx ÂĄÂ&#x2039;¤k¡-1ꐤxxx" cmd_loopLÂŤ?\¡-Ă&#x152;Â&#x201A;§Ă&#x2013;Â&#x2DC;Â&#x2021;¡-1§)º¡-1§ÊĂ&#x153;¡¤ Ÿê§ Â&#x2030;1¤ Ÿê"cmd_loop Â&#x201E;Â&#x2030;ĂŠĂľĂ&#x2122;ÂŚÂŻÂ&#x153;"~XN^readline ÂĽ" Cmd "Â&#x17D;Jøhelp ¡-§^uJø3Â&#x201A;Â?Ă?"

§3.5.2 ½Ă&#x201A;%@¡XJĂ&#x2018;\ Â&#x2DC;Â&#x2021;¡-§ÊĂ&#x2DC;ĂŠA¡-?nŸê§Ă&#x2019;ÂŹÂ&#x2030;1default(self,line) Ă&#x2122; ÂĽline LÂŤĂ&#x2018;\¡-1" Cmd Jø%@Ă&#x201E;Â&#x160;´ print â&#x20AC;&#x2122;*** Unknown syntax:â&#x20AC;&#x2122;, line

§3.5.3 ?nEOF Ăž ÂĄ  § S k Â&#x2DC; Â&#x2021; f ž § Ă&#x2019; ´ Ă&#x2DC; U  ~ ò Ă&#x2018; " Â&#x2DC; Â&#x201E; § S -  Š Â&#x2021; ( ĂĽ Ă&#x17D; Ă&#x2019;EOF (Control-D)§L§SATòĂ&#x2018; "XJ % echo "say_hello Charles" | python demo_cmd.py Ă&#x2019;ÂŹkkĂ&#x152;Â&#x201A;" \ĂžEOF ?nĂ&#x2019;Â&#x152;Âą~òĂ&#x2018; " def do_EOF(self,arc): return 1 do_EOF ÂŹ3-ŠÂ&#x2021;(ĂĽÂ&#x17E;ÿÂ&#x2030;1"3lIOĂ&#x2018;\Ă&#x2013;\Â&#x17E;ÿ§Control-DLŠ Â&#x2021;(ĂĽ"?Ă&#x203A;Â&#x2DC;Â&#x2021;do_xxx ŸêXJÂ&#x2C6;ÂŁĂ˝Â&#x160;§Ă&#x2019;LÂŤÂ&#x2021;òĂ&#x2018;cmd_loop" Â&#x201E;Â&#x152;ÂąĂ&#x2018;\â&#x20AC;&#x153; exitâ&#x20AC;? òĂ&#x2018;" annCharles@tom.com

1120Â?,208Â?

Python Ă&#x2020;S)P


§3.5 ^Cmd ÂŹ?{Ăź¡-1Â? def do_exit(self,arc): return 1

§3.5.4 ?nÂ&#x2DC;¡3"Â&#x17D;Â&#x153;še§{ĂźUÂ&#x2DC;Â&#x2021;ÂŁÂ?§Ă&#x2018;\Â&#x2DC;Â&#x2021;Â&#x2DC;1§LÂŤÂ&#x2030;1ĂžÂ&#x2DC;^¡-" XJÂ&#x17D;UCڍ?n§@o½Ă&#x201A;eÂĄŸê: def emptyline(self): pass Ă&#x2018;\Â&#x2DC;1Â&#x17E;ÿ§Â&#x2030;1emptyline"

§3.5.5 ¡-1gĂ&#x201E;Ă&#x2013;Ă ĂšÂ&#x2021;ĂľU´ åĂ&#x161;<ĂľU§Œ^Bash <~~ÂŚ^tab Â&#x2026;§^ugĂ&#x201E;Ă&#x2013;àŠÂ&#x2021;Âś ¥§Ă&#x161;Ă&#x2122;ÂŚĂŤĂŞ" "Â&#x17D;Ă&#x2013;Ă ĂľU´Ă&#x2013;Ă c8š¼ŠÂ&#x2021;ϴ" \\eÂĄŸêÂ&#x152;ÂąUC"Â&#x17D;Ă&#x201E;Â&#x160;: def complete_say_hello(self,text,line,begingidx,endidx): x=["Charles","Smith","Tom"] return [ k for k in x if k.find(text)==0] XJĂ&#x2018;\â&#x20AC;&#x153;say helloâ&#x20AC;? Charles

Smith

UĂźgtab §Ă&#x2019;ÂŹĂ&#x2018;y

Tom

^uJÂŤ^rĂ&#x2013;Ă ¡-"XJĂ&#x2018;\â&#x20AC;&#x153;Câ&#x20AC;? ,

Utab Â&#x2026;§Ă&#x2019;ÂŹgĂ&#x201E;Ă&#x2018;\â&#x20AC;&#x153;Charlesâ&#x20AC;?"

complete_say_hello ==^usay_hello ¡-gĂ&#x201E;Ă&#x2013;Ă ĂľU"text LÂŤ^rĂ&#x2018;\ ĂźcmĂ&#x17E;§lineLÂŤc¡-1§beginidx LÂŤtext 3line ÂĽĂ&#x2018;y Â&#x2DC;"endidx LÂŤtext 3lineÂĽ(ü Â&#x2DC;"Ăš ĂŤĂŞÂ?^rJøv &E§^uJø¡-1Ă&#x2013;Ă  ĂľU" XJĂ&#x2DC;F"^tab Â&#x2026;5Ă&#x2013;à¡-§@oÂ&#x152;ÂąĂ?LinitŸêUCĂšÂ&#x2021;Â&#x2026;" x=CmdInterface("?") UÂ?â&#x20AC;&#x153;?â&#x20AC;? ^u¡-1Ă&#x2013;Ă "

§3.5.6 UCIOĂ&#x2018;\Ă&#x2018;Ă&#x2018; init Â&#x201E; Â&#x152; Âą J ø U C I O Ă&#x2018; \ Ă&#x161; I O Ă&#x2018; Ă&#x2018;  Ă&#x2026; ÂŹ " " Â&#x17D;  Â&#x153; š e § ÂŚ Â&#x201A; Š O ´sys.stdin Ă&#x161;sys.stdout" annCharles@tom.com

1121Â?,208Â?

Python Ă&#x2020;S)P


n Python ~^ÂŹ

§3.5.7 UCJÂŤĂ&#x17D; Cmd "Â&#x17D;JÂŤĂ&#x17D;´â&#x20AC;&#x153;Cmdâ&#x20AC;? §Â&#x152;ÂąĂ?LUCprompt ĂĄ5§UC¡-1JÂŤĂ&#x17D;"~ X: x=CmdInterface() x.prompt="?" x.cmdloop(welcome)

§3.5.8 Jø3Â&#x201A;Â?Ă?ĂľU [%Ă&#x2013;܎²uy§help ¡-Ă&#x2018;Ă&#x2018;ÂĽkâ&#x20AC;&#x153;Undocumented commands:â&#x20AC;?" Cmd 3Â&#x201A;Â?Ă?r¡-ŠÂ?nÂŤ" â&#x20AC;˘ Undocumented commands: Ă&#x2019;´vkJø?Ă&#x203A;Â?Ă?&E¡-" â&#x20AC;˘ Documented commands: Ă&#x2019;´JøÂ?Ă?&E¡-" â&#x20AC;˘ Miscellaneous help topics: Ă&#x2019;´Jø Â?Ă?&E§´vkÂ&#x2020;Â&#x192;ĂŠA¡-"^uJøÊÂ&#x2DC;|¡-§½ÜÂ&#x2030;Â&#x2DC; Â&#x2021;Ă&#x152;Ktopic Â?Ă?" Ă?Â?¡Â&#x201A;vkÂ?say_hello Jø?Ă&#x203A;Â?Ă?&E§@oÂŚĂ&#x2019;´Undocumented commands. XJ¡Â&#x201A;½Ă&#x201A;¤ Ÿê: def help_say_hello(self): print """ say_hello [<person>] say hello to somebody """ say_hello Ă&#x2019; C ¤ Documented commands. 1help_say_hello"

Ă&#x2018; \â&#x20AC;&#x153; help say helloâ&#x20AC;? Ă&#x2019; ÂŹ Â&#x2030;

XJ¡Â&#x201A;½Ă&#x201A;: def help_test(self): print """ this is only a test topic """ â&#x20AC;&#x153;testâ&#x20AC;? Ă&#x2019;¤Â?Miscellaneous help topics"Â&#x152;ÂąĂ&#x2018;\â&#x20AC;&#x153;help testâ&#x20AC;? Â&#x2030;1help_test Â&#x152;ÂąĂ?Lâ&#x20AC;&#x153;?testâ&#x20AC;? â&#x20AC;&#x153;?say helloâ&#x20AC;? Â&#x2DC;J" annCharles@tom.com

1122Â?,208Â?

Python Ă&#x2020;S)P


§3.5 ^Cmd ÂŹ?{Ăź¡-1Â?

§3.5.9 $1Shell ĂľU ¡Â&#x201A;½Ă&#x201A;: def do_shell(self,argc): import os os.system(arg) Â&#x152;ÂąĂ&#x2018;\â&#x20AC;&#x153;shell lsâ&#x20AC;? ½Üâ&#x20AC;&#x153;!lsâ&#x20AC;?§Â&#x2030;1shell ¤ Ÿê"

§3.5.10

getattr ĂľUÂŚ^

getattr ŸêÂŚ^§´Cmd ÂŹÂĽ'Â&#x2026;Eâ" ¡Â&#x201A;Â&#x2DC;Â&#x201E;¡-1)Âş§S§Ă&#x2018;´Â&#x2021;Â&#x2030;Â&#x2DC;Â&#x2021;L§^5ĂŠAzÂ&#x2DC;Â&#x2021;¡-§Ă&#x161;Â&#x192;A ¡-?nŸê§´Cmd ¼§Â?Â&#x2021;½Ă&#x201A;¡-?nŸêĂ&#x2019;Â&#x152;Âą §´No¢yQÂş def onecmd(self, line): # line ´^rĂ&#x2018;\¡-1" # r line Š)¤Â?¡-Ă&#x153;ŠĂ&#x161;ĂŤĂŞĂ&#x153;Š" cmd, arg, line = self.parseline(line) try: # Âą do_cmd Â&#x201A;ÂŞmĂ&#x17E;ŸêÊÂ&#x2013;" func = getattr(self, â&#x20AC;&#x2122;do_â&#x20AC;&#x2122; + cmd) except AttributeError: return self.default(line) # N^ func ĂŠÂ&#x2013;" return func(arg) dÞ¥Â&#x2DC;ĂŁÂ&#x201C;è§Â&#x152;Âąwgetattr ÂŚ^´'Â&#x2026;"ڍA5ÂŚ§SÂ&#x152;ÂąĂ&#x201E; ĂŠÂ&#x2013;¤k¤ " Ăš ĂŁ Â&#x201C; è k Â&#x2DC; Â&#x2021;   ÂŻ K § Ă&#x2019; ´ v k ĂŠ   func Â&#x160; u  § X J U  äcallable(func) Ă&#x2019; ÂŹ Â? Ă? § Ă&#x2DC; , § f a ½ Ă&#x201A; do_cmd  ´ ¤ Âź ĂŞ § ´ ¤ C Þ§@oĂ&#x2019;ÂŹ)Ă&#x2030;~" Ă&#x201C;§Â?Ă?&E)¤§Â?ÂŚĂ&#x17D;help_cmd Â&#x201A;ÂŞ¤ Ÿê" Â?Ă?ŠaÂ?´Ă&#x161;getattr k'X" â&#x20AC;˘ Undocumented commands: kdo_cmd Â&#x201A;ÂŞ¤ Ÿê§´vkhelp_cmd Â&#x201A;ÂŞ¤ Ÿê" â&#x20AC;˘ Documented commands: kdo_cmd Â&#x201A;ÂŞ¤ Ÿê§Â?khelp_cmd Â&#x201A;ÂŞ¤ Ÿê" annCharles@tom.com

1123Â?,208Â?

Python Ă&#x2020;S)P


n Python ~^ÂŹ â&#x20AC;˘ Miscellaneous help topics: vkdo_cmd Â&#x201A;ÂŞ¤ Ÿê§´khelp_cmd Â&#x201A;ÂŞ¤ Ÿê" Ăš§§SÂ&#x17E;ĂżĂ&#x2DC;IÂ&#x2021;Â?Â&#x2C6;ÂŤa.Â?Ă?ŸêÂ&#x2030;Ša§§SĂ&#x2019;Jø v & E§^uŠa"

§3.6 ?n¡-1Ă&#x20AC;Â&#x2018; Ă&#x2122;GUnix <Ă&#x2018;§Unix ekÊþ¡-Ă&#x2018;´Â&#x152;Âą?nÊþÊþ¡-1Ă&#x20AC;Â&#x2018;§^uÂ&#x203A; Â&#x203A;§S1Â?§Ă&#x161;Â?²§SÂ&#x2021;?nŠÂ&#x2021;ϴ"X: ls -l -a grep -i a somefile getopt Ă&#x2019; ´ Â? B § S ? n ¡ - 1 ĂŤ ĂŞ  Â&#x2DC; Â&#x2021;module "getopt.py 3/usr/lib/python2.2/ e

§3.6.1 Â&#x2DC;Â&#x2021;{Ăź~f Â&#x201C;èdemo_getopt.py #\ getopt from getopt import * import sys opts,args = getopts(sys.argv[1:],"a","--all") print opts print args $1(J: %python demo_getopt.py -a f [(â&#x20AC;&#x2122;-aâ&#x20AC;&#x2122;, â&#x20AC;&#x2122;â&#x20AC;&#x2122;)] [â&#x20AC;&#x2122;fâ&#x20AC;&#x2122;] %python demo_getopt.py [] [] %python demo_getopt.py --all [(â&#x20AC;&#x2122;--allâ&#x20AC;&#x2122;, â&#x20AC;&#x2122;â&#x20AC;&#x2122;)] [] %python demo_getopt.py -x Traceback (most recent call last): File "demo_getopt.py", line 4, in ? annCharles@tom.com

1124Â?,208Â?

Python Ă&#x2020;S)P


§3.6 ?n¡-1Ă&#x20AC;Â&#x2018; opts,args = getopt(sys.argv[1:],"a","all") File "/usr/local/lib/python2.3/getopt.py", line 91, in getopt opts, args = do_shorts(opts, args[0][1:], shortopts,args[1:]) File "/usr/local/lib/python2.3/getopt.py", line 191, in do_shorts if short_has_arg(opt, shortopts): File "/usr/local/lib/python2.3/getopt.py", line 207, in short_has_arg raise GetoptError(â&#x20AC;&#x2122;option -%s not recognizedâ&#x20AC;&#x2122; % opt, opt) getopt.GetoptError: option -x not recognized lÞ¥~fÂ&#x152;ÂąwĂ&#x2018;§getopt IÂ&#x2021;k3 Â&#x2021;ĂŤĂŞĂ&#x2018;\" â&#x20AC;˘ sys.argv[1:] Â&#x2021;)Âş¡-1Ă&#x20AC;Â&#x2018;"Ă&#x2DC;Â?)¡-" â&#x20AC;˘ "a" ĂĄĂ&#x20AC;Â&#x2018; ĂĄĂ&#x20AC;Â&#x2018;´^Â&#x2DC;Â&#x2021;â&#x20AC;&#x153;-â&#x20AC;? ŠÂ&#x2026;Ă&#x20AC;Â&#x2018;œ¥§Ă&#x2019;Â&#x2013;ls -a ÂĽa Â&#x2DC;"Â?^Â&#x2DC;Â&#x2021;i1LÂŤ" â&#x20AC;˘ ["all"] LÂŤĂ&#x20AC;Â&#x2018;" XJÂ?kÂ&#x2DC;Â&#x2021;Ă&#x20AC;Â&#x2018;§@oĂ&#x2019;Â&#x2020;¤Â&#x2DC;Â&#x2021;iĂ&#x17D;G§XJĂ&#x2DC;Â?Â&#x2DC;Â&#x2021;Ă&#x20AC;Â&#x2018;§@oĂ&#x2019;Â&#x2021; ¤iĂ&#x17D;Glist" Ă&#x192;Ă&#x2DC;ĂĄĂ&#x20AC;Â&#x2018;§Ă&#x2018;Ă&#x2DC;Â?)cÂĄâ&#x20AC;&#x153;-â&#x20AC;? ½Üâ&#x20AC;&#x153;â&#x20AC;&#x201C;â&#x20AC;?" getopt Â&#x2C6; ÂŁ Â&#x2DC; Â&#x2021;tuple§ š k Ăź Â&#x2021;  Â&#x192; §opts,args§args L ÂŤ v k ) Âş L sys.argv[1:] Ă&#x153;Š§Â&#x2DC;Â&#x201E;LÂŤIÂ&#x2021;?nŠÂ&#x2021;ϴ" opts LÂŤuyĂ&#x20AC;Â&#x2018;§´Â&#x2DC;Â&#x2021;list§list ÂĽzÂ&#x2DC;Â&#x2021;Â&#x192;´Â&#x2DC;Â&#x2021;tuple§LÂŤÂ&#x2DC;Â&#x2021;pair, (opt,val)§opt LÂŤ3¡-1ÂĽuyĂ&#x20AC;Â&#x2018;ϴ"val LÂŤĂ&#x20AC;Â&#x2018;¤ÊAĂŤĂŞ"XJ´ Â&#x2DC;iĂ&#x17D;G§LÂŤTĂ&#x20AC;Â&#x2018;vkĂŤĂŞ"opts ÂĽĂ&#x20AC;Â&#x2018;Ă&#x2018;y^SĂ&#x161;¡-1ĂžĂ&#x2018;y^S´Â&#x2DC; "#NĂ&#x20AC;Â&#x2018;­EĂ&#x2018;yĂľg" XJ3¡-1ĂžuyĂ&#x2DC;U)ÂşꐤKĂ&#x2018;GetoptError Ă&#x2030;~"GetoptError ÂĽ msgĂĄ5LÂŤĂ&#x2018;Â&#x2020;£ã§optĂĄ5LÂŤĂ&#x2DC;U)ÂşĂ&#x20AC;Â&#x2018;"

§3.6.2 Â&#x2018;kĂŤĂŞ¡-1Ă&#x20AC;Â&#x2018; ĂŠuĂĄĂ&#x20AC;Â&#x2018;§3Ă&#x20AC;Â&#x2018; getopt UÂ?"

ÂĄÂ&#x2039;Â&#x2DC;Â&#x2021;kĂ&#x2019;LÂŤĂšÂ&#x2021;Ă&#x20AC;Â&#x2018;IÂ&#x2021;ĂŤĂŞ"~X¾ÞÂ&#x2021;Â&#x2DC;Â&#x2021;~fÂĽ

getopt(sys.argv[1:],"a:","all") XJ¡-1ÂĽvkJøĂ&#x20AC;Â&#x2018;§Â&#x2DC;ÂŹĂ&#x2018;GetoptErrorĂ&#x2030;~"$1(J: annCharles@tom.com

1125Â?,208Â?

Python Ă&#x2020;S)P


n Python ~^ÂŹ %python demo_getopt.py -a Traceback (most recent call last): File "demo_getopt.py", line 4, in ? opts,args = getopt(sys.argv[1:],"a:","all") File "/usr/local/lib/python2.3/getopt.py", line 91, in getopt opts, args = do_shorts(opts, args[0][1:], shortopts, args[1:]) File "/usr/local/lib/python2.3/getopt.py", line 195, in do_shorts opt) getopt.GetoptError: option -a requires argument %python demo_getopt.py -a b [(â&#x20AC;&#x2122;-aâ&#x20AC;&#x2122;, â&#x20AC;&#x2122;bâ&#x20AC;&#x2122;)] [] ĂŠuĂ&#x20AC;Â&#x2018;§KÂ&#x2021;3Ă&#x20AC;Â&#x2018;ϴ

ÂĄ\Â&#x2DC;Â&#x2021;Ă&#x2019;"~X:

getopt(sys.argv[1:],"a:","all=") (J´: %python demo_getopt.py -a b --all xx file1 file2 [(â&#x20AC;&#x2122;-aâ&#x20AC;&#x2122;, â&#x20AC;&#x2122;bâ&#x20AC;&#x2122;), (â&#x20AC;&#x2122;--allâ&#x20AC;&#x2122;, â&#x20AC;&#x2122;xxâ&#x20AC;&#x2122;)] [â&#x20AC;&#x2122;file1â&#x20AC;&#x2122;, â&#x20AC;&#x2122;file2â&#x20AC;&#x2122;]

§3.6.3

optparser ÂŹ

optparser ´Python 2.3 Â&#x2018;Â&#x2DC;Â&#x2021;rÂ&#x152;!(š!´^!´*Ă?¡-1)ºÏ"ÂŚ ^optparser §Â?^ĂŠÂ&#x201C;è§Ă&#x2019;Â&#x152;ÂąÂ?\§SO\61§;Â&#x2019;¡-1Â?" ÂŚ'getopt ÂŹÂ?Ă?^" ĂšpkÂ&#x2DC;Â&#x2021;{Ăź~f #!/usr/bin/env python # simplyOptparser1.py from optparse import OptionParser parser = OptionParser(version="%prog 0.1 ") parser.add_option("-f", "--file", dest="filename", help="write report to FILE", metavar="FILE") parser.add_option("-q", "--quiet", action="store_false", dest="verbose", default=True, help="donâ&#x20AC;&#x2122;t print status messages to stdout")

annCharles@tom.com

1126Â?,208Â?

Python Ă&#x2020;S)P


§3.6 ?n¡-1Ă&#x20AC;Â&#x2018; (options, args) = parser.parse_args() D = vars(options) for i in D: print i,"=",D[i] Ăš§\§SĂ&#x2019;Â&#x201D;¤kGNU eóäÂ&#x2DC;§kĂŠĂľoption Â&#x152;¹Œ^" %./simplyOptparser1.py -f output --quiet verbose = False filename = output %./simplyOptparser1.py -qf output verbose = False filename = output %./simplyOptparser1.py -q --file=output verbose = False filename = output %./simplyOptparser1.py --quiet --file=output verbose = False filename = output %./simplyOptparser1.py --help usage: simplyOptparser1.py [options] options: --version show programâ&#x20AC;&#x2122;s version number and exit -h, --help show this help message and exit -fFILE, --file=FILE write report to FILE -q, --quiet donâ&#x20AC;&#x2122;t print status messages to stdout %./simplyOptparser1.py --version simplyOptparser1.py 0.1 % §SwĂĽ5ĂŠ;Â&#x2019;" optparser Ong optparser ÂŹOngĂŠÂ&#x152;§Ă?ĂžĂ&#x2030; Unix Ă&#x161;GNU eóä8KÂ?"y0 Â&#x2DC;

âÂ&#x160;: â&#x20AC;˘ argument (¡-1ĂŤĂŞ) annCharles@tom.com

1127Â?,208Â?

Python Ă&#x2020;S)P


n Python ~^ÂŹ %ls -l /usr Ă&#x2122; ÂĽ-l usr Ă&#x2019; ´ ¡ - 1 ĂŤ ĂŞ "sys.argv ´ Â&#x2DC; Â&#x2021;list § ^ u L ÂŤ ¡ - 1 " ~ f ¼§sys.argv Ă&#x2019;´ [â&#x20AC;&#x2122;lsâ&#x20AC;&#x2122;,â&#x20AC;&#x2122;-lâ&#x20AC;&#x2122;,â&#x20AC;&#x2122;/usrâ&#x20AC;&#x2122;] ¡-1ĂŤĂŞĂ&#x2019;´sys.argv[1:] §Ă?Â?sys.argv[0] L¡-" â&#x20AC;˘ option (¡-1Ă&#x20AC;Â&#x2018;) § S 3 Â&#x2030; 1  Â&#x17E; Ăż § largument   & E § ^ 5 N  § S  Â&#x2030; 1 " D Ă&#x161; Unix Ă&#x161;GNU ¡-1Â&#x160;{´: -q -f

--file --quiet

Â&#x2DC;Â&#x2021;~Ă&#x2019;§ ÂĄÂ&#x2039;Â&#x2DC;Â&#x2021;ĂĄĂ&#x20AC;Â&#x2018;§½ÜßÂ&#x2021;~Ă&#x2019;§ Ă&#x153;Âż3Â&#x2DC;ü§X-qf optionparser Ă&#x2DC;|ÂąeÂĄÂ&#x160;{"

ÂĄÂ&#x2039;Â&#x2DC;Â&#x2021;Ă&#x20AC;Â&#x2018;"ĂľÂ&#x2021;ĂĄĂ&#x20AC;Â&#x2018;Â&#x152;Âą

â&#x20AC;˘ Â&#x2DC;Â&#x2021;~Ă&#x2019; ÂĄÂ&#x2039;Â&#x2021;LĂźÂ&#x2021;iĂ&#x17D;¹ÞĂĄĂ&#x20AC;Â&#x2018;§X-pf§Ă&#x201E;KĂ&#x2019;ŠĂ&#x2DC;Â&#x2DC;Ă&#x2122;´-p -f Ăź Â&#x2021;Ă&#x20AC;Â&#x2018;§Â&#x201E;´-pf Â&#x2DC;Â&#x2021;Ă&#x20AC;Â&#x2018;" â&#x20AC;˘ Â&#x2DC; Â&#x2021; ~ Ă&#x2019; ÂĄ Â&#x2039; Â&#x2DC; Â&#x2021;  Ă&#x20AC; Â&#x2018; § X-file § Â&#x2039; Ăž ÂĄ a q § Ă&#x2019; v k Â? { Š Â&#x2DC; Ă&#x2122;

-file ´Â&#x2DC;Â&#x2021;Ă&#x20AC;Â&#x2018;Â&#x201E;´-f -i -l -e oÂ&#x2021;Ă&#x20AC;Â&#x2018;Âş â&#x20AC;˘ ^\Ă&#x2019;§Â&#x201C;O~Ă&#x2019;§X+f §+rgb §Ă&#x2DC;Ă&#x153;S." â&#x20AC;˘ ^mÂ&#x201C;O~Ă&#x2019;§~X/l §/rgb §Ú´Windows Ă&#x161;VMS ^{§´3Unix emLÂŤ8š§¤¹ls /lâ&#x20AC;&#x201D; Ă&#x2019;ŠĂ&#x2DC;Â&#x2DC;Ă&#x2122;´/l ´Ă&#x20AC;Â&#x2018;§Â&#x201E;´8šœ¥ " â&#x20AC;˘ option augument(Ă&#x20AC;Â&#x2018;ĂŤĂŞ) Â&#x201D;-f outputfile Ăš   Ă&#x20AC; Â&#x2018; § ÂĄ Â&#x2039; Â&#x2DC; Â&#x2021; ĂŤ ĂŞ §outputfile § L ÂŤ Ă&#x20AC; Â&#x2018;  ĂŤ ĂŞ"-foutputfile Ă&#x161;-f outputfile Ă&#x2018;Â&#x2DC;"kĂ&#x20AC;Â&#x2018;Ă&#x2DC;IÂ&#x2021;ꐤkĂ&#x20AC;Â&#x2018;7 LÂ&#x2030;Ă&#x2018;ĂŤĂŞ" ´Ă&#x201E;IÂ&#x2021;optional option argument (Â&#x152;Ă&#x20AC;Ă&#x20AC;Â&#x2018;ĂŤĂŞ)QÂşÂ?Ă&#x2019;´`§XJ ÂĄÂ&#x2039; ĂŤ ĂŞĂ&#x2019;@Â?ΫĂ&#x20AC;Â&#x2018;ꐤXJvk§Ă&#x2019;@Â?Ă&#x20AC;Â&#x2018;vkĂŤĂŞ"~X§bX-a Ă&#x20AC;Â&#x2018; ÂĄ koptional option argument: ls -a xxx -b LÂŤ-a Â&#x2018;kĂŤĂŞxxx § |ls -a -b| LÂŤ-a vkĂŤĂŞ"´§XJ´ls -ab @o¡Â&#x201A;TNo@Â?QºŠĂ&#x2DC;Â&#x2DC;Ă&#x2122; §¤ Âąoptionparser ÂŹĂ&#x2DC;|Âąoptional option argument " annCharles@tom.com

1128Â?,208Â?

Python Ă&#x2020;S)P


§3.6 ?n¡-1Ă&#x20AC;Â&#x2018; â&#x20AC;˘ positional argument ( Â&#x2DC;ĂŤĂŞ) 3¡-1Í꼧Ă&#x2DC; Ă&#x20AC;Â&#x2018;Âą §Â?eĂ&#x2019;´positional argument §Â&#x2DC;Â&#x201E;^uLŠ Â&#x2021;ϴ"~XÂľ ls -l /usr /lib Ă&#x2122;ÂĽÂĽ[â&#x20AC;&#x2122;/usrâ&#x20AC;&#x2122;, â&#x20AC;&#x2122;/libâ&#x20AC;&#x2122;] Ă&#x2019;´positional argument " â&#x20AC;˘ required option (7Ă&#x20AC;Â&#x2018;) ´Â?^r7LJøĂ&#x20AC;Â&#x2018;"Ú´Â&#x2021;Â&#x20AC;Ă&#x152;Âż"XJ\§SÂ&#x2021;ÂŚ^r7LJøÂ&#x2DC;

option § @ o Ăš ´ Â&#x2DC; Â&#x2021; ĂŠ Ă&#x2DC; Ă?   Â?  O § ĂŠ  k ^ r ÂŹ F %  Ă&#x2018; \ ¤ k \ Â&#x2021;option ",\XJÂ&#x2DC;½Â&#x2021;ĂšoÂ&#x2030;§Â?´qÂ?{" ~f: ¡-1 Âľprog -v --report /tmp/report.txt foo bar ¡-ϴ : prog argument ¡-1ĂŤĂŞ: -v --report /tmp/report.txt foo bar option : -v --report option argument : /tmp/report.txt positional argument : foo bar O¡-1Â?RÂŻ â&#x20AC;˘ Â&#x2021;ÂŚ^rJø7LJø&EĂ?"XJvkoption §§SÂ?Â&#x152;Âą~$ 1"Â&#x152;þêUnix Ă&#x161;GNU óäĂ&#x2018;´Ú"Ă&#x2DC; find, tar, dd §Êþ<1¾Ú

§S¡-1Â?Ă&#x2DC;IO§N´Ă&#x161;ü¡ " â&#x20AC;˘ Ă&#x2DC;Â&#x2021;k7Ă&#x20AC;Â&#x2018;required option "XJ^r7LJøÚ &E§@oÂŚÂ&#x201A;Ă&#x2019;Ă&#x2DC;´Â&#x152;k Â&#x152;Ă&#x192;Ă&#x20AC;Â&#x2018; § ´positional argument " â&#x20AC;˘ zÂ&#x2021;option Ă&#x2018;ATkĂ&#x153;n%@Â&#x160;" â&#x20AC;˘ ĂĄoption Â&#x192;pĂ&#x153;§Â&#x2DC;Â&#x2DC;ĂŠA"ĂĄ´upÂŞĂ&#x2018;\Â?B§Â&#x152;ÂąJp §S Â&#x152;Ă&#x2013;5"¤¹§pÂŞshell ¼§Ă&#x2018;\ls -l 'Ă?"´31?n §S ¼§ Ă?¤--long " ~X: cp ¡cp SOURCE DEST cp SOURCE ... DESTDIR \Ă&#x2DC;^?Ă&#x203A;Ă&#x20AC;Â&#x2018;§cp oU¤ŒĂ&#x152;Â&#x2021;?Ă&#x2013;§rÂ&#x2DC;Â&#x2021;ŠÂ&#x2021;Â&#x20AC;¤Â?,Â&#x2DC;Â&#x2021;ŠÂ&#x2021;§½ÜrÂ&#x2DC; ̊Â&#x2021;Â&#x20AC;Â&#x2DC;Â&#x2021;8š¼",§\Â?Â&#x152;ÂąÂ?½ÊþĂ&#x20AC;Â&#x2018;§^uÂ?½´Ă&#x201E;3ŠÂ&#x2021;  §´Ă&#x201E;3?UÂ&#x17E;m§´Ă&#x201E;Â&#x2039;Â&#x2018;Ăł§´Ă&#x201E;48Â&#x20AC;8š§´ŒÂ&#x201A;Ă&#x2018;Ă&#x2DC;KÂ?cp  $1" annCharles@tom.com

1129Â?,208Â?

Python Ă&#x2020;S)P


n Python ~^ÂŹ positional argument Â&#x2DC;Â&#x201E;´§S7I&E",§k Êþ§SĂ&#x2DC;IÂ&#x2021;?Ă&#x203A;&E§Â? Â&#x152;¹ÊĂ?$1§~Xcat, sort, cut, grep, sed, awk, head, tail, ed, uniq, fold, wc, fmt,split, od, xxd, sum, §ŒÂ&#x201A;Ă&#x2018;Ă&#x201A;positional argument ÂĽĂŤĂŞÂ&#x160;Â?Ă&#x2018;\ŠÂ&#x2021;œ¥§´ XJvkÂ?½Ă&#x2018;\ŠÂ&#x2021;œ¥§@oĂ&#x2019;lIOĂ&#x2018;\Ă&#x2013;"Ăš¡-Â&#x161;~Ă?§Ă&#x161;+Ă&#x2026;Â&#x203A;Ă&#x153; ĂĽ5§%ĂĽĂ&#x192;ÂĄ" k §S§K7LÂ&#x2021;Â&#x2030;Ă&#x2018;Ăš &E§Xdiff, join, tr, Ă?Â?Ăš §S"

7&E§Ă&#x2019;Ă&#x2DC;U¤§?Ă&#x2013;"X: diff 7LÂ&#x2021;Â&#x2030;Ă&#x2018;ĂźÂ&#x2021;ŠÂ&#x2021;œ¥§Ă&#x201E;KÂŚ'Â&#x;o Q? join ´rĂźÂ&#x2021;ŠÂ&#x2021;Ă&#x153;¿§¤¹7LÂ&#x2030;Ă&#x2018;ĂźÂ&#x2021;ŠÂ&#x2021;ϴ"tr ´Â&#x20AC;Ă&#x2C6;ĂľU§7L`²rÂ&#x;o Â&#x20AC;Ă&#x2C6;¤Â&#x;o§ŒâUĂłÂ&#x160;"¤¹Ú 7ĂŤĂŞĂ&#x2018;Â&#x160;Â?positional argument" cut 3ĂšÂ&#x2DC;:ĂžÂ&#x2030;Ă&#x2DC;Ă?§ %cut cut: you must specify a list of bytes, characters, or fields Try â&#x20AC;&#x2DC;cut --helpâ&#x20AC;&#x2122; for more information. Ú´Â&#x2DC;Â&#x2021;~ §cut Â&#x2DC;½Â&#x2021;^rJø&E§NJĂ&#x2018;lĂ&#x2018;\ÂĽJĂ&#x2018;eZ"^rkþ Ă&#x20AC;J§Â?²Ui!byte§iĂ&#x17D;character Â&#x201E;´iĂŁfield Ă&#x20AC;JÂ&#x2DC;Ă&#x153;Š"¡@Â?ATkÂ&#x2DC;Â&#x2021;%@ Ă&#x201E;Â&#x160;cut -f 1 §Â?NĂšĂ&#x2DC;´ÊĂ?Â&#x2DC;Â&#x2021;Ă&#x20AC;J§½Ü%@Ă&#x201E;Â&#x160;´cut -b1 §cut -c1 §´ Ă&#x192;¤¢§oÂ&#x192;ATJøÂ&#x2DC;Â&#x2021;%@Ă&#x201E;Â&#x160;§OĂş ^r%§O4^rÂ&#x201D;F%" b§\§SÂ&#x2021;ÂŚ^rJø17 Ă&#x2DC;Ă&#x201C;&E§§SâU¤þĂłÂ&#x160;§Ă&#x192;Ă&#x2DC;\JøÂ&#x; o.¥§´command line, GUI Ă&#x2018;Â&#x2DC;§@oAvk<kF%$1\§S§$Â&#x2013;Â? )\gC" ,§#N^rJøoption þ§\§S(š5Ă&#x2019;Ă?§§SÂ?Ă&#x2019;J¢y" Jøoption Â?ªÊþ§Â&#x152;¹´Â&#x2DC;ŠÂ&#x2021;Â?ª§Â&#x152;¹´3èßÞĂ&#x20AC;JPreferences §, Ă&#x20AC;JÂ&#x2DC;Â&#x2021;Ă&#x20AC;Ă&#x153;"Â&#x201E;Â&#x152;¹´¡-1ĂŤĂŞÂ?ª§Ă&#x192;Ă&#x2DC;=ÂŤÂ?ÂŞÂ?Ă?§Â&#x2021;%O§Ă&#x201E;KĂ&#x2019;N´ 'Ă&#x17E;§Â?)\gC"Â&#x17D;Â&#x2013;k§SÂ&#x2030;Ă&#x2018;1000 Â&#x2021;option §, 4\?UĂ&#x2122;ÂĽÂ&#x2DC;Â&#x2021;§1ĂŠ @Â&#x2021;option Ă&#x2019;ʤ¯ "JøÂ?Ă?&EÂ?ÂŹ-<Ă&#x17E;Â&#x152;" Ă&#x201E;^{ 1. Ă&#x201E;k import optparse parser = optparse.OptionParser() ĂšÂ&#x2021;Ă&#x2DC;Jn)§kMĂŻÂ&#x2DC;Â&#x2021;OptionParser ĂŠÂ&#x2013;" 2. Ă&#x2122;g parser.add_option("-f","--file",...) O\option " annCharles@tom.com

1130Â?,208Â?

Python Ă&#x2020;S)P


§3.6 ?n¡-1Ă&#x20AC;Â&#x2018; 3. )º¡-1 (options, args) = parser.parse_args() options ¼šk¤k¡-1Jøoption &E"args ´positional argument &E" y3§­:?Ă&#x2DC;add_option "Ă&#x2122;ÂĽĂ&#x17E;ĂźÂ&#x2021;ĂŤĂŞĂ&#x2DC;Ăł Â&#x2019;§Â&#x2DC;Â&#x2021;LÂŤĂĄoption§Â&#x2DC;Â&#x2021;L ÂŤoption "ĂśÂ&#x2DC;Â&#x2DC;ĂŠA" ÂĄĂŤĂŞJøÂ&#x2C6;ÂŤĂľU: 1. IÂ&#x2021;ĂŤĂŞoption " ~X: parser.add_option("-f", "--file", action="store", type="string", dest="filename") Ă&#x2122;ÂĽaction LÂŤN?noption §Þ¥ÂżgĂ&#x2019;´`: r-f ½--file Ă&#x20AC;Â&#x2018; Â&#x2018;ĂŤĂŞÂ?filename CĂž"~X:

ÂĄĂ&#x20AC;

args = ["-f", "foo.txt"] parser.add_option("-f", "--file", action="store", type="string", dest="filename") (options, args) = parser.parse_args(args) print options.filename Ă&#x2019;ÂŹÂ&#x2039;<Ă&#x2018;5foo.txt "a.´iĂ&#x17D;G" type Â?²a.§Â&#x201E;Â&#x152;¹´int ½Üfloat "%@Â&#x160;´string "XJuyĂŤĂŞĂ&#x2DC;Ă&#x17D;Ă&#x153;Â?½ a.§@oĂ&#x2019;Â&#x2039;<Ă&#x2018;Â&#x2020;&E§, òĂ&#x2018;§S" dest Â?²;CĂžϴ"%@Â&#x160;´Ă&#x161;option ϴÂ&#x192;ĂŠA"roption m Ă&#x17E;ĂźÂ&#x2021;~Ă&#x2019;K§rĂ&#x2122;ÂĽ~Ă&#x2019;C¤eyÂ&#x201A;§Ă&#x2019;´CĂžϴ"ĂžÂ&#x2021;~fÂĽĂ&#x2019;´rÂ&#x192; ACĂžÂ&#x160;Â?options.filename " 2. Ă&#x2DC;IÂ&#x2021;ĂŤĂŞoption " r action = "store" U¤Â? annCharles@tom.com

1131Â?,208Â?

Python Ă&#x2020;S)P


n Python ~^ÂŹ action = "store_false" ½Ü action = "store_true" ~X: parser.add_option("-v", action="store_true", dest="verbose") parser.add_option("-q", action="store_false", dest="verbose") XJ¡-1ÂĽk-v ½Ü-q §Ă&#x2019;ŠOrverbose Â&#x2DC;¤Â?True Ă&#x161;False" 3. option ĂŤĂŞ%@Â&#x160;" XJvkÂ&#x2DC;option ĂŤĂŞ%@Â&#x160;§ Â&#x2026;Â?vk3¡-1ÂĽuyTĂ&#x20AC;Â&#x2018;§@oĂŠA CĂžÂ&#x160;Ă&#x2019;´None "ÚávÂ&#x152;þêÂ&#x153;šeIΤ´XJ\Â&#x2021;gCÂ&#x2DC;%@Â&#x160;Â? ´Â&#x152;Âą"eÂĄ~fÂ&#x152;ÂąUC%@Â&#x160;" parser.add_option("-v", action="store_true", dest="verbose") parser.add_option("-q", action="store_false", dest="verbose", default=True) eÂĄ~fĂ&#x161;cÂ&#x2DC;Â&#x2021;~fJÂ&#x2DC;" parser.add_option("-v", action="store_true", dest="verbose", default=True) parser.add_option("-q", action="store_false", dest="verbose") XJ´ parser.add_option("-v", action="store_true", dest="verbose", default=False) parser.add_option("-q", action="store_false", dest="verbose", default=True) @overbose %@Â&#x160;´True "Ă?Â?

ÂĄÂ&#x160;ĂŠÂŹCXcÂĄÂ&#x160;ĂŠ%@Â&#x160;"

4. )¤Â?Ă? eÂĄ~fÂŹgĂ&#x201E;)¤Â?Ă?&E" #!/usr/bin/env python # optparser.help.py from optparse import OptionParser usage = "usage: %prog [options] arg1 arg2" annCharles@tom.com

1132Â?,208Â?

Python Ă&#x2020;S)P


§3.6 ?n¡-1Ă&#x20AC;Â&#x2018; parser = OptionParser(usage=usage) parser.add_option("-v", "--verbose", action="store_true", dest="verbose", default=True, help="make lots of noise [default]") parser.add_option("-q", "--quiet", action="store_false", dest="verbose", help="be vewwy quiet (Iâ&#x20AC;&#x2122;m hunting wabbits)") parser.add_option("-f", "--file", dest="filename", metavar="FILE", help="write output to FILE"), parser.add_option("-m", "--mode", default="intermediate", help="interaction mode: one of â&#x20AC;&#x2122;noviceâ&#x20AC;&#x2122;, " "â&#x20AC;&#x2122;intermediateâ&#x20AC;&#x2122; [default], â&#x20AC;&#x2122;expertâ&#x20AC;&#x2122;") parser.parse_args() $1(J: % ./optparser.help.py --help usage: optparser.help.py [options] arg1 arg2 options: -h, --help -v, --verbose -q, --quiet -fFILE, --file=FILE -mMODE, --mode=MODE

show this help message and exit make lots of noise [default] be vewwy quiet (Iâ&#x20AC;&#x2122;m hunting wabbits) write output to FILE interaction mode: one of â&#x20AC;&#x2122;noviceâ&#x20AC;&#x2122;, â&#x20AC;&#x2122;intermediateâ&#x20AC;&#x2122;[default], â&#x20AC;&#x2122;expertâ&#x20AC;&#x2122;

% `²: (a) gĂ&#x201E;Â&#x2039;<ÂŚ^Â?{usage"Ă&#x2122;ÂĽ%prog ÂŹgĂ&#x201E;C¤sys.argv[0] §L¡-Âś ÂĄ"usage %@Â&#x160;´ â&#x20AC;&#x2122;usage : %prog [options]â&#x20AC;&#x2122; (b) O\zÂ&#x2DC;Â&#x2021;option Â&#x17E;ÿ§Â?½help §@o)¤Â?Ă?ÂĽĂ&#x2019;ÂŹÂ&#x2039;<Â&#x192;A& E"help %@Â&#x160;´Â&#x2DC;iĂ&#x17D;G" annCharles@tom.com

1133Â?,208Â?

Python Ă&#x2020;S)P


n Python ~^ÂŹ (c) meta-variable ´ Â? 3 Â? Ă? & E ÂĽ J ø  ĂŤ ĂŞ  Â&#x201C; Âś c " ~ X Â? Ă? & E ÂĽ -mMODE -fFILE "Â&#x152;Âą^metavar 5Â?½"metavar %@Â&#x160;´option ÂśiKĂ&#x17E;ĂźÂ&#x2021;~Ă&#x2019;§, C¤Â&#x152;5" 5. Â?option Š| \§SÂ&#x2021;Ă&#x2030;ĂŠĂľoption Â&#x17E;ÿ§ Ă?rÂŚÂ&#x201A;Š¤eZ|§ÚBu+n§Ă&#x192;Ă&#x2DC; ʧSmuĂśÂ&#x201E;´ ª^r§ÚĂ&#x2018;´Â&#x2DC;Â&#x2021;Ă?Ă&#x152;Âż" ~f: #!/usr/bin/env python # opt.group1.py #!/usr/bin/env python # optparser.help.py from optparse import OptionParser, OptionGroup usage = "usage: %prog [options] arg1 arg2" parser = OptionParser(usage=usage) parser.add_option("-v", "--verbose", action="store_true", dest="verbose", default=True, help="make lots of noise [default]") parser.add_option("-q", "--quiet", action="store_false", dest="verbose", help="be vewwy quiet (Iâ&#x20AC;&#x2122;m hunting wabbits)") parser.add_option("-f", "--file", dest="filename", metavar="FILE", help="write output to FILE"), parser.add_option("-m", "--mode", default="intermediate", help="interaction mode: one of â&#x20AC;&#x2122;noviceâ&#x20AC;&#x2122;, " "â&#x20AC;&#x2122;intermediateâ&#x20AC;&#x2122; [default], â&#x20AC;&#x2122;expertâ&#x20AC;&#x2122;") # add a option group group = OptionGroup(parser, "Dangerous Options", "Caution: use these options at your own risk. "It is believed that some of them bite.") group.add_option("-g", action="store_true", help="Group option.") parser.add_option_group(group) parser.parse_args()

annCharles@tom.com

1134Â?,208Â?

"

Python Ă&#x2020;S)P


§3.6 ?n¡-1Ă&#x20AC;Â&#x2018;

$1(J: $./opt.group1.py --help usage: opt.group1.py [options] arg1 arg2 options: -h, --help -v, --verbose -q, --quiet -fFILE, --file=FILE -mMODE, --mode=MODE

show this help message and exit make lots of noise [default] be vewwy quiet (Iâ&#x20AC;&#x2122;m hunting wabbits) write output to FILE interaction mode: one of â&#x20AC;&#x2122;noviceâ&#x20AC;&#x2122;, â&#x20AC;&#x2122;intermediateâ&#x20AC;&#x2122;[default], â&#x20AC;&#x2122;expertâ&#x20AC;&#x2122;

Dangerous Options: Caution: use these options at your own risk. believed that some of them bite. -g Group option. $

It is

`²: (a) OptionGroup Âź ĂŞ  Ă&#x201A; n Â&#x2021; ĂŤ ĂŞ § ¤ ĂĄ parser ĂŠ Â&#x2013; §group  { ĂĄ ÂŁ ĂŁ § Ă&#x161;group Â?[ÂŁĂŁ"Â&#x2C6;ÂŁÂ&#x2DC;Â&#x2021;option group ĂŠÂ&#x2013;" (b) ,

Â&#x201D;parser ĂŠÂ&#x2013;Â&#x2DC;§Â?group ĂŠÂ&#x2013;O\option "

(c) ^add_option_groupŸêrÂ&#x2DC;Â&#x2021;group O\Â&#x2DC;Â&#x2021;parser ĂŠÂ&#x2013;ÂĽ" 6. Â&#x2039;<Â&#x2021;&E"Ă&#x161;usage aq§3MĂŻparser ĂŠÂ&#x2013;Â&#x17E;ÿ§Â?½version ꐤĂ&#x2019;Â&#x152;Âą Â&#x2039;<Â&#x2021;&E §Ă&#x201C;Â&#x17E;gĂ&#x201E;O\ -v --version ĂšÂ&#x2021;option " ~XÂľ parser = OptionParser(usage="%prog [-f] [-q]", version="%prog 1.0") Ă&#x201C;%prog ÂŹC¤sys.argv[0] " annCharles@tom.com

1135Â?,208Â?

Python Ă&#x2020;S)P


n Python ~^ÂŹ

§3.7 'uÂ&#x17E;mÂŹ time ĂšÂ&#x2021;ÂŹ3Ă&#x2DC;Ă&#x201C;²Ăžk¤Ă&#x2DC;Ă&#x201C;§¤¹£Â&#x2021;5Ă&#x2DC;´Ă?§´Â?kêŸê ÂŁÂ&#x2021;5Ă&#x2DC;Ă?§Â&#x152;þêÂ&#x201E;´Â&#x152;Âą" ÂŹÂĽِϴĂ&#x161;IOC Â&#x160;ĂłŸêœ¥´Â&#x2DC;§¤¹Í²ĂžÂ&#x192;AC Â&#x160;óÍĂ&#x192;Þ´Â&#x161;~k^" ykAÂ&#x2021;âÂ&#x160;Â&#x160;)Âş: â&#x20AC;˘ epoch (Â&#x17E;m:)§Â&#x192;ĂŠuepoch Â&#x17E;m´Â?lepoch mŠ§²LÂŚĂŞ"epoch Â&#x17E; m´0 "Ă?Â?epoch Â&#x192;ĂŠuepoch ²L 0 ÂŚ"3UNIX XĂ&#x161;¼§epoch Â&#x17E;m´1970 c1 1 F0 :0 Š0 ÂŚ" ÂŹÂĽŸêÂ&#x160;U?nÂ&#x2DC;ĂŁÂ&#x17E;mSÂ&#x17E;m§=lepoch mŠ§Â&#x2DC;Â&#x2021;Â&#x17E;m:§ÚÂ&#x2021;Â&#x17E; m:§Â&#x2020;Ă&#x2026;ĂŹĂž^uLÂŤÂ&#x17E;mêâ êk'X§¿Â&#x2026;Ă&#x161;C Â&#x160;Ăł¼Ÿêk'X"Ăš ´Ă?Â?OÂ&#x17D;Ă&#x2026;o´Œ^k 'AĂŞ5LÂŤÂ&#x2DC;Â&#x2021;ĂŞÂ&#x160;§Œo´k Â&#x203A;§Ă&#x2DC;ULÂŤĂ&#x192;  Â&#x152;Â&#x2030;Â&#x152;S¤kĂŞ"3UNIX XĂ&#x161;¼§ÚÂ&#x2021; Â&#x152;Â&#x160;Â&#x2DC;Â&#x201E;´2038 c" â&#x20AC;˘ 2000 cÂŻK"Python ?nÂ&#x17E;mŸê§´Œ^C Â&#x160;󼧤¹Â&#x2DC;Â&#x201E;Ă&#x2DC;ÂŹk2000 cÂŻ K§Ă?Â?§Â&#x17E;mLÂŤÂŚ^Â&#x192;ĂŠuepoch ²LÂŚĂŞ5LÂŤ"XJÂ? Â&#x2022; oN {§Â&#x152;Âąwpython-lib Â?Ă?" â&#x20AC;˘ UTC (Coordiated Universal Time) §ÂĽĂ&#x161;Â&#x2DC;Â&#x17E;m§½Ü`GMT (Greenwich Mean Time) Â&#x201A;%ÂŁÂ&#x17E;m§ â&#x20AC;˘ DST( Daylight Saving Time) §LÂŤg-Â&#x17E;§C ¼ŸêÂ&#x152;Âą?ng-Â&#x17E;§äNNo Â&#x2030;§´Â&#x160;âĂ&#x2DC;Ă&#x201C;/ÂŤÂ&#x2DC;k'X§Â&#x2DC;Â&#x201E;kÂ&#x2DC;Â&#x2021;XĂ&#x161;ŠÂ&#x2021;§^uÂŁĂŁg-Â&#x17E;5K" Â&#x2DC;Â&#x201E;XĂ&#x161;+n ATŽ²Â&#x2030;Ă?ĂšÂ&#x2021;ŠÂ&#x2021; " gmtime() , localtime(), strptime() Â&#x2C6;ÂŁÂ&#x160;§Â&#x201E;kasctime(), mktime() ,strftime()  ĂŤĂŞĂ&#x2018;´Â&#x2DC;Â&#x2021;tuple §Ă&#x2122;¼šk9 Â&#x2021;ĂŞ"ĂšÂ&#x2021;9 Â&#x2021;ĂŞšĂ&#x201A;XL?? Â&#x2C6;Â&#x2021;ŸêÂ&#x192;m'X"ĂŁ3-1`² Â&#x2C6;Â&#x2021;ŸêÂ&#x192;m'X"

§3.8 socket ?§ §3.8.1 0 socket ´Œ^Â&#x203A;Š2Â?ä?§Eâ"socket Â?´Â&#x2DC;ÂŤ?§mĂ?&(IPC)Eâ" Â?N3, ²Þ§socket Ă&#x2DC;´ ¯IPC §´XJ`ª²5´Â&#x2DC;Â&#x2021;Ă&#x152;Â&#x2021;gĂą 5U ´gÂ&#x2021;gĂąÂ&#x17E;ÿ§socket Â?N´\ Ă?Ă&#x20AC;JÂ&#x192;Â&#x2DC;" Python ÂĽsocket ?§Ă&#x161;C Â&#x160;Ăłsocket Â?´Â&#x203A;ŠÂ&#x192;q"XJ\°Ă?socket ?§ Eâ§@oPython ¼§Ă&#x2DC; Python Ă&#x201E;Â&#x160;{§AĂ&#x2DC;^Ă&#x2020;SÂ&#x;o#Ă&#x20AC;Ă&#x153;§Ă&#x2019;Â&#x152;Âą^ |?socket §S " annCharles@tom.com

1136Â?,208Â?

Python Ă&#x2020;S)P


§3.8 socket ?§

¢Ă&#x161;Â&#x160;

ĂĄ5

Â&#x2030;Â&#x152;

0 1 2 3 4 5 6 7 8

tm_year tm_mon tm_mday tm_hour tm_min tm_sec tm_wday tm_yday tm_isdst

X1993 1 â&#x20AC;&#x201C; 12 1 â&#x20AC;&#x201C; 31 0 â&#x20AC;&#x201C; 23 0 â&#x20AC;&#x201C; 59 0 â&#x20AC;&#x201C; 61 0 â&#x20AC;&#x201C; 6, Monday is 0 1 â&#x20AC;&#x201C; 366 0, 1 or -1

L 3.7-7: LÂŤÂ&#x17E;m

time +timezone seconds(local)

seconds(UTC) -timezone ctime

localtime

mktime

string

gmtime

strptime strftime struct time(local time)

struct time(UTC)

ĂŁ 3-1: Â&#x17E;mŸêÂ&#x192;m'X

annCharles@tom.com

1137Â?,208Â?

Python Ă&#x2020;S)P


n Python ~^ÂŹ Ă&#x2122;Ă&#x201E;kÂ&#x2030;Ă&#x2018;ĂźÂ&#x2021;{Ăź~f§,

Â?[0 ŸêN^6§§Ă&#x161;zÂ&#x2021;ŸêĂ&#x201E;^

{"

§3.8.2 {Ăź~f Â?rĂ ~f Â?rĂ socket ?§§´'{Ăź"MĂŻTCP ĂŤÂ?{Xe: #/usr/bin/env python # simpleClient.py import sys,os import socket def main(): s = socket.socket(socket.AF_INET,socket.SOCK_STREAM) s.connect((socket.gethostname(),8000)) s.send("GET index.html\n") s.shutdown(1); sys.stdout.write(s.recv(1024)) s.close() if __name__ == "__main__": main() {ĂźĂ&#x2018;Ă&#x2013;ĂŹĂ ~f # simpleserver.py import socket,sys,os,popen2 def main(): s = socket.socket(socket.AF_INET,socket.SOCK_STREAM) s.bind((socket.gethostname(),8080)) s.listen(1) clientsocket,clientaddress = s.accept(); clientsocket.send("welcome %s\n" % str(clientaddress)) data.send("%s"%str(arg)) clinetsocket.close() s.close() if __name__ == "__main__" : main() Â?rĂ Ă&#x161;Ă&#x2018;Ă&#x2013;ĂŹĂ ŸêN^6§ XĂŁ3-2 annCharles@tom.com

1138Â?,208Â?

Python Ă&#x2020;S)P


§3.8 socket ?§ Your App Here(Python) Tkinter(Python Module) tkinter(C) Tk Widgets(C and Tcl) Tk(C) Xlib (C)

ĂŁ 3-2: Â?rĂ Ă&#x161;Ă&#x2018;Ă&#x2013;ĂŹĂ ŸêN^6§ ĂšÂ&#x2021;6§ãkÂ&#x2DC;Â&#x2021;/Â?N´)Ă&#x2DC;)§Â&#x2021;5Âż"Ă&#x2018;Ă&#x2013;ĂŹĂ socket kĂźÂ&#x2021;"Ă&#x2018;Ă&#x2013;ĂŹĂ  Â&#x2DC;mŠMĂŻsocket Ă&#x2DC;´^5uxêâ§Â?Ă&#x2DC;´^5Ă&#x201A;êâ"ÂŚÂ?Â&#x2DC;Â&#x160;^Ă&#x2019;´ Ă&#x201A;ĂŤÂ&#x17E;ΤÂ?Ă&#x2019;´Â?rĂ s.connect Ÿê§, MĂŻÂ&#x2DC;Â&#x2021;socket ^uĂ&#x201A;uêâ"accept ŸêÂ&#x160;^Ă&#x2019;´Xd"Œ¤þÂ&#x2C6;ÂŁÂ&#x2DC;Â&#x2021;socket §Â&#x201E;kĂŠÂ?IP /Â&#x152;"Â&#x2DC; ¤þÂ&#x2C6;ÂŁÂ&#x2DC; Â&#x2021;socket §@oĂ&#x2019;Ă&#x2DC;2ŠĂ&#x2018;Ă&#x2013;ĂŹĂ Ă&#x161;Â?rĂ  §ßàPkĂ&#x201C;ĂľUsocket §^uĂ&#x201A;uĂŞ â" Ă?d§Â&#x2DC;Â&#x2021;Ă&#x2018;Ă&#x2013;ĂŹÂ&#x152;ÂąÂ?ĂľÂ&#x2021;Â?rĂ Ă&#x2018;Ă&#x2013;§Ă&#x2018;Ă&#x2013;ĂŹĂ&#x2030;accept zÂ&#x2DC;Â&#x2021;Â?rĂ ĂŤÂ&#x17E; Τ, §Â&#x2C6;ÂŁÂ&#x2DC;Â&#x2021;socket ^uĂ&#x161;TÂ?rĂ?&"Â?Ă&#x2019;´`§XJkn Â&#x2021;Â?rĂ&#x161;Ă&#x2018;Ă&#x2013;ĂŹÂ&#x192;ĂŤ {§Ă&#x2018;Ă&#x2013;ĂŹĂ kn + 1 Â&#x2021;socket § Â?rĂ Â?kÂ&#x2DC;Â&#x2021;socket " Â&#x201E;k5Âż{lŸêĂ&#x161;Â&#x161;{lŸêÂŤO§recv ŸêĂ&#x161;accept Ÿê%@^Â&#x2021;eĂ&#x2018;´{l §Â?Ă&#x2019;´`§ŒÂ&#x201A;Ă&#x2018;Ă&#x2DC;ÂŹĂĄ=Â&#x2C6;£§Â&#x2020;kÂ&#x152;Ă&#x201A;êâ½ÜÂ?rĂŤÂ&#x17E;Œ§ŒÂ&#x201A;⏠Â&#x2C6;£§Ă&#x201E;KĂ&#x2019;[Ă&#x2DC;Â&#x2C6;£§Ă&#x2DC;Â&#x161;u)Ă&#x2122;ÂŚÂ&#x2020;Ă&#x2DC;"Â&#x152;ÂąUCsocket option §4ÂŚÂ&#x201A;C¤Â&#x161; {lŸê§ŒÂ&#x201A;ÂŹĂĄÂ?Â&#x2C6;ÂŁ"

§3.8.3 MĂŻsocket MĂŻsocket Ÿê´: socket(address_family,type,protocol_type) `²: 1. address_family ^5Â?½Â&#x2021;ĂŻĂĄ=Â&#x2DC;asocket "Â&#x152;¹´¹e~Ăž" â&#x20AC;&#x2122;AF_APPLETALKâ&#x20AC;&#x2122;, â&#x20AC;&#x2122;AF_AX25â&#x20AC;&#x2122;, â&#x20AC;&#x2122;AF_BRIDGEâ&#x20AC;&#x2122;, â&#x20AC;&#x2122;AF_INETâ&#x20AC;&#x2122;, â&#x20AC;&#x2122;AF_INET6â&#x20AC;&#x2122;, â&#x20AC;&#x2122;AF_IPXâ&#x20AC;&#x2122;, â&#x20AC;&#x2122;AF_NETROMâ&#x20AC;&#x2122;,â&#x20AC;&#x2122;AF_PACKETâ&#x20AC;&#x2122;, â&#x20AC;&#x2122;AF_ROSEâ&#x20AC;&#x2122;, â&#x20AC;&#x2122;AF_UNIXâ&#x20AC;&#x2122;, â&#x20AC;&#x2122;AF_UNSPECâ&#x20AC;&#x2122;, â&#x20AC;&#x2122;AF_X25â&#x20AC;&#x2122;]  ~^,´Â&#x152;œIP Ă&#x2020; §AF_INET "3Unix XĂ&#x161;¼§AF_UNIX Â?´ '~^§^5ĂŻĂĄUnix ?§mĂ?&" annCharles@tom.com

1139Â?,208Â?

Python Ă&#x2020;S)P


n Python ~^ÂŹ 2. type ^5Â?½Ă?&a." â&#x20AC;&#x2122;SOCK_DGRAMâ&#x20AC;&#x2122;, â&#x20AC;&#x2122;SOCK_RAWâ&#x20AC;&#x2122;, â&#x20AC;&#x2122;SOCK_RDMâ&#x20AC;&#x2122;, â&#x20AC;&#x2122;SOCK_SEQPACKETâ&#x20AC;&#x2122;, â&#x20AC;&#x2122;SOCK_STREAMâ&#x20AC;&#x2122;  ~^´SOCK_STREAM ^uĂŻĂĄÂĄÂ&#x2022;ĂŤ6Ă?&§SOCK_DGRAM ^uĂŻĂĄÂ&#x161;ÂĄÂ&#x2022; ĂŤŠĂ?&"XJ1Â&#x2DC;Â&#x2021;Íê´AF_INET Â&#x17E;§ŒÂ&#x201A;ĂŠA´TCP Ă&#x161;UDP " 3. protocol_type ^uÂ?½Ă&#x2020;a."ĂšÂ&#x2021;Íê´Â&#x152;Ă&#x20AC;§Ă&#x2DC;Â&#x2DC;½Â&#x161;Â&#x2030;§3ĂŻĂĄTCP socket ½ÜUDP socket Â&#x17E;ÿ§ŒÂ&#x201A;Â&#x2DC;Â&#x201E;Ă&#x2018;´0 "XJ1Â&#x2DC;Â&#x2021;Íê´AF_INET §@o ĂšÂ&#x2021;ĂŤĂŞ^5Â?½IP Â?Ă&#x17E;ÂĽprotocol iĂŁ"1Â&#x2021;Íê´SOCK_RAW Â&#x17E;ÿ§@ o1nÂ&#x2021;ĂŤĂŞÂ&#x152;¹´?Ă&#x203A;RFC 1700 ÂĽ5½Ă&#x2020;Â&#x201C;è" ĂŻĂĄÂ&#x2DC;Â&#x2021;TCP socket ~^Â?{´: sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) ĂŻĂĄUDP socket ~^Â?{´¾ sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) ĂŻĂĄUnix Â?^u?¢mĂ?&socket Â?{´: sock = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)

§3.8.4 Â&#x201D;½socket socket ½Ă&#x201A;´: an endpoint of communication to which a name may be bound ¡Â&#x20AC;Ă&#x2C6;Ă&#x2019;´: socket ´Ă&#x161;Â&#x2DC;Â&#x2021;ÂśiÂ&#x201D;½Ă?&Ă :" Â&#x201D;½(bind) ÂżgĂ&#x2019;´rĂźÂ&#x2021;Ă&#x20AC;Ă&#x153;ĂŠX3Â&#x2DC;ü§;;Â&#x201D;3Â&#x2DC;ĂĽ"Â&#x201D;½socket kÂ&#x2030; Â&#x2030;socket ĂĽÂśi§4O<U ĂŠΤĂ&#x161;ÂŚĂ?&" TCP socket ÂśiĂ&#x2019;´IP /Â&#x152;\Ă Â?Ă&#x2019;"IP /Â&#x152;^5IÂŁIP äÞÂ&#x2DC;Â&#x2021;Ă&#x152;Ă&#x2026;§àÂ? Ă&#x2019;^5IÂŁÂ&#x2DC;Â&#x2021;Ă&#x152;Ă&#x2026;SÂ&#x2DC;Â&#x2021;?§" UDP socket ÂśiÂ?´IP /Â&#x152;\Ă Â?Ă&#x2019;§Ă&#x161;TCP aq"´kÂ&#x2DC;:Â&#x2021;5¿§UDP  Ă Â?Ă&#x2019;Ă&#x161;TCP Ă Â?Ă&#x2019;´Ă&#x17D;Ă&#x192;'X" Unix Â?socket Âśi´ŠÂ&#x2021;ϴ"~Xâ&#x20AC;&#x153;/tmp/sock/â&#x20AC;? "^ls -l ¡-uÂ&#x2DC;Â&#x2021;Š Â&#x2021;Â&#x17E;ÿ§ŒIÂ&#x201C;´â&#x20AC;&#x153;srwx----â&#x20AC;? bĂ&#x2122; Â&#x160;´700(8) (l?Â&#x203A;)§â&#x20AC;&#x153;sâ&#x20AC;? LŒ´Â&#x2DC; Â&#x2021;socket " TCP Server socket 7LĂ&#x161;Â&#x2DC;Â&#x2021;IP /Â&#x152;Ă&#x161;Ă Â?Ă&#x2019;Â&#x201D;½§Ă&#x201E;KÂ?rĂ Ă&#x2DC;NoĂ&#x161;Ă&#x2018; Ă&#x2013;ĂŹĂŻĂĄĂŤ"TCP Client socket Â&#x2DC;Â&#x201E;Ă&#x2DC;^Ă&#x161;IP /Â&#x152;Ă&#x161;Ă Â?Ă&#x2019;Â&#x201D;½§kXĂ&#x161;gĂ&#x201E;Š annCharles@tom.com

1140Â?,208Â?

Python Ă&#x2020;S)P


§3.8 socket ?§ Â&#x2DC;Â&#x2021;IP /Â&#x152;Ă&#x161;Ă Â?Ă&#x2019;",§Â&#x2DC;½Â&#x2021;Â&#x201D;½Â?Â&#x152;¹§´N´Ă&#x161;XĂ&#x161;¼Ž²Œ^socket Ă&#x20AC; â" Unix Â?socket Ă&#x161;TCP aq"Â?´Ă&#x2018;Ă&#x2013;ĂŹĂ Â&#x2021;Â&#x201D;½§Â?rĂ Ă&#x2DC;Â&#x2021;Â&#x201D;½" UDP 5Ă&#x2DC;ŠServer Ă&#x161;Client "¤kĂ?&:Ă&#x2018;´Ê§´XJÂ&#x2021;Ă&#x152;Ă&#x201E;Ă&#x201A;êâ Â?Ă?&:§Â&#x2021;ÂŻkÂ&#x201D;½IP /Â&#x152;Ă&#x161;Ă Â?Ă&#x2019;§ÚĂ&#x2122;ÂŚĂ :âuÂ&#x2030;ÂŚêâÂ?Â&#x2021;ux @Â&#x2021;Ă Â?"XJĂ?&:´uxêâÂ?§@oÂŚÂ&#x152;ÂąÂ?½Â&#x201D;½Ă Â?Ă&#x2019;´0 §¿g´4X Ă&#x161;gĂ&#x201E;Â?Ă&#x2122;ŠÂ&#x2DC;Â&#x2021;Ă Â?Ă&#x2019;§ĂŠÂ?Ă&#x201A;\êâÂ?Â&#x17E;ÿ§ŒĂ&#x2019;\IP /Â&#x152;Ă&#x161;Ă Â?

"lĂšÂ&#x2021;ÂżĂ&#x201A;ÞÚ§UDP 3äNA^Â&#x17E;ÿ§qŠÂ?Server Ă&#x161;Client " Â&#x152;¹Œ^getsockname ŸêÂ&#x2DC;Â&#x2021;socket Â&#x201D;½Âśi" Â&#x201D;½Â&#x2DC;Â&#x2021;TCP socket ~^Â?{´: sock = socket.bind((socket.gethostname(),port)) Â&#x201D;½UDP socket ~^Â?{´¾ sock = socket.socket((socket.gethostname(),port)) Â&#x201D;½Unix Â?^u?¢mĂ?&socket Â?{´: sock = socket.socket("/tmp/sock")

§3.8.5 ĂŻĂĄĂŤ Â?rĂ ĂŤÂ&#x17E;ÂŚ connect ŸêĂŤĂŞÂĽÂ?² IP /Â&#x152;Ă&#x161;Ă Â?Ă&#x2019;(port)"~X: socket.connect((hostname,port)) Ă&#x2018;Ă&#x2013;ĂŹĂ&#x201A;ĂŤÂ&#x17E;ÂŚ TCP Ă&#x161;Unix Â?socket âkĂ&#x201A;ĂŤÂ&#x17E;ÂŚ`{"ĂśÂ?{aq" sock.listen(12) clientsocket, address = sock.accept() listen ÂĽĂŤĂŞÂ?²Â&#x152;Ă&#x2030; Â&#x152;ĂŤĂŞ8"accetp ŸêÂ&#x2C6;ÂŁÂ&#x2DC;Â&#x2021;^uĂ?&socket Ă&#x161;uĂĽĂŤÂ&#x17E;ÂŚÂ?rĂ /Â&#x152;"

§3.8.6 Ă&#x201A;xêâ send Ă&#x161;recv ´ÊäÂ&#x2026;Ă&#x20AC;ÂŤ?1ĂśÂ&#x160; 1. XJsend ¤þÂ&#x2C6;ÂŁ{§@oÂżÂ&#x203A;XĂŠÂ?äÂ&#x2026;Ă&#x20AC;¼Ž²k \uxêâ" 2. ÂŚ+send ¤þÂ&#x2C6;£§@oĂ&#x2DC;ÂżÂ&#x203A;Xux. "ÂŚÂ&#x2C6;ÂŁÂ&#x160;LÂŤux Ăľê⧠´Ă&#x2DC;Â&#x2DC;½Ă&#x161;\uxêâÂ&#x152;Â&#x2DC;Â&#x2014;"Â&#x2021;Â&#x17D;Ă&#x2018;uxĂ&#x2018;§7L^aqeÂĄÂ&#x201C;è" annCharles@tom.com

1141Â?,208Â?

Python Ă&#x2020;S)P


n Python ~^ÂŹ totalsent = 0 while totalsent < MSGLEN: sent = self.sock.send(msg[totalsent:]) if sent == 0: raise RuntimeError, \\ "socket connection broken" totalsent = totalsent + sent Â&#x201E;Ă?§python ÂĽsendall ŸêÂ&#x152;Âą¤ÚÂ&#x2021;ĂľU" 3. XJsend Â&#x2C6;ÂŁ0 §LÂŤĂŠÂ?Ă&#x161;\`§â&#x20AC;&#x153;¡Ž²'4Ă&#x2030;êâĂľU§Ă&#x2DC;U 2Ă&#x201A;\ êâ â&#x20AC;?"´\Â&#x201E;kÂ&#x152;UĂ&#x201A;ĂŠÂ?êâ" 4. XJrecv ¤þÂ&#x2C6;ÂŁ{§@oÂżÂ&#x203A;X\Ă&#x201A; ê⧴Ă&#x2DC;Â&#x2DC;½ÊÂ?send Ÿêux Ăľêâ\Ă&#x2019;U Ă&#x201A;Ăľ"¯¢Þ§TCP socket U yĂ&#x201A;êâ^SĂ&#x161;ĂŠÂ? ux^SÂ&#x2DC;Â&#x2014;§´Ă&#x2DC;Â&#x2DC;½U y\Ă&#x201A;v "kÂ&#x152;U\Ă&#x201A;êâ´ÊÂ?Ăźgu xêâ§Â?kÂ&#x152;U\Ă&#x201A;êâÂ?´ÊÂ?uxêâÂ&#x2DC;Ă&#x153;Š" 5. XJrecv Â&#x2C6;ÂŁ0 §LÂŤĂŠÂ?Ă&#x161;\`§â&#x20AC;&#x153;¡Ž²'4uxêâĂľU§Ă&#x2DC;U 2Â&#x2030;\u xêâ â&#x20AC;?"´\Â&#x201E;kÂ&#x152;UÂ&#x2030;ĂŠÂ?uxêâ" \Ă&#x161;ĂŠÂ?ĂŻĂĄÂ&#x2DC;Â&#x2021;TCP ĂŤÂ&#x192; §Ă&#x2019;ĂŻĂĄ Â&#x2DC;Â&#x2021;VÂ&#x2022;DĂ&#x2018;Ă?§Ă&#x2019;Â&#x201D;kĂźÂ&#x2021;+ f§ŠOLÂŤĂźÂ&#x2021;Â?Â&#x2022;\uxÂ&#x2030;ĂŠÂ?§Ă&#x161;ĂŠÂ?uxÂ&#x2030;\Ă?" <Ă&#x2018;Â&#x2DC;Â&#x2021;+f5w§+fĂźĂ&#x17E;kuxÂ?Ă&#x161;Ă&#x2030;Â?§uxÂ?Ă&#x2DC;ä/Â&#x2022;+fpÂĄ5Y§Â? N^Ă&#x2014;§Â?N@¼§Â?N^§Â?N^"XJ^Ă&#x2014;{§@oÂ&#x152;U+fYá §Â&#x2DC;Ă&#x2DC;e @oĂľY§Ă&#x2019;/eÂ&#x2DC;Â&#x152;§Â? Â&#x2DC;Â&#x152;3Ă&#x2014;p§XJ\Â&#x2021;Â&#x201D;Ă&#x153;/\{§Ă&#x2019;Â&#x2DC;ÂŹ§ Â?+fY6e §eg2/" XJsend Â&#x2C6;ÂŁ0 {§LÂŤĂ&#x201A;Â?r+fĂ&#x2014;4 " Ă&#x201A;Â?3+f,Â&#x2DC;Ă&#x17E;6Ă&#x2018;5Y§Â?N^Ă&#x2014;§Â?N@¼§Â?N^§Â?N^§ ´Ă&#x2018;5Y§Ă&#x2DC;Â&#x2DC;½´uxĂ Ă&#x201C;Â&#x2DC;ÂĽSY§XJ\^Ă&#x2014;Y§kÂ&#x152;UĂ&#x201A;ĂŠÂ?Êþ¼ Y"XJ\^ÂĽ§@oÂ&#x152;UĂ&#x201A;Â?´ÊÂ?uxÂ&#x2DC;Ă&#x2014;YÂĽÂ&#x2DC;Ă&#x153;Š" XJrecv Â&#x2C6;ÂŁ0 {§LÂŤuxÂ?r+fĂ&#x2014;4 " Â&#x152;U?Ă&#x203A;'Â&#x2019;Ă&#x2018;´Â&#x2013; " ĂšÂ&#x2018;5ÂŻKĂ&#x2019;´§XĂ&#x203A;½Ă&#x201A;VÂ?uxĂ&#x161;Ă&#x201A;^S§Ă&#x161;uxĂľĂ&#x161;Ă&#x201A;Ăľ"Â?Ă&#x2019; ´`§Â&#x;oÂ&#x17E;Ăż\`{§Â&#x;oÂ&#x17E;ÿ¡`{§Â&#x2C6;Â&#x2021;`{Â&#x17E;m´þQÂş

§3.8.7 ämĂŤ ^close ŸêÂ&#x152;¹ämĂŤ§'4socket "Ú´{ĂźZyÂ?{" Â?Â&#x152;Âą^shutdown(how) Ÿê"ÂŚĂ&#x201A;Â&#x2DC;Â&#x2021;ꐤ^uÂ?²NämĂŤ" annCharles@tom.com

1142Â?,208Â?

Python Ă&#x2020;S)P


§3.8 socket ?§ 1. how = 0 LämĂ&#x201A;Ă?"Â?Ă&#x2019;´XJĂŠÂ?N^send uxêâ{§Â&#x2C6;ÂŁ0 LÂŤ Ă&#x2DC;U 2uxêâ §ÊÂ?Ž²äm Ă&#x201A;Ă?"´shutdown(0) Â&#x192; §Â&#x201E;Â&#x152;Âąu xêâ§ÊÂ?Â?´Â&#x152;UĂ&#x201A;êâ" §Âżg´wÂ&#x160;ĂŠÂ?§¡Ă&#x2DC;2Ă&#x201A;êâ §O2ux " 2. how = 1 LämuxĂ?"Â?Ă&#x2019;´XJĂŠÂ?N^recv uxêâ{§Â&#x2C6;ÂŁ0 LÂŤ Ă&#x2DC;U 2Ă&#x201A;êâ §ÊÂ?Ž²äm uxĂ?"´shutdown(1) Â&#x192; §Â&#x201E;Â&#x152;Âą Ă&#x201A;êâ§Â&#x152;UĂ&#x201A;ĂŠÂ?uxêâ" §Âżg´wÂ&#x160;ĂŠÂ?§¡Ă&#x2DC;2uxêâ §O2Ă&#x201A; " 3. how=3 LÂŤĂ&#x201C;Â&#x17E;ämuxĂ&#x161;Ă&#x201A;Ă?" XJĂ?&ĂŤÂĽÂ&#x2DC;Â?3Ă?&L§¼Â?Â&#x17D;Ă&#x201A;ê⧠Ă&#x2DC;uxêâ§@oÂŚÂ&#x152;U3ĂŤ ffĂŻĂĄÂ&#x192; §Ă&#x2019;'4uxĂ?" Â?Â&#x2021;Ă?&Ă&#x2020;ÂĽ5½ Â&#x2DC;Â?Ă&#x2DC;Uuxêâ§@oÂŚĂ&#x2019;AT'4uxĂ?" XJrecv ŸêÂ&#x2C6;ÂŁ0 §LÂŤĂŠÂ?'4 uxĂ?§@oĂ&#x2019;AT'4Ă&#x201A;Ă?" XJsend ŸêÂ&#x2C6;ÂŁ0 §LÂŤĂŠÂ?'4 Ă&#x201A;Ă?§@oĂ&#x2019;AT'4uxĂ?" XJuxĂ?Ă&#x161;Ă&#x201A;Ă?Ă&#x2018;'4 §@oĂ&#x2019;ATs.close() " XJ\Â&#x2030;Ă&#x2DC;[Â&#x2014;§Â&#x2020;s.close() Â?1" ^ socket Â&#x2DC;½Â&#x2021;'4§Œ+socket module ÂŹgĂ&#x201E;'4Ă&#x2DC;2ÂŚ^socket §´3 §S¼²w'4Â&#x2DC;Â&#x2021;socket Â&#x2019;½´Â&#x2DC;Â&#x2021;Ă?Ă&#x152;Âż"

§3.8.8 Ă&#x2122;ÂŚ9Ă?Ÿê ~f: >>> import socket >>> socket.gethostname() â&#x20AC;&#x2122;charles.home.com.cnâ&#x20AC;&#x2122; >>> socket.gethostbyname(socket.gethostname()) â&#x20AC;&#x2122;192.168.200.18â&#x20AC;&#x2122; >>> socket.gethostbyname_ex("www.sohu.com") (â&#x20AC;&#x2122;pagegrp1.sohu.comâ&#x20AC;&#x2122;, [â&#x20AC;&#x2122;www.sohu.comâ&#x20AC;&#x2122;], [â&#x20AC;&#x2122;61.135.150.67â&#x20AC;&#x2122;, â&#x20AC;&#x2122;61.135.150.69â&#x20AC;&#x2122;, â&#x20AC;&#x2122;61.135.150.74â&#x20AC;&#x2122;, â&#x20AC;&#x2122;61.135.150.75â&#x20AC;&#x2122;, â&#x20AC;&#x2122;61.135.131.73â&#x20AC;&#x2122;, â&#x20AC;&#x2122;61.135.131.180â&#x20AC;&#x2122;, â&#x20AC;&#x2122;61.135.131.183â&#x20AC;&#x2122;, â&#x20AC;&#x2122;61.135.132.172â&#x20AC;&#x2122;, â&#x20AC;&#x2122;61.135.132.173â&#x20AC;&#x2122;, â&#x20AC;&#x2122;61.135.132.174â&#x20AC;&#x2122;, â&#x20AC;&#x2122;61.135.132.176â&#x20AC;&#x2122;, â&#x20AC;&#x2122;61.135.133.109â&#x20AC;&#x2122;, â&#x20AC;&#x2122;61.135.145.47â&#x20AC;&#x2122;, â&#x20AC;&#x2122;61.135.150.65â&#x20AC;&#x2122;, â&#x20AC;&#x2122;61.135.150.66â&#x20AC;&#x2122;]) >>> socket.gethostbyname("www.sohu.com") annCharles@tom.com

1143Â?,208Â?

Python Ă&#x2020;S)P


n Python ~^ÂŹ â&#x20AC;&#x2122;61.135.131.180â&#x20AC;&#x2122; >>> socket.gethostbyaddr("127.0.0.1") (â&#x20AC;&#x2122;localhost.localdomainâ&#x20AC;&#x2122;, [â&#x20AC;&#x2122;localhostâ&#x20AC;&#x2122;], [â&#x20AC;&#x2122;127.0.0.1â&#x20AC;&#x2122;]) >>> socket.getservbyname("http",â&#x20AC;&#x2122;tcpâ&#x20AC;&#x2122;) 80 >>> socket.getservbyname("mail",â&#x20AC;&#x2122;tcpâ&#x20AC;&#x2122;) 25 >>> socket.getservbyname("smtp",â&#x20AC;&#x2122;tcpâ&#x20AC;&#x2122;) 25 >>> socket.getservbyname("pop3",â&#x20AC;&#x2122;tcpâ&#x20AC;&#x2122;) 110 >>> socket.getservbyname("ftp",â&#x20AC;&#x2122;tcpâ&#x20AC;&#x2122;) 21 >>> socket.getservbyname("tftp",â&#x20AC;&#x2122;udpâ&#x20AC;&#x2122;) 69 >>> socket.getservbyname("time",â&#x20AC;&#x2122;udpâ&#x20AC;&#x2122;) 37 >>> socket.getprotobyname("udp") 17 >>> socket.getprotobyname("tcp") 6 >>> socket.getprotobyname("icmp") 1 >>> socket.getprotobyname("sctp") 132 gethostname Â&#x152;ÂącĂ&#x152;Ă&#x2026;ϴ" gethostbynameÂ&#x152;ÂąÂ&#x160;âĂ&#x152;Ă&#x2026;ϴĂ&#x152;Ă&#x2026;IP /Â&#x152;" gethostbyname_ex Â&#x152;ÂąÂ&#x160;âĂ&#x152;Ă&#x2026;ϴĂ&#x152;Ă&#x2026;¤kϴ&E"ÂŚÂ&#x2C6;ÂŁÂ&#x2DC;Â&#x2021;tuple" (hostname,hostnamealiaselist,ipaddrlist) Â?škĂ&#x152;Ă&#x2026;œ¥§Ă&#x152;Ă&#x2026;OÂśL§Â&#x2DC;Â&#x2021;Ă&#x152;Ă&#x2026;Â&#x152;UkĂľÂ&#x2021;OϤĂ&#x152;Ă&#x2026;IP /Â&#x152;L§Â&#x2DC;Â&#x2021;Ă&#x152;Ă&#x2026; Â&#x152;ÂąkĂľÂ&#x2021;IP /Â&#x152;" gethostbyaddr Â&#x152;ÂąÂ&#x160;âIP /Â&#x152;Ă&#x152;Ă&#x2026;¤kϴ&E" getservbyname Â&#x152;ÂąÂ&#x160;âĂ&#x2018;Ă&#x2013;œ¥§ĂŠAĂ Â?Ă&#x2019;"IÂ&#x2021;Â?½´TCP Ă&#x2020;Â&#x201E; ´UDP Ă&#x2020;" annCharles@tom.com

1144Â?,208Â?

Python Ă&#x2020;S)P


§3.8 socket ?§ Ÿêœ¥

Â&#x160;Ă&#x201A;

htons(sint ) ntohs(sint ) htonl(lint ) ntohl(lint )

rĂĄ.lĂ&#x152;Ă&#x2026;^SCÂ?ä^S rĂĄ.lä^SCÂ?Ă&#x152;Ă&#x2026;^S r.lĂ&#x152;Ă&#x2026;^SCÂ?ä^S r.lä^SCÂ?Ă&#x152;Ă&#x2026;^S

L 3.8-8: ^u=Â&#x2020;i!^SŸê getprotobyname Â&#x152;ÂąÂ&#x160;âĂ&#x2020;œ¥§ĂŠAĂ&#x2020;Ă&#x2019;è§ÚÂ&#x2021;Â&#x160;Â&#x152;ÂąD4Â&#x2030;M ĂŻsocket Â&#x17E; socket(domain,type,protocol) ÂĽ11nÂ&#x2021;ĂŤĂŞprotocol " eÂĄŸê^u=Â&#x2020;i!^S"XL3.8-8" Ă&#x2122;¼§h Â&#x201C;LĂ&#x152;Ă&#x2026;§n Â&#x201C;Lä§to Â&#x201C;L=Â&#x2020;§s Â&#x201C;LĂĄ.§l Â&#x201C;L."

§3.8.9

TCP Ă&#x161;UDP ÂŤO

TCP ´¥Â&#x2022;ĂŤ"UPD ´¥Â&#x2022;Â&#x161;ĂŤ"TCP Ă&#x2019;Â&#x201D;Â&#x2039;>{§Ă?&Â&#x192;ckÂ&#x2021;ĂŻĂĄĂŤ §X§à Ă&#x2026;§Ă&#x192;Ă&#x2019;§$§ÊÂ?f"Ă?&.Â&#x192; Â&#x2021;ämĂŤ"UDP Ă&#x2019;Â&#x201D;M&§Ă?& Â&#x192;cĂ&#x2DC;^ĂŻĂĄĂŤ§r#Â?3&¾¼§3&¾ÞĂ?/Â&#x152;Â&#x2020;uxĂ&#x2019;Â&#x152;Âą " 'XL3.8-9: TCP ÂŹyĂ&#x201A;u^S´Â&#x2DC;Â&#x2014;§UDP KĂ&#x2DC;§uĂ êâkÂ&#x152;U

ukÂ&#x2013;"

TCP ÂŹyÂ?Ă&#x2DC;ÂŹÂżÂ&#x201D;§XJsend ¤þÂ&#x2C6;£§@oĂ&#x2019;Â&#x2DC;½Â&#x2C6; ĂŠÂ?äÂ&#x2026;Ă&#x20AC;ÂŤ S§ÊÂ?Â?Â&#x2021;N^recv Ă&#x2019;Â&#x2DC;½uĂ uxêâ"UDP Ă&#x2019;Ă&#x2DC;§Â&#x2DC;Â&#x201E;Â&#x153;še§sendto ²~Ă&#x2018;U¤þ§´Ă&#x2DC;yĂŠÂ?Â&#x2DC;½Ă&#x201A;§Â?kĂ?LĂž Ă&#x2020;y "Â&#x2DC;Â&#x201E;Â?{Ă&#x2019;´ Â?zÂ&#x2DC;Â&#x2021;uxêâÂ??Ă&#x2019;§ÊÂ?Ă&#x201A;Ă&#x2019;ÂŁxÂ&#x2DC;Â&#x2021;Â?A§`¡Ă&#x201A; §XJ3Â&#x2DC;½Â&#x17E;mT SvkĂŠÂ?Â?A§Ă&#x2019;­#ux§­#uxN gÂ&#x192; §Â&#x201E;´Â&#x201D;}§K@Â?uxÂ&#x201D;}"T Ă&#x2019;´Â&#x2021;Â&#x17E;Â&#x17E;m§Â&#x2DC;Â&#x201E;´N Ÿê§Â?N OÂ&#x152; OÂ&#x152;§ Â&#x2026;Â&#x201E;Â&#x2021;O\Â&#x2DC;Â&#x2021;Â&#x2018;Ă&#x2026; £Þ§Â&#x201C; Â&#x17D;ĂľÂ&#x2021;Ă&#x152;Ă&#x2026;Ă&#x201C;Â&#x17E;Â&#x2022;Ă&#x201C;Â&#x2DC;Â&#x2021;Ă&#x152;Ă&#x2026;ux" TCP yuxêâĂ&#x161;Ă&#x201A;êâĂ&#x2DC;ÂŹk­E§UDP Ă&#x2019;Ă&#x2DC;§uĂ êâÂ&#x152;UÂŹÂ&#x2DC; uĂľÂ&#x2013;"Ú´Ă?Â?UDP êâÂ?²LĂľÂ&#x2021;´dĂŹÂ&#x192; §êâÂ?3ä¼)­EÂ?" 3TCP ¼§Â&#x2DC;½kClient Ă&#x161;Server Â&#x192;Š§Ă?Â?Server Â&#x2021;ĂŻĂĄÂ&#x2DC;Â&#x2021;AĂ?socket ^ui fĂ&#x161;Ă&#x201A;client ĂŤÂ&#x17E;ΤÂ&#x2C6;ÂŁÂ&#x2DC;Â&#x2021;^uĂ&#x201A;uêâsocket Â&#x192; §Client Ă&#x161;Server 3´Ê Ă&#x201A;u¢N"3UDP ¼§vkServer Ă&#x161;Client Â&#x192;Š§¤kĂ&#x152;Ă&#x2026;ĂŻĂĄ socket Â&#x192; §Ă&#x2019; Â&#x152;ÂąĂ&#x201A;uêâ §Ă&#x201C;Â&#x2DC;Â&#x2021;socket Â&#x152;Âą^5Ă&#x201A;Ă&#x2DC;Ă&#x201C;Ă&#x152;Ă&#x2026;UDP êâ§Ă&#x201C;Â&#x2DC;Â&#x2021;socket Â?Â&#x152;Âą Â&#x2030;Ă&#x2DC;Ă&#x201C;Ă&#x152;Ă&#x2026;uxêâ" annCharles@tom.com

1145Â?,208Â?

Python Ă&#x2020;S)P


n Python ~^¬

Ï&ƒc´Äïáë ´Äy^S ´Äyج ¿” ´Äyج­ E Ï&ª X J Ñ Ö ì n‡  rÑÖ§ÑÖìà socket êþ ´Äk6þ›› Âuêâ¦^¼ê ´Ä¦^listen,accept ¢ž5

TCP

UDP

´ ´ ´

Ä Ä Ä

´

Ä

Client/Server n+1

顪 1

´ send/recv ´ 

Ä sendto/recvfrom Ä Ð

L 3.8-9: TCP ÚUDP «O 6þ››¿gÒ´`§XJÂàä…À«÷ §ÒwŠé§éÒ¬ú:u xêâ§XJ˜ §Ò¬wŠéŒ±¯:uxêâ"TCP Œ±§´UDP vkù«Å ›"TCP 3Ï&L§¥§z˜‡Ñk˜‡SÒ§z˜Ñ£Âé(@â@u x¤õ"

§3.8.10 'uTCP ÑÖì{K ÑÖìà„É^r랦§„‡?nÂuê⧘„k±e{" 1. ÑÖìfork ˜‡f?§§3f?§¥?nÚéÏ&"I?§UY?nÙ¦^r 랦" 2. ÑÖìM‚§§^ÕႧ?nÚéÏ&" 3. ÑÖì^select ¼ê§ÓÎsocket §Ò´`§3Âuêâƒc§kwwsocket ´Ø ´Œ±Âuêâ" 4. ¦^š{l¼ê§Ò´`§accept send ¼ê¬á=ˆ£" e¡~f§Ñ´¢y˜‡{üÑÖì§Ò´l^r=pÂêâ§, âH¬‰^r" annCharles@tom.com

1146,208

uÂê

Python ÆS)P


§3.8 socket ?§ Õá?§ ~f: #/usr/bin/env python # echo.server.fork.py # simpleserver.py import socket,sys,os clients=[] def handledata(s): data = s.recv(1024) while data: try: s.send(data) data = s.recv(1024) except: sys.exit(0) def main(): s = socket.socket(socket.AF_INET,socket.SOCK_STREAM) s.bind((socket.gethostname(),8080)) s.listen(10) while 1: clientsocket,clientaddress = s.accept(); pid = os.fork() if pid==0: # child process # close the server socket . # because the child process should not # care about the accept the connect request s.close() handledata(clientsocket) else: # this is parent process # close the client socket # because the parent should not # care about sending/receiving data clientsocket.close() if __name__ == "__main__" : main() annCharles@tom.com

1147,208

Python ÆS)P


n Python ~^ÂŹ ~f¼§Ă&#x2018;Ă&#x2013;ĂŹ^rĂŤÂ&#x17E;ΤĂ&#x2030;ĂŤ§)Â&#x2DC;Â&#x2021;f?§"fork ŸêÂ&#x2DC;gN^ ĂźgÂ&#x2C6;ÂŁ"ĂšÂ&#x17E;§ßÂ&#x2021;AĂ&#x201C;?§3SÂĽ$1"Ă&#x2DC;Ă&#x201C;Â&#x192;?3u§f?§Â&#x2C6;ÂŁpid ´0 §I?§Â&#x2C6;ÂŁ´f?§ID " f?§Ă&#x2DC;IÂ&#x2021;3?nĂŤÂ&#x17E;Œ§¤¹'4s " ?nĂ&#x201A;uêâ" I?§Ă&#x2DC;IÂ&#x2021;?nĂ&#x201A;uê⧤¹'4clientsocket § UYaccept eÂ&#x2DC;Â&#x2021;^r ĂŤÂ&#x17E;ÂŚ" Â?Â&#x;oÂ&#x2021;'4socket §Ă?Â?If?§AÂ&#x2DC;§ŒÂ&#x201A;Â?Ă&#x201C;Â&#x2039;msocket "¤¹ Â? ;Â?Ă&#x20AC;⧠Ă?'4Â&#x2DC; Ă&#x2DC;^"f?§'4s §Ă&#x2DC;^Ăş%§sĂ&#x2122;¢Â&#x201E;vkýíĂ&#x2DC; K§Ă?Â?Â&#x201E;kI?§3^" f?§XJĂ&#x2030;~òĂ&#x2018; §Ă&#x2DC;ÂŹKÂ?I?§$1"If?§Â&#x192;mĂ&#x2DC;2Â?ê⧌Â&#x201A;Â&#x192; m^Ă?&{§Ă&#x2019;7LÂŚ^Ă&#x2122;§?§mĂ?&Â?{" Ă&#x2022;ĂĄÂ&#x201A;§ ~f: #/usr/bin/env python # echo.server.thread.py import socket,sys,os,thread clients=[] def handledata(s): global clients data = s.recv(1024) while data: try: for i in clients: i.send(data) data = s.recv(1024) except: sys.exit(0) def main(): s = socket.socket(socket.AF_INET,socket.SOCK_STREAM) s.bind((socket.gethostname(),8080)) s.listen(10) while 1: clientsocket,clientaddress = s.accept(); clients.append(clientsocket) annCharles@tom.com

1148Â?,208Â?

Python Ă&#x2020;S)P


§3.8 socket ?§ thread.start_new_thread(handledata,(clientsocket,)) if __name__ == "__main__": main() ĂŠN´O\Â&#x2DC;Â&#x2021;*Ă?ĂľU§Ă&#x2018;Ă&#x2013;ĂŹĂ&#x2DC;Â?r^ruêâHÂŁ§ ´HÂŁÂ&#x2030;¤kĂŤ ^r§Ă&#x2019;Â&#x201D;3mÂŹÂ&#x2DC;" ^Â&#x201A;§Â?ª§Â?kÂ&#x2DC;Â&#x2021;?§3§zÂ&#x2DC;Â&#x2021;?§Â?Ă&#x201C;Â&#x2DC;Â&#x2021;SÂ&#x2DC;m§¤¹Ê^N´¢ yĂ&#x2DC;Ă&#x201C;?§Â&#x192;mĂ?&§Ă&#x201C;Â&#x17E;Â?ĂŠN´)Â&#x2013;ÂŻĂ&#x20AC;â§IÂ&#x2021;c[O§O\&Ă&#x2019;Ăž? n"Þ¥~f¼§kÂ&#x2DC;Â&#x2021;ÂŻK§Ă&#x152;Â&#x201A;§3V\Â&#x2DC;Â&#x2021;socket clients ÂĽÂ&#x17E;ÿ§¤k fÂ&#x201A;§Ă&#x2018;3Â&#x152;UÂŚ^clients §kÂ&#x152;UĂ&#x20AC;â" Â&#x2026;§?Ă&#x203A;Â&#x2DC;Â&#x2021;Â&#x201A;§N^ sys.exit ½Ü)Ă&#x2030;~{§@oÂ&#x2021;Ă&#x2018;Ă&#x2013;ĂŹĂ&#x2019;K " ÂĄĂ&#x2122;ÂŚÂ?{Â?Â&#x2DC;§Ă?Â?ÂŚÂ&#x201A;Ă&#x2018;´^Â&#x2DC;Â&#x2021;Â&#x201A;§?n" Ă&#x201C;Ă&#x17D; #/usr/bin/env python # echo.server.select.py import socket,sys,os,select clients=[] def handledata(s): data = s.recv(1024) for i in clients: i.send(data) def main(): s = socket.socket(socket.AF_INET,socket.SOCK_STREAM) s.bind((socket.gethostname(),8080)) s.listen(10) while 1: rlist , wlist,xlist = select.select([s,],[],[],0) if rlist: # ok, now a new client comming clientsocket,clientaddress = s.accept(); clients.append(clientsocket) rlist , wlist,xlist = select.select(clients,[],[],0) if rlist: for i in rlist: handledata(i) if __name__ == "__main__": main() annCharles@tom.com

1149Â?,208Â?

Python Ă&#x2020;S)P


n Python ~^ÂŹ ĂšÂ&#x2021;~f¼§'Â&#x2026;3uselect Ÿê^{§Œ^ýÿ´Â&#x2DC;|ĂŠÂ&#x2013;´Ă&#x201E;Â&#x152;ÂąĂ&#x2013;"Ă&#x2018;\ d4Â&#x2021;Í꧊O´ÿà ´Ă&#x201E;Â&#x152;Ă&#x2013;ĂŠÂ&#x2013;L§Â&#x152;ĂŠÂ&#x2013;L§ÿà ´Ă&#x201E;kĂ&#x2030;~ĂŠÂ&#x2013;L§Ă&#x161; Â&#x2DC;Â&#x2021;Â&#x2013;Â&#x17E;m" Â&#x2C6;ÂŁÂ&#x17E;ÿ§Â&#x2C6;ÂŁÂ&#x152;Ă&#x2013;ĂŠÂ&#x2013;L§Â&#x152;ĂŠÂ&#x2013;L§Ă&#x161;u) Ă&#x2030;~ĂŠÂ&#x2013;L" s Â&#x152;Ă&#x2013;Â&#x17E;ÿ§LÂŤÂ&#x152;ÂąN^accept Ÿê " clientsocket Â&#x152;Ă&#x2013;Â&#x17E;ÿ§LÂŤÂ&#x152;ÂąN^recv Ÿê " du¤kÂ&#x160;ĂŠĂ&#x2018;´^SÂ&#x2030;1§vkÂż1§S§Ă&#x2DC;ÂŹĂ&#x2018;yÂ?Ă&#x20AC;âÂŻK" Â&#x2026;Â&#x152; [Ăş^Ă&#x201C;Â&#x2DC;Â&#x2021;?§SÂ&#x2DC;m§Â&#x192;pĂ?&Â?Ă&#x2DC;¤¯K" ´XJhandledata Ÿê?ns ĂŠĂ&#x2C6;Â&#x17E;m§½ÜkĂ&#x152;Â&#x201A; §@oĂ&#x2019;ÂŹ{Â&#x17D;Ă&#x201A; #ĂŤÂ&#x17E;ΤĂ&#x161;Ă&#x2122;ÂŚ^rêâ?n"OÂ&#x17E;ĂżÂ?Â&#x2021;%" eÂ&#x2021;?nÂ&#x192;'Ă&#x153;Š

§3.9 Ă&#x201A;eÂ&#x2021; §3.10 POP3 Ă&#x2020;0 §3.10.1 Â&#x2DC;Â&#x2021;{Ăź~f POP3(Post Office Protocol - Version 3) ĂšÂ&#x2021;Ă&#x2020;^u½Ă&#x201A;Â?rĂ XĂ&#x203A;lĂ&#x2018;Ă&#x2013;ĂŹĂ Ă&#x201A; eÂ&#x2021;" Ă?~§POP3 Ă&#x2018;Ă&#x2013;ĂŹ3110 Ă Â?ifTCP ĂŤÂ&#x17E;ÂŚ"Â?rĂ uĂĽĂŤÂ&#x17E;ΤĂ&#x161;Ă&#x2018;Ă&#x2013;ĂŹ ĂŻĂĄTCP ĂŤ" e¥´Â&#x2DC;Â&#x2021;~f: S: <wait for connection on TCP port 110> C: <open connection> S: +OK POP3 server ready <1896.697170952@dbc.mtview.ca.us> C: APOP mrose c4c9334bac560ecc979e58001b3e22fb S: +OK mroseâ&#x20AC;&#x2122;s maildrop has 2 messages (320 octets) C: STAT S: +OK 2 320 C: LIST S: +OK 2 messages (320 octets) S: 1 120 S: 2 200 S: . C: RETR 1 S: +OK 120 octets annCharles@tom.com

1150Â?,208Â?

Python Ă&#x2020;S)P


§3.10 POP3 Ă&#x2020;0 S: S: C: S: C: S: S: S: C: S: C: S: C: S:

<the POP3 server sends message 1> . DELE 1 +OK message 1 deleted RETR 2 +OK 200 octets <the POP3 server sends message 2> . DELE 2 +OK message 2 deleted QUIT +OK dewey POP3 server signing off (maildrop empty) <close connection> <wait for next connection>

§3.10.2 ÂŚ^POP3 Ă&#x2020;Ă&#x201A;eÂ&#x2021; Ă&#x2018;Ă&#x2013;ĂŹĂ&#x201A;ĂŤÂ&#x17E;ÂŚ S:

§uxÂ&#x2DC;Â&#x2021;ÂŻĂżÂ&#x160;"

+OK POP3 server ready <1896.697170952@dbc.mtview.ca.us> ,

§Â?rĂ Ă&#x2019;ux¡-§Ă&#x2018;Ă&#x2013;ĂŹux¡-Â?A"zÂ&#x2DC;Â&#x2021;¡-Ă&#x2018;´Â?kÂ&#x2DC;1"

Â&#x2DC;1½Ă&#x201A;Ă&#x2019;´¹CRLF (ÂŁÂ?Â&#x2020;1) (Â&#x2014;Â&#x2DC;ãêâ" zÂ&#x2021;¡-kÂ&#x2DC;Â&#x2021;'Â&#x2026;i(Keyword)§L¡-œ¥§´4 Â&#x2021;i1§XLIST, STAT  "k¡-Â&#x2018;kꐤ^Â&#x2DC;Â&#x2021;Â&#x2DC;Â&#x201A;ŠmĂŤĂŞĂ&#x161;¡-" ĂŠuk¡-§Ă&#x2018;Ă&#x2013;ĂŹÂ?AškÂ&#x2DC;1"1Â&#x2DC;11Â&#x2DC;Â&#x2021;cÂ&#x152;U´â&#x20AC;&#x153;+OKâ&#x20AC;? ½Üâ&#x20AC;&#x153;ERRâ&#x20AC;? ŠOLÂŤ~Ă&#x161;Ă&#x2030;~Â&#x153;š"

§3.10.3 Ăľ1Â?A?n kÂ&#x2DC; ¡-§Ă&#x2018;Ă&#x2013;ĂŹÂ?AškĂľ1"Â?A(ĂĽIÂ&#x201C;´==Â?šÂ&#x2DC;Â&#x2021;:2 §â&#x20AC;&#x153;.â&#x20AC;?  1"XJê⼚kÂąâ&#x20AC;&#x153;.â&#x20AC;? mĂ&#x17E;1§@oĂ&#x2019;rĂšÂ&#x2021;:UÂ?ĂźÂ&#x2021;:â&#x20AC;&#x153;..â&#x20AC;? §Ă&#x201A;Ă -Ăš 1§Ă&#x2019;Œ´êâ§rÂŚÂĄEL5Ă&#x2019;1 " uxĂ ?nXe: for line in uxêâ¤k1: if line.find(".")==0) : #Âą . mĂ&#x17E; line="."+line ux line 2

=Š¼ĂŠĂ&#x2019;

annCharles@tom.com

1151Â?,208Â?

Python Ă&#x2020;S)P


n Python ~^¬ # vkêâ

ux ".\r\n" Âà?nXeµ for line in Âêâ¤k1: if line == ".\r\n" : break # Â(å if line.find("..")==0) : #± . mÞ line= line[1:] # K˜‡ . V\ line Aêâ¥"

§3.10.4 POP3Ï&L§¥G ràÚÑÖìàÏ&L§¥kn‡Gµ AUTHORIZATION ïáTCP ëƒ

§?\TG"ÑÖ앐ràux¯ÿŠ"

TRANSACTION ràJø^r¶¡Ú—觤õ¹ §ÑÖìàéràe ‡§r©] "3ù‡G¥§rÚÑÖìàm©p·-" TRANSACTION ÑÖìÂQUIT ·- §?\TG§3ù‡G¥§º˜r ©] §¤^rJöŠ§'4TCP ë" 3AUTHORIZATION G§kü«Jø—èÚ^r¶¡ª" 1. ¦^USER ÚPASS ·-|Ü"

2. üÕ¦^APOP ·-"

§3.10.5 POP3¥·e¡0 ˜ė·-: 1. USER -

‚ª: USER name ëê: name ^u½^r¶¡ ^å: 3AUTHORIZATION G¥§ÏÑÖì^r¶¡" A:

annCharles@tom.com

1152,208

Python ÆS)P


§3.10 POP3 Ă&#x2020;0 +OK name is a valid mailbox -ERR never heard of mailbox name - ~f: C: USER frated S: -ERR sorry, no mailbox for frated here ... C: USER mrose S: +OK mrose is a real hoopy frood 2. PASS -

Â&#x201A;ÂŞ: PASS string ĂŤĂŞ: string ^uÂ?½^rÂ&#x2014;è ^ĂĽ: 3AUTHORIZATION G¼§Ă?Ă&#x2018;Ă&#x2013;ĂŹ^rÂ&#x2014;è" Â?A: +OK maildrop locked and ready -ERR invalid password -ERR unable to lock maildrop

- ~f: C: USER mrose S: +OK mrose is a real hoopy frood C: PASS secret S: -ERR maildrop already locked ... C: USER mrose S: +OK mrose is a real hoopy frood C: PASS secret S: +OK mroseâ&#x20AC;&#x2122;s maildrop has 2 messages (320 octets) 3. APOP - Â&#x201A;ÂŞ: APOP username digest - ĂŤĂŞ: username ^uJø^rϴ"digest ^uJø\Â&#x2014;Â&#x2014;è - ^ĂĽ: 3AUTHORIZATION G¼§Ă?Ă&#x2018;Ă&#x2013;ĂŹ^rϴĂ&#x161;Â&#x2014;è" XJÂŚ^USER Ă&#x161;PASS |Ă&#x153;§@o^rϴĂ&#x161;Â&#x2014;èŒ^²Š3ä¼D4§ ĂškSĂ&#x203A;Â&#x2021;"APOP ¡-Ă&#x2019;´Â? Â?\SÂ&#x2DC;ÂŤ@yĂ&#x2026;Â&#x203A;" annCharles@tom.com

1153Â?,208Â?

Python Ă&#x2020;S)P


n Python ~^ÂŹ X J Â&#x2DC; Â&#x2021; Ă&#x2018; Ă&#x2013; ĂŹ | ÂąAPOP ¡ - § @ o 3 ÂŻ Ăż Â&#x160; ÂĽ Â? š Â&#x2DC; Â&#x2021; i Ă&#x17D; G §  Â&#x2030;timestamp §3Unix XĂ&#x161;¼§Â&#x2DC;Â&#x201E;´eÂĄÂ&#x201A;ÂŞ <process-ID.clock@hostname> Ă&#x2122;ÂĽprocess-ID ´?§Ă&#x2019;§clock ´Â?Ă&#x152;Ă&#x2026;$1Â&#x17E;m§hostname ´Ă&#x152;Ă&#x2026; Â?Âś"ĂšzÂ&#x2DC;gš§Ă&#x2018;ÂŹkĂ&#x2DC;Â&#x2DC;timestamp " rtimestamp(Â?)k)Ă&#x2019;) Ă&#x161;Â&#x2014;èĂ&#x153;3Â&#x2DC;ĂĽ\Â&#x2014;§digest Ă&#x2019;´\Â&#x2014; Â&#x2014;Š§\ Â&#x2014;Â&#x17D;{´RFC 1321 ÂĽMD5 "digest ´Â&#x2DC;Â&#x2021;šk16Â&#x2021;i!iĂ&#x17D;G§´Â&#x2DC;Â&#x2021;ĂŠ Â&#x152;ĂŞÂ&#x203A;8?Â&#x203A;LÂŤ" - Â?A: +OK maildrop locked and ready -ERR permission denied - ~f: S: +OK POP3 server ready <1896.697170952@dbc.mtview.ca.us> C: APOP mrose c4c9334bac560ecc979e58001b3e22fb S: +OK maildrop has 1 message (369 octets) 3ĂšÂ&#x2021;~f¼§XJÂ&#x2014;è´tanstaaf @oÂ&#x2021;\Â&#x2014;iĂ&#x17D;G´: <1896.697170952@dbc.mtview.ca.us>tanstaaf \Â&#x2014;)Â&#x2014;Š´¾ c4c9334bac560ecc979e58001b3e22fb 4. STAT -

Â&#x201A;ÂŞ: STAT ĂŤĂŞ: Ă&#x192; ^ĂĽ: eÂ&#x2021;ÂĽeÂ&#x2021;ĂŞĂž Â?A: +OK nn mm

Ă&#x2122;ÂĽnn LÂŤeÂ&#x2021;Â&#x2021;ê§mm LÂŤeÂ&#x2021;¼¤keÂ&#x2021;¤Ă&#x201C;i!ĂŞ" - ~f: C: STAT S: +OK 2 320 ĂšÂ&#x2021;eÂ&#x2021;ÂĽkß¾&§Ă&#x201C;320 Â&#x2021;i!" 5. LIST annCharles@tom.com

1154Â?,208Â?

Python Ă&#x2020;S)P


§3.10 POP3 Ă&#x2020;0 - Â&#x201A;ÂŞ: LIST [msg] - ĂŤĂŞ: msg Íê´Â&#x152;Ă&#x20AC;§XJvkJøÚÂ&#x2021;ꐤ@oT¡-Â?AÂ?šþ 1§zÂ&#x2DC;1Â?²Â&#x2DC;Â&#x2021;eÂ&#x2021;Â&#x152;"XJJø ĂšÂ&#x2021;ꐤ@oĂ&#x2019;Â&#x2C6;ÂŁÂ?½eÂ&#x2021; Â&#x152;" - ^ĂĽ: weÂ&#x2021;Â&#x152; - Â?A: +OK scan listing follows -ERR no such message - ~f: C: LIST S: +OK 2 messages (320 octets) S: 1 120 S: 2 200 S: . ... C: LIST 2 S: +OK 2 200 ... C: LIST 3 S: -ERR no such message, only 2 messages in maildrop Ăľ1Â?A¼§Â?Â?šâ&#x20AC;&#x153;.â&#x20AC;? 1LÂŤÂ?A(ĂĽ"zÂ&#x2DC;1§Â?šßÂ&#x2021;ĂŞi§cÂĄe Â&#x2021;Ă&#x2019;è§ ÂĄ´eÂ&#x2021;Â&#x152;§¹i!Â?ß " 6. RETR -

Â&#x201A;ÂŞ: RETR msg ĂŤĂŞ: msg Â?²Â&#x2021;Ă&#x201A;=ÂľeÂ&#x2021;" ^ĂĽ: Ă&#x201A;eÂ&#x2021;" Â?A: +OK message follows -ERR no such message

XJÂ&#x2C6;ÂŁ~§^Ăľ1LÂŤeÂ&#x2021;SN"Ăľ1Â?A¼§Â?Â?šâ&#x20AC;&#x153;.â&#x20AC;? 1LÂŤÂ?A (ĂĽ"ê⼚kÂąâ&#x20AC;&#x153;.â&#x20AC;? mĂ&#x17E;1§3mĂ&#x17E;\Â&#x2DC;Â&#x2021;â&#x20AC;&#x153;.â&#x20AC;? §Ă&#x201A;Ă Ă&#x201A;Âąâ&#x20AC;&#x153;.â&#x20AC;? mĂ&#x17E; 1§T1Ă&#x2DC;´Â?Â?šâ&#x20AC;&#x153;.â&#x20AC;? 1§@oĂ­Ă&#x2DC;mĂ&#x17E;â&#x20AC;&#x153;.â&#x20AC;?" - ~f: annCharles@tom.com

1155Â?,208Â?

Python Ă&#x2020;S)P


n Python ~^ÂŹ C: S: S: S:

RETR 1 +OK 120 octets <the POP3 server sends the entire message here> .

7. DELE - Â&#x201A;ÂŞ: DELE msg - ĂŤĂŞ: msg Â?½Â&#x2021;Ă­Ă&#x2DC;eÂ&#x2021;Ă&#x2019;è" - ^ĂĽ: Â&#x2030;eÂ&#x2021;eÂ&#x2021;Â&#x2039;ÞíĂ&#x2DC;IP§XJ ÂĄ¡-§3¢Ă&#x161;TeÂ&#x2021;§@oĂ&#x2019;ĂŠĂ&#x2DC;  "´eÂ&#x2021;vkýíĂ&#x2DC;§Â?kĂ?LQUIT ¡-§~?\UPDATE  G§eÂ&#x2021;âĂ­Ă&#x2DC;" - Â?A: +OK message deleted -ERR no such message - ~f: C: DELE 1 S: +OK message 1 deleted ... C: DELE 2 S: -ERR message 2 already deleted 8. NOOP -

Â&#x201A;ÂŞ: NOOP ĂŤĂŞ: Ă&#x192;" ^ĂĽ: Â&#x2DC;ĂśÂ&#x160;" Â?A: +OK

- ~f: C: NOOP S: +OK 9. RSET - Â&#x201A;ÂŞ: RSET - ĂŤĂŞ: Ă&#x192;" annCharles@tom.com

1156Â?,208Â?

Python Ă&#x2020;S)P


§3.10 POP3 Ă&#x2020;0 - ^ĂĽ: XJeÂ&#x2021;DELE ¡-Â&#x2039;Ăž Ă­Ă&#x2DC;IP§@oĂ&#x2019;KIP§Â?Ă&#x2019;´¥E¤ kĂ­Ă&#x2DC;eÂ&#x2021;" - Â?A: +OK - ~f: C: RSET S: +OK maildrop has 2 messages (320 octets) 10. QUIT - Â&#x201A;ÂŞ: QUIT - ĂŤĂŞ: Ă&#x192;" - ^ĂĽ: ?\UPDATE G§Ă&#x2018;Ă&#x2013;ĂŹĂšÂ&#x2021;¡-Â&#x192; §ýĂ­Ă&#x2DC;¤kÂ&#x2018;kĂ­ Ă&#x2DC;IPeÂ&#x2021;§ºÂ&#x2DC;Â?Â?rĂ Â&#x17E;] "'4TCP ĂŤ" - Â?A: +OK -ERR some deleted messages not removed - ~f: C: QUIT S: +OK dewey POP3 server signing off (maildrop empty) ... C: QUIT S: +OK dewey POP3 server signing off (2 messages left) 11. TOP - Â&#x201A;ÂŞ: TOP msg n - ĂŤĂŞ: msg Â?²eÂ&#x2021;Ă&#x2019;è§n Â?²1ĂŞ" - ^ĂĽ: Ă&#x161;RETR aq§´==Ă&#x201A;eÂ&#x2021;Š¼n 1§Ă&#x2DC;Â?)eÂ&#x2021;Ă&#x17E;"eÂ&#x2021;Ă&#x17E; Ă&#x161;eÂ&#x2021;Š^Â&#x2DC;1ŠÂ&#x2026;" - Â?A: +OK top of message follows -ERR no such message - ~f: C: TOP 1 10 S: +OK annCharles@tom.com

1157Â?,208Â?

Python Ă&#x2020;S)P


n Python ~^ÂŹ

S: <the POP3 server sends the headers of the message, a blank line, and the first 10 lines of the body of the message> S: . ... C: TOP 100 3 S: -ERR no such message 12. UIDL - Â&#x201A;ÂŞ: UIDL [msg] - ĂŤĂŞ: msg ´Â&#x152;Ă&#x20AC;§Â?²eÂ&#x2021;Ă&#x2019;è" - ^ĂĽ: Ă&#x161;LIST ¡-aq§´Â&#x2C6;ÂŁĂ&#x2DC;´eÂ&#x2021;Â&#x152;§ ´eÂ&#x2021;unique-id Â&#x2DC; Â&#x2021;Â?Â&#x2DC;IÂŁ" unique-id ´Â&#x2DC;Â&#x2021;iĂ&#x17D;G§ Â&#x152;Ă?´70 §iĂ&#x17D;Â&#x152;¹´0x21â&#x20AC;&#x201C;0x7E ÂĽ?ÂżÂ&#x2DC; Â&#x2021;"ĂšÂ&#x2021;unique-id ´zÂ&#x2DC;Â&#x2021;eÂ&#x2021;Â?Â&#x2DC;§zgšŒĂ&#x2018;Ă&#x2DC;ÂŹC" - Â?A: +OK unique-id listing follows -ERR no such message - ~f: C: UIDL S: +OK S: 1 whqtswO00WBw418f9t5JxYwZ S: 2 QhdPYR:00WBw1Ph7x7 S: . ... C: UIDL 2 S: +OK 2 QhdPYR:00WBw1Ph7x7 ... C: UIDL 3 S: -ERR no such message, only 2 messages in maildrop

§3.11 ^poplib ÂŹĂ&#x201A;eÂ&#x2021; #!/usr/bin/env python # pop3example1.py import sys,os,poplib annCharles@tom.com

1158Â?,208Â?

Python Ă&#x2020;S)P


§3.11 ^poplib ÂŹĂ&#x201A;eÂ&#x2021; def main(): SERVER = "your.email.pop3.server" USER = "username" PASSWORD = "password" # connect to server server = poplib.POP3(SERVER) # login server.user(USER) server.pass_(PASSWORD) # list items on server resp, items, octets = server.list() for item in items: id,size = items.split(" ") # download a random message resp, text, octets = server.retr(id) print "---------------mail No.%d---------------------" print text.join("\n") # be careful, your email will be deleted # server.dele(id) server.quit() if __name__ == "__main__": main() `²¾ 1. poplib.POP Â&#x2C6;ÂŁÂ&#x2DC;Â&#x2021;server ĂŠÂ&#x2013;§3POP Ă?ŠzŸê¼§ŒüÂ&#x2022;Ă&#x2018;Ă&#x2013;ĂŹĂŻĂĄĂŤ §¿Â&#x2026;Ă&#x2018;Ă&#x2013;ĂŹuxÂŻĂżÂ&#x160;"XJĂ&#x2DC;UĂŻĂĄĂŤ§@oĂ&#x2019;Ă&#x2018;socket.error Ă&#x2030;~" 2. server.user Ă&#x161;server.pass_ ¡-§Â&#x2022;Ă&#x2018;Ă&#x2013;ĂŹ@yš"XJšĂ&#x2DC;¤þ§@o Ă&#x2018;poplib.error_proto Ă&#x2030;~"XJÂ&#x2DC;Â&#x2021;¡-Â?AĂ&#x2DC;´¹â&#x20AC;&#x153;+â&#x20AC;? mĂ&#x17E;§@oĂšÂ&#x2021;¡ -Ă&#x2018;ÂŹĂ&#x2018;ĂšĂ&#x2030;~" 3. server.list eÂ&#x2021;L"resp ´Â?AÂĽ1Â&#x2DC;1"items ´Â&#x2DC;Â&#x2021;list §^SÂ?š Ăľ1Â?AÂĽzÂ&#x2DC;1"octets ´þ1Â?AÂĽi!Â&#x2021;ĂŞ"Â&#x2026;´þ1Â?A¡-§Â&#x2C6;ÂŁ Ă&#x2018;´aq" 4. server.retr ^5Ă&#x201A;eÂ&#x2021;"server.dele ^5Ă­Ă&#x2DC;eÂ&#x2021;"Ă­Ă&#x2DC;eÂ&#x2021;ĂšÂ&#x2DC;1§5Âş K §Ă?Â?Â&#x201C;è¼Â?´rĂ&#x201A;eÂ&#x2021;print Ă&#x2018;5§¿vk;§¤¹Â&#x201E;Ă&#x2DC;Ă&#x153;´íĂ&#x2DC;e Â&#x2021;" annCharles@tom.com

1159Â?,208Â?

Python Ă&#x2020;S)P


n Python ~^ Ÿêœ¥

ÂŁĂŁ

p=server(servername,portnumber) p.user(strUser) p.pass (strPass) p.stat()

ĂŻĂĄĂŤ"Â&#x2C6;ÂŁĂŠÂ&#x2013;p§|ÂąeÂĄŸê" ux^rϴ"strUser ´iĂ&#x17D;G" uxÂ&#x2014;è"strPass ´iĂ&#x17D;G" eÂ&#x2021;G"Â&#x2C6;ÂŁÂ&#x2DC;Â&#x2021;tuple §škĂźÂ&#x2021; ĂŞi§L²eÂ&#x2021;Â&#x2021;ê§Ă&#x161;eÂ&#x2021;Â&#x152;" eÂ&#x2021;,Â&#x2DC;ÂľeÂ&#x2021;Â&#x152;"XJÂ? ½which @ o Â&#x2C6; ÂŁ Â&#x2DC; Â&#x2021; Ăź 1 Â? A § X J Ă&#x2DC; Â?½§Â&#x2C6;ÂŁĂľ1Â?A" Ă&#x201A;eÂ&#x2021;"Â&#x2C6;ÂŁÂ&#x2DC;Â&#x2021;tuple §šknÂ&#x2021;Â&#x192;§ ŠO´þ1Â?AÂĽ1Â&#x2DC;1§zÂ&#x2DC;1ê⧠Ă&#x161;êâÂ&#x152;" Ă­Ă&#x2DC;eÂ&#x2021;"Â&#x2C6;ÂŁĂź1Â?A" Â&#x2DC;ĂśÂ&#x160;"Â&#x2C6;ÂŁĂź1Â?A" ÂĄEĂ­Ă&#x2DC;eÂ&#x2021;"Â&#x2C6;ÂŁĂź1Â?A" ^APOP ¡-@y" Ă&#x201A;eÂ&#x2021;Ă&#x17E;§Ă&#x161;retr Â&#x2C6;ÂŁaq" Ă&#x161;list aq§Â&#x2C6;ÂŁeÂ&#x2021;Â?Â&#x2DC;IÂŁ"

p.list(which=None)

p.retr(msg)

p.dele(msg) p.noop(msg) p.rset() p.apop(username,password) p.top(which,howmuch) p.uidl(which=None)

L 3.11-10: poplib ¡-o( lĂšÂ&#x2021;~fÂ&#x152;Âąw§poplib ÂĽ¤k¡-AĂ&#x2018;Ă&#x161;POP3 Ă&#x2020;5½Â&#x192;Â&#x2DC;Â&#x2014;" poplib ¡-o(XL3.11-10

§3.12 SMTP Ă&#x2020;0 SMTP( Simple Mail Transfer Protocol) ´{ĂźeÂ&#x2021;DĂ&#x2018;Ă&#x2020;"ÂŚÂżĂ&#x2DC;Â?6Â&#x2020;. D Ă&#x2018;Ă&#x2020;§Â?Â&#x2021;ÂŚkÂ&#x2DC;Â&#x2021;Â&#x152;Â&#x201A;6Ă?(stream channel)"SMTP ÂŚ^DĂ&#x2018;Ă&#x2020;¼§A^ 2Â?´TCP Ă&#x2020;" SMTP Â&#x2DC;Â&#x2021;Ă&#x152;Â&#x2021;Â&#x160;^Ă&#x2019;´|^DĂ&#x2018;Ă&#x2018;Ă&#x2013;(transport service) Jø?§mĂ?&Â&#x201A; ¸(interprocess communication environment,IPCE) 3Ă&#x152;Ă&#x2026;Â&#x192;m=u(relay) eÂ&#x2021;"

§3.12.1 SMTPÂ&#x2DC;Â&#x2021;~f S: R: S: R: S:

HELO Alpha.ARPA 255 Beta.ARPA welcome MAIL FROM:<Smith@Alpha.ARPA> 250 OK RCPT TO:<Jones@Beta.ARPA>

annCharles@tom.com

1160Â?,208Â?

Python Ă&#x2020;S)P


§3.12 SMTP Ă&#x2020;0 R: S: R: S: R: S: R: S: S: S: R:

250 OK RCPT TO:<Green@Beta.ARPA> 550 No such user here RCPT TO:<Brown@Beta.ARPA> 250 OK DATA 354 Start mail input; end with <CRLF>.<CRLF> Blah blah blah... ...etc. etc. etc. <CRLF>.<CRLF> 250 OK

S L ÂŤ u x Â? §R L ÂŤ  Ă&#x201A; Â? " Ăš Â&#x2021; ~ f ÂĽ § u x Â?  e Â&#x2021; / Â&#x152; ´<Smith@Alpha.ARPA> §  Ă&#x201A; e Â&#x2021;  < k n Â&#x2021; § Š O ´<Jones@Beta.ARPA> §<Green@Beta.ARPA>§<Brown@Beta.ARPA> " SMTP uxÂ?Ă&#x161;Ă&#x201A;Â?pÂ&#x17E;ÿ§uxÂ?uxÂ&#x2DC;Â&#x2021;¡-§Ă&#x201A;Â?Ă&#x201A;¡-§?n §Â&#x2030;Ă&#x2018;Â&#x192;AÂ?A" Ă&#x201A;Â?knÂ&#x2021;Â&#x2026;Ă&#x20AC;ÂŤ 1. forward path Â&#x2026;Ă&#x20AC;ÂŤ"^u;forward path " forword path (cÂ&#x2022;´) ´Â?eÂ&#x2021;Â&#x2C6;Ă&#x201A;Â&#x2021;<´"~X: @HOSTA.ARPA,@HOSTB.ARPA:Smith@HOSTC.ARPA L ÂŤ  ª Ă&#x201A; Â&#x2021; <  / Â&#x152; ´Smith@HOSTC.ARPA §  ´ & Â&#x2021; Â&#x2021;  Â&#x2C6; 8  / § 7 L ² LHOSTA.ARPA Ă&#x161;HOSTB.ARPA  = u " k Ă&#x2019; c ÂĄ  Ă&#x152; Ă&#x2026; Âś ÂĄ § ^ Ă? Ă&#x2019; ŠÂ&#x2026;§LÂŤeÂ&#x2021;Â&#x2C6; ªĂ&#x201A;Â&#x2021;<´"XJĂ&#x2DC;Â?½=uĂ&#x152;Ă&#x2026;§@oĂ&#x2019; ¤Smith@HOSTC.ARPA Ă&#x2019;Â&#x152;Âą " 2. reverse path Â&#x2026;Ă&#x20AC;ÂŤ"^u;reverse path " reverse path ( Â&#x2022;´)´Â?eÂ&#x2021;Â&#x2C6;ÂŁuÂ&#x2021;<´"ÂŚLÂ&#x2C6;Â?ÂŞĂ&#x161;forward path Â&#x2DC;"XJeÂ&#x2021;Ă&#x2DC;UÂ&#x2C6;uÂ&#x2021;<§@ok)Â&#x2DC;Â&#x2021;Â&#x2020;Ă&#x2DC;Ă?§ÚÂ&#x2021;Ă?eÂ&#x2021;á Xreverse path §uxÂ&#x2030;uÂ&#x2021;<" 3. êâÂ&#x2026;Ă&#x20AC;ÂŤ"^u;uxeÂ&#x2021;" k¡-ÂŹĂŠnÂ&#x2021;Â&#x2026;Ă&#x20AC;ÂŤKÂ?" annCharles@tom.com

1161Â?,208Â?

Python Ă&#x2020;S)P


n Python ~^¬

§3.12.2 uxe‡·ƒp¯ÿ Ï&ëffïážÿ§Âàux˜‡¯ÿŠ"~Xµ 220 <SP> USC-ISIF.ARPA <SP> Service ready <CRLF> SP ÚCRLF ©OL«˜‚Ú£†1"USC-ISIF.ARPA L«ÂàÌŶ¡" ¯ÿŠ"

¡‹X

ù´Ï~A"XJÑÖìѯK §ŒU¬ˆ£421 †Ø§L«e‡ÑÖÑ ¯K §ë¬'4" uà¯ÿŠ

§uxHELO ·-"

S: HELO USC-ISIF.ARPA R: 250 BBN-UNIX.ARPA HELO ·-

¡ëꍲuàÌŶ¡"

Âà¤õA´250 §

¡´gCÌŶ¡"

X3u& MAIL ·-^5²reverse path "~X: S: MAIL FROM:<Smith@USC-ISIF.ARPA> R: 250 OK MAIL ·-‚ª¥“FROM:” ¡´reverse path "XJuà´=ue‡§@o¦¬ 3reverse path ¥¹gCÌŶ¡\reverse path cà" XJ¤õ§ÂàA250 "”}{§ŒUˆ£XeA: 552 451 452

e‡;˜mØ " /?nц" XÚ;˜mØ

500 ц{§ŒUˆ£XeA: 501 421 Âà¤õ‰1ù^·reverse path …À«¥"

Š{†Ø§Ã{£O·-" ëꥊ{†Ø" ÑÖì”~§ëò'4"

§˜˜¤k…À«§r“FROM:” ëê¥forward path \\

·‚§XJe‡ux”}§Ò¬)˜‡†ØÏe‡§ux‰u‡<§´§ ù‡žÿXJ2½reverse path {§@où‡†ØÏe‡XJux”}{§Ò¬ )˜‡†ØÏe‡†ØÏe‡§ù̂eŒØ´˜‡Ð¯§¤±§MAIL ·-¥ reverse path Œ±´˜§L«XJe‡ux”}§Ø‡ux£‰e‡ux< "~X: annCharles@tom.com

1162,208

Python ÆS)P


§3.12 SMTP Ă&#x2020;0 MAIL FROM:<> 3uxÂ&#x2020;Ă&#x2DC;Ă?eÂ&#x2021;Â&#x17E;ÿ§Ă&#x2018;´Ă&#x2DC;Â?½reverse path §ÚĂ&#x2019;;Â? eÂ&#x2021;Ă&#x152;Â&#x201A;" uÂ&#x2030;X& RECP ¡-^5Â?²forward path "~X: S: R: S: R: S: R:

RCPT TO:<Jones@BBN-UNIX.ARPA> 250 OK RCPT TO:<Green@BBN-UNIX.ARPA> 550 No such user here RCPT TO:<Brown@BBN-UNIX.ARPA> 250 OK

zÂ&#x2DC;gRCPT ¡-¤þÂ&#x192; §Ă&#x2019;ÂŹ3forward path ÂĽO\Â&#x2DC;Â&#x2021;Vš"zÂ&#x2DC;Â&#x2021;forward path XJÂ?½ =uĂ&#x152;Ă&#x2026;§@oÂ&#x2DC;½Â&#x2021;áX=uĂ&#x152;Ă&#x2026;^S§Â?g=u"Â&#x2DC;Â&#x201E;5`§Ă&#x201A;à ´forword path ÂĽ1Â&#x2DC;Â&#x2021;=uĂ&#x152;Ă&#x2026;§½Ü´ ª8/" XJ´=uĂ&#x152;Ă&#x2026;§@oÂŚĂ&#x2019;eg=uÚ¾eÂ&#x2021;Â&#x17E;ÿ§Ă&#x2019;ÂŹrÂŚgCÂśilreverse path 1Â&#x2DC;Â&#x2021;Ă&#x152;Ă&#x2026;œ¥¼£r§\forward path ÂĽ" &SN´Â&#x;o DATA ¡-^uuxeÂ&#x2021;SN"~XÂľ S: R: S: S: S: R:

DATA 354 Start mail input; end with <CRLF>.<CRLF> Blah blah blah... ...etc. etc. etc. . 250 OK

Ă&#x201A;Ă ÂŹ@Â? ÂĄ¤k1Ă&#x2018;´eÂ&#x2021;SN"uxêâÂ&#x17E;ĂżĂ&#x161;POP3 Ă&#x2020;aq§^Â&#x2DC; Â&#x2021;Â?škâ&#x20AC;&#x153;.â&#x20AC;? 1Lêâ(ĂĽ"XJê⼚kÂąâ&#x20AC;&#x153;.â&#x20AC;? mĂ&#x17E;1§Ă&#x2019;3mĂ&#x17E;\Â&#x2DC;Â&#x2021;â&#x20AC;&#x153;.â&#x20AC;?§ ,ÂŚĂ&#x2DC;==Â?šÂ&#x2DC;Â&#x2021;â&#x20AC;&#x153;.â&#x20AC;? §Ă&#x201A;Ă 3Ă&#x2030;ÂĽ3K\â&#x20AC;&#x153;.â&#x20AC;? §¢y êâĂ&#x;²DĂ&#x2018;"Ă&#x201A; êâV\3êâÂ&#x2026;Ă&#x20AC;ÂŤS" Ă&#x201A;Ă Ă&#x201A;êâ.

§AT?nnÂ&#x2021;Â&#x2026;Ă&#x20AC;ÂŤÂĽ&E§?n.

§Â&#x2DC;Â&#x2DC;¤kÂ&#x2026;Ă&#x20AC;ÂŤ"

XJ¤þ?n Â&#x2026;Ă&#x20AC;ÂŤS&E§Ă&#x201A;Ă ATÂŁA250 OK " Ă&#x201A;Ă Â&#x201E;ÂŹ3eÂ&#x2021;êâmĂ&#x17E;O\Â&#x2DC;1§Â&#x2030;eZ§time stamp "Ăš§zÂ&#x2DC;Â&#x2021;Ă&#x152;Ă&#x2026;Ă&#x2018; ÂŹ3Þ¥Â&#x2039;Â&#x2DC;Â&#x2021;eZ§@oĂ&#x201A;Â&#x2021;<Ă&#x201A;&Â&#x17E;ÿ§ŒĂ&#x2019;Â&#x152;ÂąeÂ&#x2021;´NoluÂ&#x2021;<@p Â&#x2C6;" annCharles@tom.com

1163Â?,208Â?

Python Ă&#x2020;S)P


n Python ~^ÂŹ XJĂ&#x201A;à ´ Â&#x2DC;Â&#x2021;Ă&#x152;Ă&#x2026;§Â?Ă&#x2019;´8Ă&#x152;Ă&#x2026;§@oTĂ&#x152;Ă&#x2026;Â&#x201E;ÂŹ3eÂ&#x2021;êâmĂ&#x17E;O\Â&#x2DC; 1§Â&#x2030;return path §ÚÂ&#x2DC;13 MAIL ¡-ÂĽreverse path &E" ĂšĂ&#x2019;ÂżÂ&#x203A;X§ ªĂ&#x201A;Â&#x2021;<weÂ&#x2021;Â&#x17E;ÿ§ŒeÂ&#x2021;mĂ&#x17E;1Â&#x2DC;1´return path § ÂĄÂ&#x2039;XNĂľeZ(time stamp)&E"e¥´Â&#x2DC;Â&#x2021;#Ă&#x201A;eÂ&#x2021;SNÂ&#x2DC;Â&#x2021;~fÂľ Return-Path: <@GHI.ARPA,@DEF.ARPA,@ABC.ARPA:JOE@ABC.ARPA> Received: from GHI.ARPA by JKL.ARPA ; 27 Oct 81 15:27:39 PST Received: from DEF.ARPA by GHI.ARPA ; 27 Oct 81 15:15:13 PST Received: from ABC.ARPA by DEF.ARPA ; 27 Oct 81 15:01:59 PST Date: 27 Oct 81 15:01:01 PST From: JOE@ABC.ARPA Subject: Improved Mailing System Installed To: SAM@JKL.ARPA This is to inform you that ... Ă&#x2122; ÂĽ 1 Â&#x2DC; 1â&#x20AC;&#x153;Return-Pathâ&#x20AC;? ´  Â&#x2DC; Â&#x2021; e Â&#x2021; Ă&#x2018; Ă&#x2013; ĂŹ O \  §  3 MAIL ¡ - ÂĽ  ĂŤ ĂŞ " ÂĄ n 1 ´ § z Â&#x2DC; Â&#x2021; Ă&#x2018; Ă&#x2013; ĂŹ X  e Z "  Ăš w Â&#x152; Âą   §JOE k u x e Â&#x2021;lABC.ARPA DEF.ARPA §DEF.ARPA GHI.ARPA §GHI.ARPA JKL.ARPA §JKL.ARPA ´Ă&#x201A;Â&#x2021;<SAM Ă&#x152;Ă&#x2026;ϴ" Date

ÂĄTo (ü§´eÂ&#x2021;Ă&#x17E;§

ÂĄĂ&#x2018;´eÂ&#x2021;Š "

XJĂ&#x201A;Ă 3Ă&#x201A;êâÂ&#x192; uyĂ&#x153;ŠeÂ&#x2021;Ă&#x201A;ĂśĂ&#x2DC;U¤þĂ&#x201A;eÂ&#x2021;§@oÂŚÂ?ÂŹÂŁ A250 OK §Â?Ă&#x2DC;LÂŹ)Â&#x2DC;Â&#x2021;eÂ&#x2021;Â&#x2020;Ă&#x2DC;Ă?eÂ&#x2021;§uxÂ&#x2030;uÂ&#x2021;<" 2Â&#x201E; ÂŚ^QUIT ¡-(ĂĽeÂ&#x2021;uxL§"~X: S: QUIT R: 221 BBN-UNIX.ARPA Service closing transmission channel

§3.12.3 Ă&#x2122;Œ¡RSET XJ3uxeÂ&#x2021;L§¼§uĂ uxRSET ¡-§@oLÂŤÂ&#x2DC;ĂŻuxeÂ&#x2021;§Â&#x2DC;Â&#x2DC;¤kÂ&#x2026; Ă&#x20AC;ÂŤ" VRFY ĂšÂ&#x2021;¡-^uu´Ă&#x201E;Â&#x152;ÂąuxeÂ&#x2021;Â&#x2030;,Â&#x2021;^r"VRFY

ÂĄÍê´Â&#x2DC;Â&#x2021;^rÂś

ÂĄ" annCharles@tom.com

1164Â?,208Â?

Python Ă&#x2020;S)P


§3.12 SMTP Ă&#x2020;0 S: VRFY Smith R: 250 Fred Smith <Smith@USC-ISIF.ARPA> S: VRFY Smith R: 251 User not local; will forward to <Smith@USC-ISIQ.ARPA> S: VRFY Jones R: 550 String does not match anything. S: VRFY Jones R: 551 User not local; please try <Jones@USC-ISIQ.ARPA> S: VRFY Gourzenkyinplatz R: 553 User ambiguous. 1Â&#x2DC;Â&#x2021;~f¼§£x250 Â?A§LÂŤeÂ&#x2021;Â&#x152;ÂąÂ&#x2020;uxÂ&#x2030;Smith "Â?AÂĽÂ?škSmith ^rϴ" 1Â&#x2021;~f¼§£x251 Â?A§LÂŤeÂ&#x2021;Ă&#x2DC;Â&#x152;ÂąÂ&#x2020;uxÂ&#x2030;Smith §´Ă&#x201A;Ă Â&#x152;ÂąĂ?L Ă&#x2122;§Ă&#x152;Ă&#x2026;=uÂ&#x2030;Smith " 1nÂ&#x2021;~f¼§£x550 Â?A§LÂŤeÂ&#x2021;Ă&#x2DC;Â&#x152;ÂąÂ&#x2020;uxÂ&#x2030;Smith §Ă&#x201A;Ă Â?Ă&#x2DC;Â&#x152;ÂąĂ?L Ă&#x2122;§Ă&#x152;Ă&#x2026;=uÂ&#x2030;Smith §´Ă&#x201A;Ă wÂ&#x160;uĂ Â&#x152;¹à Â&#x2DC;Ă Ă&#x2122;ÂŚĂ&#x152;Ă&#x2026;, USC-ISIQ.ARPA " 1oÂ&#x2021;~f¼§£x553 Â?A§LÂŤĂ&#x2DC;Â?Â&#x2DC;Â&#x2021;^rGourzenkyinplatz " ĂšÂ&#x2021;¡-Ă&#x2DC;ÂŹĂŠnÂ&#x2021;Â&#x2026;Ă&#x20AC;ÂŤE¤KÂ?" EXPN EXPN ¡-^r*Ă?Â&#x2DC;Â&#x2021;eÂ&#x2021;Lϴ"EXPN Íê´Â&#x2DC;Â&#x2021;eÂ&#x2021;aLœ¥§Ă&#x201A;Ă X JĂšÂ&#x2021;eÂ&#x2021;L¤k^r§@oĂ&#x2019;ÂŹrĂšÂ&#x2021;eÂ&#x2021;LÂĽ¤k^rÂ&#x2C6;ÂŁÂ&#x2021;uĂ "~ X: S: R: R: R: R: R: R:

EXPN Example-People 250-Jon Postel <Postel@USC-ISIF.ARPA> 250-Fred Fonebone <Fonebone@USC-ISIQ.ARPA> 250-Sam Q. Smith <SQSmith@USC-ISIQ.ARPA> 250-Quincy Smith <@USC-ISIF.ARPA:Q-Smith@ISI-VAXA.ARPA> 250-<joe@foo-unix.ARPA> 250 <xyz@bar-unix.ARPA> zÂ&#x2DC;1Ă&#x2018;Â?šÂ&#x2DC;Â&#x2021;^rϴ"5¿þ1Â?AÂĽ250

ÂĄÂ&#x2018;k~Ă&#x2019;§LÂŤÂ&#x201E;kÂ?

A" annCharles@tom.com

1165Â?,208Â?

Python Ă&#x2020;S)P


n Python ~^¬ ù‡·-جén‡…À«E¤K" SEND SOML SAML SEND ·-ÚMAIL ·-aq§ØÓ´§XJ^r¹ ˜Ìŧ@oSEND · -´re‡ux^rªàþ§ Ø´^re‡¥" 5>fe‡^rÑ´¹ARPA net þ˜ÌÅâU w>fe‡"XJ ^r¹ž§ÒŒ±†uxe‡^r¹ªàþ " ´y3õ^r´¦^POP3 ÆlÌÅþe1e‡/Ö§ Ø´¹e‡ ÑÖìþ " XJ^rvk¹§@oÂà¬ux”}A" SOML ·-¿g´SEND or MAIL §L«uxe‡^rªàþ§½öux^ re‡¥" SAML ·-¿g´SEND or MAIL §L«uxe‡^rªàþ§¿…ux^ re‡¥" HELP Âàù‡·- §•uàuxÏ&E"ù‡·-Œ±‘kÙ¦·-‰ëê§^ u,˜‡A½·-Ï&E" ù‡·-جén‡…À«E¤K" NOOP ˜öŠ"Âào´ˆ£250 OK " TURN ^u†uxàÚÂ৏Ҵù‡·-ƒ

§uxàCÂà§ÂàCux

à" XJïáÏ餞m½ö7a§@oF"3˜gë¥Óž¤uxÚ§ù‡· -Òék^" 3IP ¥TCP ëØ´é[B§¤±˜„Ø^ù‡·-"

§3.12.4 ESMTP §3.12.5 ¹@y

annCharles@tom.com

1166,208

Python ÆS)P


1oĂ&#x2122;

Tkinter ? § §4.1 Tkinter0 §4.1.1 Â&#x;o´Tkinter Tkinter ´Â&#x2DC;Â&#x2021;python §´Â&#x2DC;Â&#x2021;N^Tcl/Tk Â?"Tcl/Tk ´Â?ĂŞĂ&#x2DC;Ăľ(Â? N´Â?Â&#x2DC;)ª² ĂŁ/.ÂĄÂ?" 3Â&#x152;þêUnix ²ĂžĂ&#x2018;kTcl/Tk"y3Windows Ă&#x161;MacOS ĂžÂ?Â&#x152;¹Œ^Tcl/Tk Tk  . C Â&#x160; Ăł  Â? 3 Ă&#x201E;  ĂŤ  ÂĽ tkinter ÂĽ §Tkinter.py ´ | ^ tkinter  Â&#x2DC; Â&#x2021;Python Â?C§^uÂ?Python ^rJøÂ?" XĂ&#x161;

gXã4-1e§¹X windows �~¾ Your App Here(Python) Tkinter(Python Module) tkinter(C) Tk Widgets(C and Tcl) Tk(C) Xlib (C)

ĂŁ 4-1: Tkinter XĂ&#x161;

gĂŁ

Your App Here (Python) Python A^§S§N^Tkinter.py gv Tkinter (Python Module) Tkinter.py ^urPython ÂĽLÂ&#x2C6;Â?ÂŞ=C¤Â?Tk ¡Ă&#x161;ĂŤĂŞ" tkinter (C) ^urTkinter.py )¤Tk ¡-Ă&#x161;ꐤD4Â&#x2030;Tk )ºÏ§4Ă&#x2122;)ÂşÂ&#x2030; 1" annCharles@tom.com

1167Â?,208Â?

Python Ă&#x2020;S)P


o Tkinter ?§ Tk Widgets (C and Tcl) Tk ´dC Ă&#x161;Â&#x2DC;Ă&#x153;ŠTcl ¤" Tk (C) Tk .

C Â&#x160;ĂłĂ&#x153;Š"

Xlib (C) N^X ¼§Ă&#x161;X Server Ă?&" Python ^rĂ&#x2DC;ÂŹÂ&#x2020;N^ tkinter § ´Ă?LTkinter.py mÂŚ^ÂŚ" Tkinter Ă&#x2DC;´Â?Â&#x2DC;Python ĂŁ/?§Â?§´Ă&#x2122;ÂĽ'61Â&#x2DC;Â&#x2021;" Â&#x152;A:´ª ²"²w":´5UĂ&#x2DC;Ă?§Ă?Â?Tcl/Tk Â?´)Âş5Â&#x160;ó§Python Â?´§^Python )¤Tcl/Tk Â&#x201C;è§, 2^Tcl/Tk )ÂşÂ&#x2030;1§Â&#x201E;Ă?,'Â&#x2020;N^. ĂŁ/Â?Â&#x2021;ú§ ĂšÂ?´ŒÂ?ª²¤GĂ&#x2018;Â&#x201C;d"´Â&#x152;þêÂ&#x153;še§\Ă&#x2DC;ïå¤ZĂžÂ&#x2021;UĂ&#x153;§IÂ? jº¤¹Â&#x2DC;Â&#x201E;´Â&#x152;¹ávÂ&#x2021;ÂŚ" Â&#x2DC;Â&#x201E;ÂŚ^Tkinter Â?{´ from Tkinter import * Â?Â&#x152;¹´ import Tkinter ´Tkinter zÂ&#x2021;ŸêĂ&#x161;acÂĄĂ&#x2018;Â&#x2021;kTkinter.somefunc() §ĂĽ5ʤÂ&#x17E;m" Â&#x;o´Widget ? Widget ´Button(UĂ&#x153;) §Canvas(xĂ&#x2122;) §Menu(èß) §Label(Ăź 1 I \) §Message(Ăľ 1 I \) §Listbox( L) §Entry (Ăź 1 Ă&#x2018; \ Âľ) §Frame(Âľ e) §Radiobutton(þĂ&#x20AC;Â&#x2DC;ĂźĂ&#x20AC;Âľ) §CheckButton(EĂ&#x20AC;Âľ) §Scrollbar( EĂ&#x201E;^) §Text(Ăľ 1ŠĂ&#x2018;\Âľ) §Scale(3Â&#x2DC;½Â&#x2030;Â&#x152;SĂ&#x20AC;JÂ&#x2DC;Â&#x2021;ĂŞÂ&#x160;EĂ&#x201E;^) TopLevel(IÂ?) Ă&#x161;ÂĄ" Â&#x; o ´option ? ¤ k Widget Ă&#x2018; k ĂŠ Ăľoptions § Â? )fg(c Âľ Ă&#x161;) §bg( Âľ Ă&#x161;) §font(iN) §command(ÂŻÂ&#x2021;?nŸê) §text(SN) "

§4.2

Hello Tkinter §S

§4.2.1 {Ăź~f Ă&#x2020;SÂ&#x160;ĂłĂ&#x2018;´lâ&#x20AC;&#x153;Hello Worldâ&#x20AC;? mŠ§¡Â?Ă&#x2DC;Âť~" # File: hello1.py # \ Tkinter from Tkinter import * # MĂŻÂ&#x2DC;Â&#x2021; root Widget # Ă?~zÂ&#x2DC;Â&#x2021; Tkinter §SĂ&#x2018;kÂ&#x2DC;Â&#x2021;§ Â&#x2026;Â?kÂ&#x2DC;Â&#x2021; # root widget annCharles@tom.com

1168Â?,208Â?

Python Ă&#x2020;S)P


§4.2 Hello Tkinter §S # ΫÂ&#x2DC;Â&#x2021;{ĂźIÂ?§Â&#x2018;kIK9§Ă&#x161;>ÂľĂ&#x161;Ă&#x2122;ÂŚ Windows # Manage JøCÂť" # 7L3MĂŻĂ&#x2122;ÂŚ WidgetÂ&#x192;c§MĂŻ root widget" # Â?Â&#x152;ÂąĂ&#x2DC;Mï§Tkinter ÂŹgĂ&#x201E;Â?\MĂŻÂ&#x2DC;Â&#x2021;" root = Tk() # MĂŻÂ&#x2DC;Â&#x2021; Label§ w§ # root ´ w  master(IIÂ?)§ # w ´ root  slave (fIÂ?) # ĂšpâÂ&#x160;k:Ă&#x2DC;Ă&#x201C;u Windows§ Windows e # ´ parent window§ Ă&#x161; child window" # text ´ w Â&#x2DC;Â&#x2021; option (Ă&#x20AC;Â&#x2018;)§LÂŤ w ÂĽ # Â&#x2021;wÂŤSN§Â&#x152;¹´Ši½Üã¥" w = Label(root, text="Hello, world!") # w MĂŻÂ&#x192; §¿vkĂ˝wÂŤ3Âś4¼§ # Â?k3 pack Â&#x192; §âUÂ&#x160;â Label ÂĽSN§OÂ&#x17D;Ă? # Label Â&#x152;§Â&#x2DC; Â&#x2DC;§, wÂŤ3Âś4Ăž" w.pack() # ?\ÂŻÂ&#x2021;Ă&#x152;Â&#x201A;§Ă&#x201A;5g^rÂŻÂ&#x2021;§Â&#x2030;1ĂŠA # ÂŻÂ&#x2021;?n§Â&#x2020;^rN^ quit() ½Ü IÂ?'4 " # mainloop() Â&#x201E;Â&#x2021;?nSĂ&#x153; widget Â?#§5g # Ă&#x161; Windows Manager Ă?&" root.mainloop() $1§S %python hello1.py $1(JXĂŁ4-2

ĂŁ 4-2: hello1.py $1(J ^B0 Â&#x2DC;eWM(Windows Manager)§Ă&#x2122;GX Windows ^rÂ?NĂŠWMĂ&#x2DC;ÂŹ))" ´Windows ^rĂ&#x2019;ÂŹĂŠ)) "3X NX(¼§IÂ?>¾§IK9§'4UĂ&#x153;§  Â&#x152;z§ z§IÂ?ÂŁĂ&#x201E;§Â&#x2DC;Â&#x152; §Ă&#x2018;´WM 5Â&#x2030;§WM Ă&#x2DC;L´Â&#x2DC;Â&#x2021;Ă&#x160;Ă? annCharles@tom.com

1169Â?,208Â?

Python Ă&#x2020;S)P


o Tkinter ?§ X Client§Ă?LIOĂ&#x2020;Ă&#x161;X Server Ă?&"?Ă&#x203A;Â&#x2DC;Â&#x2021;X client §SĂ&#x2018;Â&#x152;ÂąĂ&#x161;WM 5Ă?&" 3Windows XĂ&#x161;¼§WM Ă&#x161;Â&#x2021;ĂśÂ&#x160;XĂ&#x161;Ă&#x153;3Â&#x2DC;ü§ÊJŠÂ&#x2DC;Ă&#x2122;§´¡lWin XP Ă&#x161;Win 2000 w§kÂ&#x2DC; Windows §SÂ&#x152;ÂąĂ?L,ÂŤĂ&#x2026;Â&#x203A;¤WM ĂľU§4Windows  *wĂĽ5Â&#x201D;MacOS §½ÜX eĂ&#x2122;ÂŚWM J"

§4.2.2 ,Â&#x2DC;Â&#x2021;{ߧS 3Â&#x2DC;Â&#x2021;'Â&#x152;§S¼§ Ă?rÂ&#x2DC;Â&#x2021;\§S3Â&#x2DC;Â&#x2021;a¼§Xe # File: hello2.py from Tkinter import * class App: def __init__(self, master): # MĂŻÂ&#x2DC;Â&#x2021; Frame ^uÂ?šĂ&#x2122;ÂŚ widget frame = Frame(master) frame.pack() #MĂŻÂ&#x2DC;Â&#x2021;UĂ&#x153; self.button = Button ( frame, # master widget text="QUIT", fg="red", command=frame.quit ) self.button.pack(side=LEFT) self.hi_there = Button(frame, text="Hello", command=self.say_hi ) self.hi_there.pack(side=LEFT) def say_hi(self): print "hi there, everyone!" root = Tk() app = App(root) root.mainloop()

$1(JXã§4.2.2 XJ\Uâ&#x20AC;?Helloâ&#x20AC;? UĂ&#x153;§3Â&#x203A;Â&#x203A;ĂžÂ&#x2039;<â&#x20AC;&#x153;hi there, everyone!â&#x20AC;?" XJw ´Â&#x2DC;Â&#x2021;widget§w.pack(side=LEFT) LÂŤ{Â&#x2DC;w Â?ÂŞ" annCharles@tom.com

1170Â?,208Â?

Python Ă&#x2020;S)P


§4.3 Widget Â&#x2DC;

ĂŁ 4-3: hello2.py $1(J

§4.3 Widget Â&#x2DC; Tk ÂĽzÂ&#x2DC;Â&#x2021;widget Ă&#x2018;kĂŠĂľoption §Ă?LUCĂš option Â&#x152;ÂąUCwidget  *" ;.option kÂ&#x203A;Â&#x203A;wÂŤSN§ôĂ&#x161;§Â&#x152;§¯Â&#x2021;?nŸê§Tkinter Jø Ă&#x161;Â&#x2DC; .ÂĄ^u?n¤koption. Ă?~kÂąeÂ?{?nwidget option: â&#x20AC;˘ Â&#x152;¹Œ^eÂĄÂ?{3MĂŻwidget Â&#x17E;ĂżÂ&#x2DC;widget options" widgetclass (master , option=<value> ...) ~X: w = label(root,text="hello",fg="red") MĂŻÂ&#x2DC;Â&#x2021;widget §Â&#x2030;w §Œmaster widget ´root §Œoption ÂŚ^ ÂĄĂŤĂŞ 5Â&#x2030;½"¤kwidget option Ă&#x2018;k%@Â&#x160;§¤¹ {ĂźMĂŻÂ&#x2DC;Â&#x2021;widget Â?{ ´¤koption Ă&#x2018;ÂŚ^%@Â&#x160;§Â?Ă&#x2019;´Ă&#x2DC;Â?½?Ă&#x203A;option§Â?IÂ?½widget master widget§XJ\ĂŠB{§$Â&#x2013;ĂŤmaster widget Â?Â&#x152;ÂąĂ&#x2DC;^Â?½§Tkinter ÂŹ^ C ÂŚ^Lmaster widget Â&#x160;Â?%@master widget " â&#x20AC;˘ w.cget(option) Â&#x2DC;Â&#x2021;widget option Â&#x160;"w ´Â&#x2DC;Â&#x2021;widget "¤kwidget class Ă&#x2018;kr__getitem__ N w.cget Þ§¤¹ŒÂ&#x201A;ĂźÂ&#x2021;vkÂ&#x;oÂŤO"¤¹ ^w[option] Â&#x2DC;Â&#x152;ÂąÂ&#x2DC;Â&#x2021;option "~X: w = Label(text="abc") print w.cget("text") print w["text"] # vkÂŤO§Ă&#x2018;Â&#x152;Âą abc ¡úw[â&#x20AC;&#x2122;textâ&#x20AC;&#x2122;] Â?ÂŞÂ?Ă?wÂ&#x2DC; " â&#x20AC;˘ ^w.configure ½Üw.config Â&#x2DC;option Â&#x160;"w.config ´w.configure  §¤ ¹þUĂžvkÂŤO"^{Ă&#x161;MĂŻwidget Â&#x17E;ĂżÂ&#x2DC;" w.config(option=<value>, ... ) ~X: annCharles@tom.com

1171Â?,208Â?

Python Ă&#x2020;S)P


o Tkinter ?§ w.config(text="xxx") ¤kwidget class r__setitem__ N w.config Þ§¤¹ w["text"] = â&#x20AC;&#x2122;xxxâ&#x20AC;&#x2122; JÂ&#x2DC;" XJkĂŠĂľoption Â&#x2021;Â&#x2DC;§@o^config Â?Ă?wÂ&#x2DC; "XJÂ?kÂ&#x2DC;Â&#x2021;options Â&#x2021; Â&#x2DC;§@o^ ÂĄÂ?ÂŞÂ?Ă?w1 " â&#x20AC;˘ config ¤ ŸêXJĂ&#x2DC;Â&#x2018;?Ă&#x203A;ꐤ@oÂŹÂ&#x2DC;Â&#x2021;widget ¤kÂ&#x152;ÂąÂ&#x2DC;option ϴ"w.keys() Â?Â&#x2DC;"¡Â?U Œ^w.keys() §ŒÂżĂ&#x201A;Â?Â&#x2DC;Ă&#x2122;§{Ăź"~X: for k in w.keys(): print "%s = %s"%(k,w[k]) Â&#x152;ÂąÂ&#x2039;<Â&#x2DC;Â&#x2021;widget ¤koption " nÞ¤ã§Â&#x2013;ÂŻÂ&#x2DC;Â&#x2021;widget option kĂź@Â?{" w.config() w.config(optionname=optionvalue,...) w.cget(â&#x20AC;&#x2122;optionnameâ&#x20AC;&#x2122;)

w.keys() w[â&#x20AC;&#x2122;optionnameâ&#x20AC;&#x2122;]=optionvalue w[â&#x20AC;&#x2122;optionnameâ&#x20AC;&#x2122;]

äNÂŚ^@ÂŤdÂ&#x2021;<S.ݽ§¡ú1ÂŤÂ?ÂŞÂ?Ă?"

§4.4 Geometry Manager(AĂ&#x203A;+nĂŹ) Â&#x;o´Geometry Manager? ?LGUI <kĂš²{§{Â&#x2DC;Ă?zÂ&#x2DC;Â&#x2021;Widget ´Â&#x2DC;Â&#x2021;ĂŠÂ&#x201E;ÂĄÂŻÂ&#x153;§ÚÂ&#x2021;N zÂ&#x2DC;Â&#x2021;Widget gÂ&#x152;§4ÂŚU ʤ Â?šĂ&#x161;wÂŤÂŚSĂ&#x153;SN§Â&#x201E;Â&#x2021;Â&#x2DC;Ă?Ă&#x161;Ă&#x2122;ÂŚ 73Widget Â&#x192;mĂĽl§4ÂŚÂ&#x201A;Â?Â&#x192;mĂĽlŒÞÞ!§Â&#x201E;Â&#x2021;Â&#x2DC;Ă?ÂŚ3Master ÂĽÂ Â&#x2DC;§XJMaster Â&#x152;UC §ATXĂ&#x203A;NWidget ¤k" Â&#x201E;ÂĄÂŻÂ&#x153;Ă&#x2019;Â&#x2030;OÂ&#x17D;Ă&#x2026;Â&#x2030;§Tk Jø AÂ&#x2021;Geemetry Manager"Â&#x152;ÂąÂ?Ă?\¤Ú

ĂľU§Â?^ĂŠÂ&#x201C;è§Ă&#x2019;Â&#x152;Âą4\.ÂĄwĂĽ5ĂŠ;Â&#x2019;" ĂšĂ&#x161;Delphi ½ÜVB Â&#x152;Ă&#x20AC;z?§Â&#x201A;¸§kĂŠÂ&#x152;Ă&#x2DC;Ă&#x201C;"VB ´Â&#x2DC;ÂŤWYSIWYG§What you see is what you get (¤ Â&#x201E; = ¤ ) Â? ÂŞ §Geometry Manager ´ Â&#x2DC; ÂŤWYTIWYG §What you think is what you get (¤Â&#x17D;=¤)"k:Â&#x201D;TeX(LaTeX) Ă&#x161;Word ÂŤO" 3VB ¼§\rWidget {Â&#x2DC;3=§\w§$1(JĂ&#x2019;Ă&#x161;\wÂ&#x2DC;§´\ Â&#x2021;Ă&#x2DC;äĂ&#x20AC;Jâ&#x20AC;&#x153;Â&#x201A;ÂŞ/ĂŠĂ â&#x20AC;? èߧrÂŚÂ&#x201A;戤Â&#x2DC;3Ă&#x153;¡ Â&#x2DC;§ĂšIÂ&#x2021;²â["{ *gĂ&#x161;<Nó§Ă&#x2020;*g§âU4ÂŚÂ&#x201A;wĂĽ5ĂŠ{" 1

Â?N\"{*:Ă&#x161;¡Ă&#x2DC;Â&#x2DC;"

annCharles@tom.com

1172Â?,208Â?

Python Ă&#x2020;S)P


§4.4 Geometry Manager(AĂ&#x203A;+nĂŹ) ^Geometry Manager §\IÂ&#x2021;^Â&#x2DC; ĂŤĂŞwÂ&#x160;ÂŚ\Â&#x17D;Â&#x2021;JĂ&#x2019;Â&#x152;Âą §Â&#x2DC;½´\Â&#x17D; Â&#x2021;" Â&#x2DC;Â&#x201E;Tk knÂŤGeometry Manager : â&#x20AC;˘ Pack â&#x20AC;˘ Grid â&#x20AC;˘ Place e¥ŠO0 "

§4.4.1 Pack +nĂŹ kAÂ&#x2021;âÂ&#x160;y0 Â&#x2DC;e" cavity : master widget Ăž  Â&#x2DC; m § L ÂŤ Š  Â&#x2DC; Ă&#x153; Š Â&#x2DC; m Â&#x2030; Â&#x2DC; Ă&#x153; Šslave widget Â&#x192; §master widget ĂžÂ&#x201E;Â?eÂ&#x2DC;m§^uŠÂ&#x2030;Ă&#x2122;ÂŚÂ&#x201E;vk{Â&#x2DC;Ă?slave widget " parcel : lcavity ¼ŠĂ&#x2018;Â&#x2DC;Â&#x2021;Â&#x2DC;m§^u{Â&#x2DC;Â&#x2DC;Â&#x2021;slave widget " zgÂ&#x2030;Â&#x2DC;Â&#x2021;slave widget ŠÂ&#x2DC;mÂ&#x17E;ÿ§Ă&#x2018;´lcavity ÂĽÂ&#x2DC;Â&#x2021;parcel§, 2 rslave widget {Â&#x2DC;3parcelÂĽ", lcavity ÂĽ~parcel Â&#x152;§Â&#x2DC;Â&#x2021;#cavity § UYŠ§Â&#x2020;¤kslave widget Ă&#x2018;{Â&#x2DC;." Pack + n ĂŹ  ÂŚ ^ Â? { ĂŠ { Ăźw.pack(options) "w ´ Â&#x2DC; Â&#x2021;slave widget" ~ ^ options k: Pack+nĂŹ~^option side LÂŤrw Â&#x2DC;3@Â&#x2021;>Ăž"Â&#x152;¹´TOP (Ăž) §BOTTOM( e)§LEFT( Â&#x2020;)§RIGHT( m)" padx Ă&#x161;pady LÂŤparcel zÂ&#x2DC;Â&#x2021;>Ă&#x161;w Â&#x192;mĂ˝3Â&#x2DC;m" ipadx Ă&#x161; ipady LÂŤwzÂ&#x2DC;Â&#x2021;>Ă&#x161;w SÂ?šSNÂ&#x192;mĂ˝3Â&#x2DC;m"w ÂŹĂ?dCÂ&#x152;" fill Â&#x152;¹´None, x, y , both"XJparcel Â&#x152; §@oĂ&#x2019;ÂŹÂ&#x160;âfill Â&#x160;§O\slave widget Â&#x152;" â&#x20AC;˘ â&#x20AC;˘ â&#x20AC;˘ â&#x20AC;˘

None: LÂŤÂ&#x2018;Âąslave widget 5Â&#x152;" X : LÂŤÂ?*Â&#x152;slave widget °Ă?" Y : LÂŤÂ?*Â&#x152;slave widget pĂ?" BOTH: LÂŤĂ&#x201C;Â&#x17E;*Â&#x152;slave widget °Ă?Ă&#x161;pĂ?"

Â&#x160;5Âż§fill ´Â?slave widget Â&#x152;Ă&#x161;parcel Â&#x152;Â&#x192;m'X§Ý½slave widget NUCgCÂ&#x152;§5¡Aparcel Â&#x152;" annCharles@tom.com

1173Â?,208Â?

Python Ă&#x2020;S)P


o Tkinter ?§ anchor LÂŤ3parcel ÂĽÂ&#x2DC;Â&#x2DC;slave widget Â?ÂŞ"Â&#x152;¹´¹eÂ&#x160;""Â&#x17D;Â&#x160;´CENTER" W N NW SW CENTER

Â&#x201A;Â&#x2020;Â&#x2DC;Â&#x2DC; Â&#x201A;ĂžÂ&#x2DC;Â&#x2DC; Â&#x201A;Â&#x2020;ĂžÂ&#x2DC;Â&#x2DC; Â&#x201A;Â&#x2020;eÂ&#x2DC;Â&#x2DC; Â&#x2DC;3ÂĽm

E S NE SE

Â&#x201A;mÂ&#x2DC;Â&#x2DC; Â&#x201A;eÂ&#x2DC;Â&#x2DC; Â&#x201A;mĂžÂ&#x2DC;Â&#x2DC; Â&#x201A;meÂ&#x2DC;Â&#x2DC;

ĂšpÂ&#x160;5Âż´§XJfill Â&#x160;´X §@oanchor ´W Ă&#x161;E Ă&#x2019;Ă&#x192;¤¢ §Ă?Â?slave widget °Ă?Ž²´ Â&#x152;§Â&#x201A;Â&#x2020;Â&#x2DC;Â&#x201E;´Â&#x201A;mÂ&#x2DC;Ă&#x2019;vkÂ&#x;oÂżĂ&#x201A; "Ă&#x201C;n§XJfill Â&#x160;´Y §@oanchor ´N Ă&#x161;S Ă&#x2019;Ă&#x192;¤¢ "XJfill Â&#x160;´BOTH §@oanchor option Ă&#x2019;vkÂżĂ&#x201A; "ÚÊĂ&#x2DC;Ă?§grid +nĂŹ3ĂšÂ&#x2DC;:ĂžkU?" expand Â&#x152;¹´0 ½Ü1"XJ´1 §LÂŤslave widget ÂŹÂ&#x160;âe¥¤`Â?{§rmaster  Â?{Â&#x2DC;mŠÂ&#x2021;zÂ&#x2DC;Â&#x2021;slave widget parcel"XJ´0 §4Â?{Â&#x2DC;mÂ&#x2DC;X" Â&#x160;5Âż´§expand ´Â?master Â?{Â&#x2DC;mĂ&#x161;¤kslave widget parcel Â&#x192;m'X XJr¤kslave widget Ă&#x2018;{Â&#x2DC;Ă? §´Â&#x201E;kÂ?{Â&#x2DC;m§ŒÝ½´Ă&#x2DC;´rmaster Â?{Â&#x2DC;mÂ&#x2030;¤kparcel " 5¿§¹Þ¤koption Xside§padx , pady , ipadx , ipady , expand, fill Ă&#x2018;´N ^pack() Â&#x17E;Â?½option§ Ă&#x2DC;´MĂŻwidget Â&#x17E;ĂżÂ?½option" Pack Â&#x17D;{ zÂ&#x2DC;Â&#x2021;master widget Ă&#x2018;kÂ&#x2DC;Â&#x2021;packing list ^u+nÂŚSĂ&#x153;¤kslave widget"MĂŻÂ&#x2DC; Â&#x2021;#slave widget§3master widget Packing list (Â&#x2014;J\Â&#x2DC;Â&#x2021;slave widget"Â&#x201E;Â&#x152; Âą^in , after , before ĂšnÂ&#x2021;option UC^S" Pack +nĂŹUĂŹpacking list owidget ^S§Â&#x2DC;Â&#x2DC;{Â&#x2DC;zÂ&#x2DC;Â&#x2021;widget"3fm Š§master widget SĂ&#x153;¤kÂ&#x2DC;mĂ&#x2018;´Â&#x2DC;§Ă&#x2019;´cavity (Â&#x2DC;Ă&#x2030;)" Pack UĂŹÂ&#x2DC;eĂ&#x161;½¿Ă&#x201A;{Â&#x2DC;zÂ&#x2DC;Â&#x2021;slave widget" 1. áXÂ&#x2DC;Â&#x2021;cavity Â&#x2DC;Â&#x2021;>Â&#x192;eÂ&#x2DC;Â&#x2021;Ă?/§Â&#x2030;parcel (Â?K)§äNá=Â&#x2DC;Â&#x2021;>´dside option Â?½" XJside = TOP ½Üside = BOTTOM §@oparcel °Ă?Ă&#x2019;´cavity °Ă?§pĂ? Ă&#x2019;´slave widget Â&#x2021;ÂŚpĂ?§2\Ăžpady Ă&#x161;ipady ÚßÂ&#x2021;options ¤Â?½ĂŞÂ&#x160;" XJside = LEFT ½Üside = RIGHT §@oparcel pĂ?Ă&#x2019;´cavity pĂ?§°Ă? Ă&#x2019;´slave widget Â&#x2021;ÂŚ°Ă?§2\Ăžpadx Ă&#x161;ipadx ÚßÂ&#x2021;options ¤Â?½ĂŞÂ&#x160;" Âą parcel Â&#x201E;Â&#x152;UĂ?Â?expand option ¤Â?½Â&#x160; CÂ&#x152;"XJ¤kslave widget Ă&#x2018; Â&#x2DC;Ă?§uymaster widget Â&#x201E;kĂľ{Â&#x2DC;mvkÂŚ^§@oĂ&#x2019;ÂŹÂ&#x160;âexpand option annCharles@tom.com

1174Â?,208Â?

Python Ă&#x2020;S)P


§4.4 Geometry Manager(AĂ&#x203A;+nĂŹ) 5UC¤kparcel Â&#x152;"XJexpand option ´0 §@oĂ&#x2019;Â&#x17D; §Ă&#x2019;4@ Â&#x2DC; /Â?Â&#x2DC;XĂ? "XJexpand option ´1 §@oĂ&#x2019;rÂ?eÂ&#x2DC;mĂž!ŠÂ&#x2030;¤k parcel"XJÂ&#x2DC;Â&#x2021;Â&#x152;Âą*Â&#x152;slave widget side option ´left ½Üright §@orĂľ {Y²ül²ÞŠÂŚÂ&#x201A;"XJÂ&#x2DC;Â&#x2021;Â&#x152;Âą*Â&#x152;slave widget side option ´top ½Übottom §@orĂľ{RÂ&#x2020;ĂĽl²ÞŠÂŚÂ&#x201A;"ĂšÂ?ĂŠ"y(š5§grid + nĂŹO\ ­Vg§´k¤U?" 2. pack +nĂŹslave widget Ă&#x20AC;JĂ&#x153;¡pĂ?Ă&#x161;°Ă?"°Ă?Â&#x2DC;Â&#x201E;´widget ¤I°Ă?\Þß ipadx §pĂ?´Â&#x2DC;Â&#x201E;´widget ¤IpĂ?\Þßipady §Â?Â&#x;o´ß? ´Ă?Â? Â&#x2020;mĂ&#x2018;IÂ&#x2021;3Ă&#x2018;ipadx ĂĽl§Ă&#x201C;ĂžeÂ?Ă&#x2018;IÂ&#x2021;Ăľ3Ă&#x2018;5ipady ĂĽl"´XJfill option Â&#x160;XJ´X ½ÜBOTH§@o*Â&#x152;°Ă?§slave widget °Ă?´parcel ° Ă?~Ăźpadx Â&#x160;§Ă&#x201C;XJfill option Â&#x160;´Y ½ÜBOTH §@oslave widget °Ă?´parcel °Ă?~Ăźpady Â&#x160;§ 3. pack +nĂŹrslave widget Â&#x2DC;3parcel ÂĽ"XJslave widget 'parcel §@oĂ&#x2019;Â&#x160; âanchor option 5Â&#x2DC;Â&#x2DC;slave widget§parcel Â?eÂ&#x2DC;mÂ?Ă&#x2DC;ÂŹÂ&#x2030;Ă&#x2122;ÂŚslave widget ÂŚ ^ "XJpadx option ½Üpady option Â&#x160;Ă&#x2DC;´0 §@o3parcel >.Ă&#x161;slave widget >.Â&#x192;mo´Â&#x2021;3Ă&#x2018;5padx Ă&#x161;pady @oĂľÂ&#x2DC;xÂ&#x2DC;m" Â&#x2DC;Â&#x2DC;Ă?Â&#x2DC;Â&#x2021;slave widget §pack +nĂŹÂŹ~parcel §Â?eÂ&#x2DC;Â&#x2021;'cavity ^ 5Â&#x2DC;Â&#x2DC;eÂ&#x2DC;Â&#x2021;slave widget"XJcavity Â&#x2DC;mĂ&#x2DC; Â&#x2DC;Â&#x2DC;Â&#x2DC;Â&#x2021;slave widget §@oĂšÂ&#x2021;slave widget ÂŹĂ&#x201C;âcavity ¤kÂ&#x2DC;m"cavity  Â&#x2013;0 Â&#x17E;ÿ§Ă&#x2122;ÂŚÂ?eslave widget Ă&#x2019; wĂ&#x2DC; §Ă&#x2DC;Â&#x161;master widget CÂ&#x152;" Â&#x2DC;Â&#x201E;Â&#x153;šemaster widget ÂŹgĂ&#x201E;CÂ&#x152;§âÂ&#x160;Â&#x2030;Geometry Propragation (AĂ&#x203A;DĂ&#x201A;§ Â&#x152;DĂ&#x201A;)"Geometry propragation ÂżgĂ&#x2019;´`§gĂ&#x201E;Nmaster widget °Ă?Ă&#x161;p Ă?§^5Ă?Â&#x2DC;Â&#x2DC;¤kslave widget §¿Â&#x2026;ÂŹ3widget  g(ÂĽD4Â&#x152;"Â&#x;o Â&#x2030;widget  g(? ¡Â&#x201A;master widget Ă&#x161;slave widget 'X" master widget q ´,Â&#x2DC;Â&#x2021;widget slave widget"ĂšĂ&#x2019;Â&#x201D;/¤ Â&#x201D;Â&#x152;Â&#x152;§IÂ&#x160;§f§Â&#x161;fĂš g' X"Â?Â&#x152;Âą`´äÂ&#x201C;§äª§äÂ&#x160;'X" Ă&#x201E;kOÂ&#x17D;äÂ&#x201C;widget Â&#x152;§äÂ&#x201C;widget vkslave widget §ŒÂ&#x201A;ÂŹgCOÂ&#x17D;gCÂ&#x152; §vÂąNBe¤kslave widget ¤kSN§, Â?šÚÂ&#x2021;äªwidget Â&#x152;Ă&#x2019;Â&#x152;ÂąÂ&#x160;â Œ¤slave widget Â&#x152;UC§ÚÂ&#x2DC;Â&#x2020;Â&#x2022;ĂžD4§Â&#x2020;TopLevel" Ăš ª(JĂ&#x2019;´¤kWidget {Â&#x2DC;Â&#x203A;ŠĂ&#x153;n",§kÂ&#x17E;ÿÚĂ&#x2DC;´¡Â&#x201A;Â&#x17D;Â&#x2021; (J§@o¡Â&#x201A;Â&#x152;ÂąĂ?LN^eÂĄŸêĂ&#x160;Â&#x17D;Geometry Propagation" w.pack_propagate(â&#x20AC;&#x2122;trueâ&#x20AC;&#x2122;) ÂŚ ^Pack + n ĂŹ  Â&#x17E; Ăż § ² ~ ÂŹ ÂŚ ^frame widget § ^ u r Â&#x2DC; |widget w ¤ Â&#x2DC; Â&#x2021;widget" annCharles@tom.com

1175Â?,208Â?

Python Ă&#x2020;S)P


o Tkinter ?§

§4.4.2 Grid +nĂŹ ÂŚ+Pack ĂŠĂ&#x2DC;Â&#x2020;§´§Êþ§S @Â?Grid +nĂŹÂ?Ă?^" Â&#x2026; -<ÂŹÂ? ^Grid § Ă&#x2DC;^Pack"Â?NŒ´Ê"¡@Â?Â&#x2C6;kÂ&#x2C6;`:" ¡@Â?Grid +nĂŹVg{ߧþUrÂ&#x152;§(š§(¢'Pack rÂ&#x2DC; " ÂŚ^Grid Â?{Â?ĂŠ{ߧĂ&#x161;Pack aq§N^w.grid(options) §w ´Â&#x2DC;Â&#x2021;slave widget" Grid + n ĂŹ r Â&#x2DC; Â&#x2021;master widget  ¤ k Â&#x152; ^ Â&#x2DC; m Š ¤ Â&#x201A; G  ĂŠ Ăľ  ° " z Â&#x2DC;  °Â&#x2030;Â&#x2DC;Â&#x2021;Cell §Ă&#x161;Pack +nĂŹÂĽparcel VgĂŠÂ&#x192;Â&#x201D;"^row §column §rowspan §columnspan Ă&#x2019;Â&#x152;Âą(½Â&#x2DC;Â&#x2021;cell "ke~^option" ~^options row Â?²3@Â&#x2DC;1 column Â?²3@Â&#x2DC; rowspan Â?²Ă&#x201C; A1 columnspan Â?²Ă&#x201C; A ipadx ipady Ă&#x161;Pack +nĂŹÂżĂ&#x201A;Â&#x192;Ă&#x201C;"LÂŤslave widget SĂ&#x153;O\W¿ül" padx pady LÂŤslave widget >.Ă&#x161;cell >.Â&#x192;mW¿ül" sticky Â&#x152;¹´N §W §S §E §Â?š ´Pack +nĂŹÂĽfill §anchor ĂľU"LÂŤCell 'slave widget Â&#x152;Â&#x17E;ÿ§XĂ&#x203A;{Â&#x2DC;slave widget§7Â&#x2021;Â&#x17E;ÿ§O\slave widget p Ă?½Ü°Ă?" XJ´ßÂ&#x2021;N L§Â&#x2022;ĂžÂ&#x201A;§aqPack +nĂŹÂĽanchor= N " XJ´ßÂ&#x2021;|Ă&#x153;L§XN+S §LÂŤO\pĂ?§aquPack +nĂŹÂĽfill = Y " XE+W §LÂŤO\°Ă?§aquPack +nĂŹÂĽfill = X " X J Ăź Â&#x2021;  | Ă&#x153; ´N+E L ÂŤ Ă&#x2DC; O \ p Ă? ½ ° Ă? § Â&#x2022; m Ăž Â? { Â&#x2DC; § Â&#x192;  ufill=None§anchor=NE Ă&#x2122;§aq" XJ´þÂ&#x2021;|Ă&#x153;N+W+S+E LÂŤÂ&#x2DC;3ÂĽm"aquPack +nĂŹÂĽfill=BOTH " XJĂ&#x2DC;Â&#x2DC;sticky Â&#x160;§LÂŤĂ&#x2DC;O\pĂ?Â?Ă&#x2DC;O\°Ă?§Â&#x2DC;3ÂĽm§aquPack +n ĂŹÂĽanchor=CENTER§fill=None " annCharles@tom.com

1176Â?,208Â?

Python Ă&#x2020;S)P


§4.4 Geometry Manager(AĂ&#x203A;+nĂŹ) Grid +nĂŹÂ&#x17D;{ knÂ&#x2021;Ă&#x161;½: 1. OÂ&#x17D;Â&#x2013;IÂ&#x2021;ĂľÂ&#x152;/Â?§Ă&#x2019;Â&#x152;Âą{Â&#x2DC;e¤kslave widget " 2. ^ĂžÂ&#x2DC;Ă&#x161;OÂ&#x17D;(JĂ&#x161;master widget ¢SÂ&#x152;'§XJĂ&#x2DC;Â&#x2DC;Â&#x152;§@oĂ&#x2019;O\½ Ăś~master widget Â&#x152;" 3. Â&#x160;âzÂ&#x2DC;Â&#x2021;slave widget sticky options §{Â&#x2DC;¤kslave widget " 31Â&#x2DC;Ă&#x161;¼§Ă&#x201E;kOÂ&#x17D;¤kÂ?Ă&#x201C;Â&#x2DC;1(½)cell °Ă?(½pĂ?)§Â?Ă&#x2019;´rowspan=1 (½colspan=1)cell "zÂ&#x2DC;1(½) °Ă?(½ÜpĂ?)Ă&#x2019;´ÚÂ&#x2DC;1(½)¼¤IÂ&#x2021; Â&#x152;° Ă?(½ÜpĂ?)§¹yÂ&#x2DC;e¤kslave widget "zÂ&#x2DC;1§zÂ&#x2DC;Â&#x152;Ă&#x2018; §Úz Â&#x2DC;Â&#x2021;cell Â&#x152;Ă&#x2019;(½ " , 3Ă&#x201E;Ă&#x201C;Ăľ1(½Üþ)cell §cell ¤Ă&#x201C;ĂŤY1(½)Â&#x2030;Â&#x2DC;Â&#x2021;cell group §cell group °Ă?(½ÜpĂ?)´|S¤kcell °Ă?(½ÜpĂ?)Ă&#x161;"XJcell group

Â&#x152;§v Â&#x2DC;eÂ&#x192;ĂŠAslave widget §@o Ă? §Â&#x2018;Âą|S¤k1(½)°Ă?(½p Ă?)Ă&#x2DC;C"XJÂ&#x2DC;Ă&#x2DC;e§Ă&#x2019;IÂ&#x2021;O\|SCell zÂ&#x2DC;1(½)Ă?(½pĂ?)"O\Â?{Ă&#x2019;´Â&#x160; â1(½)weight(­) U'~5O\cell group ÂĽzÂ&#x2DC;1(Ăś)°Ă?(ĂśpĂ?)§weight Â&#x152;O\þ§weight O\§weight ´0 Ă&#x2019;Ă&#x2DC;O"XJcell group ¼¤kcell weight Ă&#x2018;´0§@oĂ&#x2019;²ÞO\|S¤kcell °Ă?(½pĂ?)" Â?ge§Â&#x152;Âą(½zÂ&#x2DC;(½1)°Ă?(½pĂ?)§ÚzÂ&#x2DC;Â&#x2021;cell Ă&#x161;cell group Â&#x152; Ă&#x2019;(½ " Â&#x2DC;Â&#x2DC;1weight§Â&#x152;¹Œ^grid rowconfgure Ÿê§~X m.grid_rowconfigure(0,weigtht=2) r101weight Â&#x2DC;Â?2 " Â&#x2DC;Â&#x2DC;weight§Â&#x152;¹Œ^grid columnconfgure Ÿê§~X m.grid_columnfigure(0,weigtht=2) r10weight Â&#x2DC;Â?2 "Ă&#x2122;ÂĽm ´¤kslave widget master widget" 31Ă&#x161;¼§XJmaster widget Â&#x161;~Â&#x152;§Â&#x201E;kĂŠĂľÂ?{Â&#x2DC;m§@oĂ&#x2019;ÂŹrRÂ&#x2020;(½ ĂśY²)Â?{Â&#x2DC;mŠÂ&#x2030;¤k1(½Ü)§Â&#x160;âzÂ&#x2DC;1(½Ü)weight Â&#x160;U'~Š §weight Â&#x152;Ăľ§weight §weight Â?0 Ă&#x2DC;"XJ¤k1(½Ü)weight Ă&#x2018;´0 §@oĂ&#x2019;rRÂ&#x2020;(½ÜY²)Â?{Â&#x2DC;m²ÞŠ3Ăže(½ÜÂ&#x2020;m)ßà §Â?Ă&#x2019;´Ă&#x2DC;ÂĽ Â&#x2DC;Â&#x2DC;"Ăš§^weight Vg¤ Pack +nĂŹÂĽexpand option ĂľU" nÞ¤ã§Grid +nĂŹÂĽoption Â&#x2021;'Pack +nĂŹÂĽoption Â&#x2021;Ăľ"´þU %'Â&#x192;Â?\(š§Â?\rÂ&#x152;§Pack UÂ&#x2030;§Grid AĂ&#x2018;UÂ&#x2030;§Grid UÂ&#x2030;§Pack IÂ&#x2021;Â&#x2DC; Â&#x2DC;ĂŠĂľframe Ă&#x161;ĂŠĂľoption âU¤" annCharles@tom.com

1177Â?,208Â?

Python Ă&#x2020;S)P


o Tkinter ?§ Place +nĂŹ Place Â&#x152; Âą ° (  Â&#x2DC; Â&#x2DC; Â&#x2DC; Â&#x2021;slave widget   Â&#x2DC; Ă&#x161; Â&#x152;  § a q uVB ÂĽ top§left §bottom §right ĂĄ5"ÚÊÌÂ&#x2020;§Â&#x2DC;Â&#x201E;Ă&#x2DC;^"XJ\Ă˝IÂ&#x2021;ĂšoÂ&#x2030;§@oĂ&#x2019; Ă&#x192;ĂžĂ? "Â&#x2013;¡6Â&#x17E;Ă&#x2DC;ÂŹ^ÂŚ"

§4.5 Widget ÂŞ dNĂľwidget Ă&#x2018;|ÂąĂ&#x201C;option §Ú option ½Ă&#x201A; widget Ă&#x201E;ª§Â?) Ă´Ă&#x161;§iN"

§4.5.1 Ă´Ă&#x161; Â&#x152; Ăľ ĂŞ widget # N ^ r  Â&#x2DC;background option Ă&#x161;foreground option 5 U C Â&#x2DC; Â&#x2021;widget cÂľĂ&#x161;Ă&#x161;ÂľĂ&#x161;"cÂľĂ&#x161;Â&#x2DC;Â&#x201E;´widget Þ¥ŠiĂ´Ă&#x161;" bg Ă&#x161;fg ´background Ă&#x161;foreground {ÂĄ"XJ\Â&#x2039;i'ú½Ü'B§@oĂ&#x2019; ^bg Ă&#x161;fg Â&#x201C;Obackground Ă&#x161;foreground" 3Â?½ôĂ&#x161;Â&#x17E;ÿ§Â&#x152;ÂąÂ&#x2020;Â?½RGB nÂ&#x2021;ŠÞÂ&#x160;§Â?Â&#x152;ÂąÂ?½ôĂ&#x161;Âśi§ Xred, green " Ă´Ă&#x161;Âśi Tkinter škÂ&#x2DC;Â&#x2021;Ă´Ă&#x161;ê⼧^uÂ?š¤kĂ´Ă&#x161;ϴĂ&#x161;Ă´Ă&#x161;¢SRGB Â&#x160;ĂŠA 'X"êâ¼¼Â?š~^Ă´Ă&#x161;§XÂľred , yellow , blue , green §lightblue §Â?Â?) Â&#x2DC; Ă&#x2DC;~^´Ê¤ Ă´Ă&#x161;§XMoccasin, PeachPuff, etc. 3X windows XĂ&#x161;¼§ôĂ&#x161;ÂśidX windows ½Ă&#x201A;§Â&#x152;Âą3ĂŠrgb.txt §Â&#x2DC;Â&#x201E; 3/usr/X11R6/lib/X11/ 8šeĂšÂ&#x2021;ŠÂ&#x2021;ÂĽÂ?š ¤kĂ´Ă&#x161;ÂśiĂ&#x161;Ă´Ă&#x161;RGB Â&#x160;ĂŠA 'X" 3Windows XĂ&#x161;e§Â&#x152;¹Œ^Windows XĂ&#x161;Ă´Ă&#x161;(Â&#x152;ÂąĂ?LÂ&#x203A;Â&#x203A;ÂĄÂ&#x2020;UC) SystemActiveBorder, SystemActiveCaption, SystemAppWorkspace, SystemBackground, SystemButtonFace, SystemButtonHighlight, SystemButtonShadow, SystemButtonText, SystemCaptionText, SystemDisabledText, SystemHighlight, SystemHighlightText, SystemInactiveBorder, SystemInactiveCaption, SystemInactiveCaptionText, SystemMenu, SystemMenuText, SystemScrollbar, SystemWindow, SystemWindowFrame, SystemWindowText. 3Macintosh ¼§Â&#x152;¹Œ^eÂĄXĂ&#x161;Ă´Ă&#x161;: SystemButtonFace, SystemButtonFrame, SystemButtonText, SystemHighlight, SystemHighlightText, SystemMenu, SystemMenuActive, SystemMenuActiveText, SystemMenuDisabled, SystemMenuText, SystemWindowBody. annCharles@tom.com

1178Â?,208Â?

Python Ă&#x2020;S)P


§4.5 Widget ÂŞ Ă´Ă&#x161;œ¥´Ă&#x2DC;ŠÂ&#x152;" Â&#x2026;k Ă´Ă&#x161;ÂśiÂ&#x152;Âą3ĂźcÂ&#x192;m\Â&#x2DC;Â&#x2021;Â&#x2DC;Â&#x201A;" Xâ&#x20AC;?light blueâ&#x20AC;? â&#x20AC;?LightBlueâ&#x20AC;? ´Â&#x2DC;Â&#x2021;Ă´Ă&#x161;" RGB Ă´Ă&#x161;Â&#x160; Â&#x201E;Â&#x152;ÂąÂ?½RGB nÂ&#x2021;ŠÞÂ&#x160;§5Â?½ôĂ&#x161;"Â&#x201A;ª´ #RGB,#RRGGBB, #RRRRGGGGBBBB ~X: w["fg"]="#f00" w["fg"]="#ff0000" w["fg"]="#ffff00000000" Ă&#x2018;´rcÂľĂ&#x161;U¤ÚĂ&#x161;"RGB nÂ&#x2021;ŠÞĂ&#x2018;AT´Â&#x203A;8?Â&#x203A;"eÂĄ{Ăź~f§`²

XĂ&#x203A;Â&#x2DC;RGB ŠÞ" tk_rgb = "#%02x%02x%02x" % (172, 182, 220) tk_rgb = "#%04x%04x%04x" % (172, 182, 220) w.wininfo_rgb() Â&#x152;ÂąrĂ´Ă&#x161;ϴÂ&#x20AC;Ă&#x2C6;ÂĄÂ?Ă´Ă&#x161;RGB ŠÞ"X rgb = widget.winfo_rgb("red") red, green, blue = rgb[0]/256, rgb[1]/256, rgb[2]/256 5Âżwinfo_rgb Â&#x2C6;ÂŁ´Â&#x2030;Â&#x152;´0 â&#x20AC;&#x201C; 65535 §XJÂ&#x2021;0 â&#x20AC;&#x201C; 256 Â&#x2030;Â&#x152;SÂ&#x160;§Â&#x2021;Ă&#x2DC; Âą256 âÂ&#x152;¹§Â?Ă&#x2019;´mÂŁ8  "

§4.5.2 iN Tkinter ÂĽwidget #N^rÂ?½iN"Â&#x2DC;Â&#x201E;Ă&#x2DC;IÂ&#x2021;Â?½iN§Ă?Â?Tk ÂĽÂ&#x152;þê{ Ăźwidget §XLabel §Button §Ă&#x2018;kĂŠĂ?%@iN" 3Â?½iNÂ&#x17E;ÿ§^font option §Tkinter Â&#x152;¹Œ^Ă&#x2DC;Ă&#x201C;Â?ÂŞÂŁĂŁiN" â&#x20AC;˘ â&#x20AC;˘ â&#x20AC;˘ â&#x20AC;˘

iNÂŁĂŁĂ&#x17D;(font descriptor ) ^rg½Ă&#x201A;iNœ¥§Œ^tkFont ÂŹ" XĂ&#x161;iNϴ X iNÂŁĂŁĂ&#x17D;( X font descriptor)

iNÂŁĂŁĂ&#x17D;(font descriptor) lTk 8.0 mŠ§Tkinter Â&#x152;¹Œ^Ă&#x2022;ĂĄuäNXĂ&#x161;iN£ã§kĂ?uª²?§"Â&#x152; ÂąĂ?LÂ?½iNx§iNpĂ?§Ă&#x161;Ă&#x2122;ÂŚÂ&#x2DC; Â&#x152;Ă&#x20AC;iNÂşÂ&#x201A;(font style)5Â?½iN"X annCharles@tom.com

1179Â?,208Â?

Python Ă&#x2020;S)P


o Tkinter ?§ ("Times", 10, "bold") ("Helvetica", 10, "bold italic") ("Symbol", 8) iNÂşÂ&#x201A;(font style) ´Â?iN´Ă&#x2DC;´\o§´Ă&#x2DC;´N" XJ==Â&#x2030;Ă&#x2018; iNxœ¥§@oĂ&#x2019;ÂŹ%@iNpĂ?§Ă&#x161;iNÂşÂ&#x201A;" XJiNxœ¥¼Ă&#x2DC;škÂ&#x2DC;Â&#x201A;§Â?Â&#x152;Âą==Â&#x2030;Ă&#x2018;5Â&#x2DC;Â&#x2021;iĂ&#x17D;G^5ÂŁĂŁiN"Â&#x201E;Â&#x152;Âą O\iNpĂ?Ă&#x161;iNÂşÂ&#x201A;½Ă&#x201A;" "Times 10 bold" "Helvetica 10 bold italic" "Symbol 8" 3Windows ÂĽ~^iNÂ?): Arial (corresponds to Helvetica), Courier New (Courier), Comic Sans MS, Fixedsys, MS Sans Serif, MS Serif, Symbol, System, Times New Roman (Times), and Verdana: XJiNxœ¢¼škÂ&#x2DC;Â&#x201A;§@oĂ&#x2019;7L^1Â&#x2DC;ÂŤLÂ&#x2C6;Â?ÂŞ5LÂŤiN" ~^iNÂşÂ&#x201A;k: normal, bold, roman, italic, underline, Ă&#x161;overstrike. 3Ă&#x2DC;Ă&#x201C;²Þ§Tk 8.0§gĂ&#x201E;rĂš ~^iN§X§Courier, Helvetica, Ă&#x161;Times N²iNLÂ&#x2C6;Â?ªÞ§ Â&#x2026;§XJiNNÂ&#x201D;}{§Â?ÂŹĂŠÂ&#x2DC;Â&#x2021; bCi N5Â&#x201C;O"¤¹3Â?½iNÂ&#x17E;ĂżTk 8.0 l5Ă&#x2018;Ă&#x2DC;ÂŹwÂ&#x2020;Ă&#x2DC;"XJĂŠĂ&#x2DC; bCi N§@oĂ&#x2019;´^%@iN"´Tk @Â? bCiN§kÂ&#x17E;ÿ¿Ă&#x2DC;´\Â&#x17D;Â&#x2021;§¤¹Ă&#x2DC; Â&#x2021;LĂľÂ?Â&#x201A;ĂšÂ&#x2021;A5" Windows eTk 4.2 Â?|¹ÚiNLÂ&#x2C6;Â?ÂŞ" ÂŚ^tkFont Font a5Â?½iN Ă&#x2DC; ^ i N ÂŁ ĂŁ Ă&#x17D;(font descriptor) ÂŁ ĂŁ i N Â&#x192; § Â&#x201E; Â&#x152; Âą Ă? LtkFont 5 Â? ½ i N"Font ÂŹÂĽtkFont a§Â&#x152;Âą^5Â?½iN"?Ă&#x203A;Tkinter IÂ&#x2021;iNꐤ\Ă&#x2018; Â&#x152;Âą^tkFont 5Â?½"~X: annCharles@tom.com

1180Â?,208Â?

Python Ă&#x2020;S)P


§4.5 Widget ÂŞ tkFont.Font(family="Times", size=10, weight=tkFont.BOLD) tkFont.Font(family="Helvetica", size=10, weight=tkFont.BOLD, slant=tkFont.ITALIC) tkFont.Font(family="Symbol", size=8) myfont=tkFont.Font(...) Â&#x2C6; ÂŁ Â&#x2DC; Â&#x2021; ĂŠ Â&#x2013;  Â&#x2030;myfont § @ o Ă&#x2019; Â&#x152; Âą ^w.config(font=myfont) 5 Â? ½widget w  i N ´myfont ¤ ÂŁ ĂŁ  i N " Ăš  k Â&#x2DC; Â&#x2021; Ă? ? ´ § X J ÂŚ ^myfont.config(size=40) § @ o ¤ k ÂŚ ^myfont Â&#x160; Â? i N widget iNĂ&#x2018;gĂ&#x201E;Â?# §âÂ&#x160;Â&#x2030;font propagate "ʤ"Ăš3§S¼§Â&#x152;ÂąÂ&#x2030;Â&#x2DC; |aqwidget Â?½iNmyfont §, Â?Â&#x2021;?U myfont @oĂšÂ&#x2DC;|widget iNĂ&#x2018;ÂŹ Â?#" tkFont.Font |Âąoption XL4.5-1: Option

a.

ÂŁĂŁ

family size weight slant underline overstrike

string integer constant constant flag flag

iNxϴ iNÂ&#x152;§ß point §XJ´Kê§ß ´pixel NORMAL Â&#x201E;´BOLD §%@´NORMAL. NORMAL Â&#x201E;´ITALIC §%@´NORMAL. 1 Â&#x2018;eyÂ&#x201A;"0 Ă&#x2DC;Â&#x2018;eyÂ&#x201A;" 1 ÂĽmkĂŽÂ&#x201A;§0ÂĽmĂ&#x2DC;Â&#x2018;ĂŽÂ&#x201A;" L 4.5-1: tkFont |Âąoption

XĂ&#x161;iNϴ Tk Â&#x201E;|ÂąXĂ&#x161;½Ă&#x201A;iNœ¥§3X Windows e§Â&#x2DC;Â&#x201E;´Â?iNOϤXfixed, 6x10 " Windows e§Â&#x152;¹´ansi, ansifixed, device, oemfixed, system, and systemfixed" 3Macintosh e§XĂ&#x161;iNϴÂ&#x152;¹´application and system" 5ÂżXĂ&#x161;iNœ¥´iN¥§Â?)iNxϴĂ&#x161;iNÂ&#x152;§iNÂşÂ&#x201A;"XJlÂ&#x152; ÂŁÂ&#x2021;5Ă&#x201E;{§ Ă?Ă&#x2DC;Â&#x2021;ÂŚ^ڍÂ?ÂŞ" X Font Descriptor X Font Descriptor ´Œ^eÂĄÂ&#x201A;ÂŞiĂ&#x17D;G"(Ă&#x2019;LÂŤ^%@Â&#x160;" -*-family-weight-slant-*--*-size-*-*-*-*-charset family LÂŤiNxϴ" weight Â&#x152;¹´Bold ½ÜNormal" annCharles@tom.com

1181Â?,208Â?

Python Ă&#x2020;S)P


o Tkinter ?§ slant Â&#x152;¹´R LÂŤRoman §~"½ÜI LÂŤN"½ÜO LÂŤoblique §NÂ&#x2DC;" size ´LÂŤiNÂ&#x152;§ß ´point Â&#x203A;ŠÂ&#x192;Â&#x2DC;§Ă?~72 point = 1 inch charset LÂŤiĂ&#x17D;8§Ă?~´ISO8859-1" -*-Times-Bold-R-*--*-120-*-*-*-*-ISO8859-1 LÂŤiN´12 point Â&#x152;§\oTimes iN§Œ^ISO Latin 1 ?èiĂ&#x17D;8" XJ\Ă&#x2DC;'%, Â&#x160;§@oĂ&#x2019;^(Ă&#x2019;Â&#x201C;O" Â&#x2DC;Â&#x2021;;.X Server Â&#x2DC;Â&#x201E;Ă&#x2018;|ÂąTimes, Helvetica, Courier, iN§Â&#x152;´8 , 10 , 12, 14, 18 , 24 . Â&#x152;¹´\o§N"Â&#x152;¹Œ^xlsfonts Ă&#x161;xfontsel Unix ¡-5wÂŤiN" Windows Ă&#x161;Macintosh Â?|ÂąÂ&#x152;Ă&#x153;ŠÚ iN§ŒÂ&#x201A;ÂŹrڍLÂ&#x2C6;Â?ÂŞÂ&#x20AC;Ă&#x2C6;¤Windows e½Macintosh Ă&#x153;¡iN"

§4.5.3 ŠiÂ&#x201A;ÂŞz Â&#x2DC;Â&#x201E;5`§Label Ă&#x161;Button Ă&#x2DC;=|¹ß1Ši§Â&#x201E;|¹þ1Ši"Ăľ1ŠiĂ&#x2019;´ ^"\n" ŠĂľÂ&#x2021;Ăź1Ši"%@Â&#x153;še§Ši´Ă&#x2DC;ÂĽĂŠĂ §Â&#x152;ÂąUCjustify option Â?LEFT ½ÜRIGHT LÂŤÂ&#x2020;½ÜmĂŠĂ " Â&#x201E;Â&#x152;ÂąÂ&#x2DC;wraplength option 5Â?½ Â&#x152;Ă?§ŠiĂ?XJÂ&#x2021;L ĂšÂ&#x2021; Â&#x152;Ă? Ă&#x2019;gĂ&#x201E;Â&#x2020;1"

§4.5.4 >Âľ ÂŚ+k Widget>Âľ3%@Â&#x153;še´wĂ&#x2DC;§´¤kWidget Ă&#x2018;kÂ&#x2DC;Â&#x2021;> Âľ">ÂľÂ?)3D Relief( 2H) JĂ&#x161;Focus Highlight( :pw)ÂŤÂ?" relief option ^ 5 L ÂŤ X Ă&#x203A; Âą Â&#x203A; Â&#x2DC; Â&#x2021;Widget  > Âľ " Â&#x152; Âą ´SUNKEN RAISED GROOVE RIDGE Ă&#x161;FLAT borderwidth ½ Ăśbd option L ÂŤwidget  > Âľ  Â&#x152;  § Â&#x2DC; Â&#x201E;´2 ½Ü1 §Â&#x152; Ă&#x2019;Ă&#x2DC;Ă?w " Focus Highlight Region ( :p ÂŤ)Â?´Â&#x2DC;ÂŤ>¾§´3>ÂľÂ&#x192; ,Â&#x2DC;Â&#x2021;>Âľ" 3widget Ă&#x2018;\ :Â&#x17E;ÿ§Â?Ă&#x2019;´widget Â&#x152;ÂąĂ&#x2030;^rÂ&#x2026;Ă&#x2018;\ÂŻÂ&#x2021;Â&#x17E;ÿ§¹x ĂšÂ&#x2021;Focus Highlight Region §Â?Ă&#x2019;´3>Âľ ÂĄ2xÂ&#x2DC;Â&#x2021;>¾§LÂŤĂšÂ&#x2021;widget 

:§Â&#x152;ÂąĂ&#x2030;Â&#x2026;Ă&#x2018;\" highlightcolor option LÂŤwidget  :Â&#x17E;ÿ§Focus Highlight Region Ă´Ă&#x161;§ Â&#x2DC;Â&#x201E;´çĂ&#x161;"highlightbackground option LÂŤwidget vk :Â&#x17E;ÿ§Focus Highlight Region Ă´Ă&#x161;§Â&#x2DC;Â&#x201E;Ă&#x161;widget Â&#x2DC;ÂľĂ&#x161;"highlightthickness LÂŤFocus Highlight Region °Ă?"Â&#x2DC;Â&#x201E;´1 ½Ü2 §Â&#x152; Ă&#x2019;Ă&#x2DC;Ă?w " ĂšpkÂ&#x2DC;Â&#x2021;~f§^5`²>ÂľĂ&#x161;Focus Highlight Region ^{" # border1.py annCharles@tom.com

1182Â?,208Â?

Python Ă&#x2020;S)P


§4.5 Widget ÂŞ from Tkinter import * bd = range(1,9,3) t = [ "border = " + str(k) for k in bd ] relief= [ RAISED, SUNKEN,GROOVE ,RIDGE,FLAT] for i in range(len(bd)): for j in range(len(relief)) : Button(text=t[i]+" " + relief[j], relief=relief[j], highlightcolor = â&#x20AC;&#x2122;blueâ&#x20AC;&#x2122;, highlightbackground = â&#x20AC;&#x2122;whiteâ&#x20AC;&#x2122;, highlightthickness = bd[i], bd=bd[i]).grid( row=j, column=i, padx=2, sticky=W) mainloop() $1(JXĂŁ4-4"

ĂŁ 4-4: border1.py $1(J annCharles@tom.com

1183Â?,208Â?

Python Ă&#x2020;S)P


o Tkinter ?§ highlightcolor Ă&#x161;highlightbackground ÂżÂ&#x2030;¤Ă&#x2DC;´AOĂ?wĂ´Ă&#x161;§4Ă&#x2013;Ăś5¿Œ Â&#x201A;Cz"

§4.5.5 Ă I cursor option Â&#x152;ÂąÂ?½Â&#x2DC;Â&#x2021;Ă I/G§Ă IÂŁĂ&#x201E;ĂšÂ&#x2021;widget ĂžÂ&#x17E;ÿ§wÂŤĂš Â&#x2021;Ă I/G"XJĂ&#x2DC;Â?½ÚÂ&#x2021;option §@oĂ IÂŁĂ&#x201E;widget ĂžÂ&#x17E;ÿ§wÂŤĂ&#x161;ÂŚ master widget cursor option ¤Â?½Ă I/G" Â&#x201D;Text Ă&#x161;Entry Ăšwidget §%@UC Ă I/G§LÂŤIÂ&#x2021;Ă&#x2018;\Ši" eÂĄĂšÂ&#x2021;~fߍ cursor option J" #!/usr/bin/env python cursors =["arrow", "based_arrow_down", "based_arrow_up", "boat", "bogosity", "bottom_left_corner", "bottom_right_corner", "bottom_side", "bottom_tee", "box_spiral", "center_ptr", "circle", "clock", "coffee_mug", "cross", "cross_reverse", "crosshair", "diamond_cross", "dot", "dotbox", "double_arrow", "draft_large", "draft_small", "draped_box", "exchange", "fleur", "gobbler", "gumby", "hand1", "hand2", "heart", "icon", "iron_cross", "left_ptr", "left_side", "left_tee", "leftbutton", "ll_angle", "lr_angle", "man", "middlebutton", "mouse", "pencil", "pirate", "plus", "question_arrow", "right_ptr", "right_side", "right_tee", "rightbutton", "rtl_logo", "sailboat", "sb_down_arrow", "sb_h_double_arrow", "sb_left_arrow", "sb_right_arrow", "sb_up_arrow", "sb_v_double_arrow", "shuttle", "sizing", "spider", "spraycan", "star", "target", "tcross", "top_left_arrow", "top_left_corner", "top_right_corner", "top_side", "top_tee", "trek", "ul_angle", "umbrella", "ur_angle", "watch", "xterm"] from Tkinter import * root = Tk() col=0; row = 0 for i in cursors: b=Button(text=i) b.grid( column=col,row=row, sticky=E+S+W+N) b.bind("<Motion>",lambda e,cur=i:root.config(cursor=cur)) col = col + 1 if col == 4 : row = row + 1 ; col = 0 annCharles@tom.com

1184Â?,208Â?

Python Ă&#x2020;S)P


§4.5 Widget ª mainloop() $1(JXã4-5"

ĂŁ 4-5: cursor1.py $1(J

Ă IÂŁĂ&#x201E; zÂ&#x2DC;Â&#x2021;Ă&#x2DC;Ă&#x201C;UĂ&#x153;Þ§àI/GĂ&#x2019;ÂŹC¤Ă&#x2DC;Ă&#x201C;/G" annCharles@tom.com

1185Â?,208Â?

Python Ă&#x2020;S)P


o Tkinter ?§

§4.6 ÂŻÂ&#x2021;Ă&#x161;ÂŻÂ&#x2021;Â?½ Â&#x;o´¯Â&#x2021;§^rÂ&#x152;UÂŁĂ&#x201E;Ă I§½ÜU Â&#x2DC;Â&#x2021;Â&#x2026;§Ú Ă&#x2018;´¯Â&#x2021;§¯Â&#x2021;Â&#x201E;Â?)WM Â&#x2021;ÂŚwidget ­xgCÂŻÂ&#x2021;"ĂŠĂľwidget Ă&#x2018;Â&#x152;ÂąĂ&#x2030;ÂŻÂ&#x2021;§¿Â&#x2026;N^Â&#x192;A?nŸê"ò ÂŻÂ&#x2021;Ă&#x161;´¯Â&#x2021;?nŸêÊXÂ&#x2DC;ĂĽÂ?{Ă&#x2019;´N^ w.bind(event,handler) w ´Â&#x2DC;Â&#x2021;widget, event ´Â&#x2DC;Â&#x2021;iĂ&#x17D;G§^uLĂŁÂŻÂ&#x2021;§handler ´Â&#x2DC;Â&#x2021;callable ĂŠ Â&#x2013;§^u?nÂŻÂ&#x2021;§Â?Ă&#x2019;´`§3ÂŻÂ&#x2021;u)Â&#x17E;ÿ§N^ĂšÂ&#x2021;ĂŠÂ&#x2013;§Ă&#x201C;Â&#x17E;ÂŹD4Â&#x2DC;Â&#x2021;ĂŤ ê§^uÂŁĂŁÂŻÂ&#x2021;"

§4.6.1 Â&#x2DC;Â&#x2021;{Ăź~f # File: bind1.py from Tkinter import * root = Tk() def callback(event): print "clicked at", event.x, event.y def test(e): D = vars(e); for k in D: print "%-10s:%s"%(k,D[k]) frame = Frame(root, width=100, height=100) frame.bind("<Button-1>", callback) root.bind("<Control-Alt-Key-colon>",test); frame.pack(expand=1,fill=BOTH) frame.focus_set() root.mainloop() ĂšÂ&#x2021;§SrĂźĂ&#x201A;Ă IÂ&#x2020;Â&#x2026;ÂŻÂ&#x2021;Ă&#x161;callback ĂšÂ&#x2021;ŸêÂ&#x201D;½3Â&#x2DC;ü§Â&#x201D;½ÂżgĂ&#x2019;´` )ĂšÂ&#x2021;,Â&#x2021;ÂŻÂ&#x2021;Â&#x17E;ÿ§Ă&#x2019;N^Â&#x192;A?nŸê" XJ,Â&#x2021;ÂŻÂ&#x2021;u) §Ă&#x201C;Â&#x17E;Â&#x2030;1 Â&#x192;A?nŸê§¡Â&#x201A;ÂĄÂ?Ă&#x201C;Âź ĂšÂ&#x2021;ÂŻÂ&#x2021;" $1ĂšÂ&#x2021;§S§XJ3Frame ÞßĂ&#x201A;Ă I§Ă&#x2019;ÂŹ3Â&#x203A;Â&#x203A;ĂžÂ&#x2039;<Ă IÂ&#x2039;I"XJĂ&#x201C; Â&#x17E;UeControl §Alt §Ă&#x161;kĂ&#x2019;§Ă&#x2019;ÂŹÂ&#x2039;<ÂŻÂ&#x2021;¤k&E" ÂŁĂŁÂŻÂ&#x2021;Â?ÂŞ ĂžÂ&#x2DC;Â&#x2021;~f¼§â&#x20AC;?ÂĄButton-1Âżâ&#x20AC;? ÂŁĂŁĂ IĂźĂ&#x201A;Â&#x2020;Â&#x2026;ÂŻÂ&#x2021;§£ã¯Â&#x2021;Â&#x201A;ÂŞXe: <modifier-modifier-type-detail> annCharles@tom.com

1186Â?,208Â?

Python Ă&#x2020;S)P


§4.6 ÂŻÂ&#x2021;Ă&#x161;ÂŻÂ&#x2021;Â?½ 0 Ă IÂ&#x2026;½Ă&#x201A;3X windows ÂĽÂ&#x2DC;k5 Â&#x2021;Ă IÂ&#x2026;½Ă&#x201A;§Â&#x2DC;Â&#x201E;´ 1 3 5

Â&#x2020;Â&#x2026; mÂ&#x2026; EÂśeE

2 4

ÂĽÂ&#x2026; EœÞE

Â&#x2DC;Â&#x201E;Â?^1 , 2 , 3 nÂ&#x2021;Â&#x2026;" ´Ă&#x2DC;´Â&#x2DC;¤Ă&#x2DC;C§Â&#x152;Âą^xmodmap ¡-UC" xmodmap -pp Â&#x152;ÂąwcĂ IUÂ&#x2026;½Ă&#x201A;" 3wu)Â&#x;oÂŻÂ&#x2021;Â&#x17E;ÿ§¹eóä´Êk^" xmodmap xev

wĂ&#x161;?UX Â&#x2026;N'XĂ&#x161;Ă IN'X" ^5wÂŻÂ&#x2021;"

modifier LÂŤu)Ă I½ÜÂ&#x2026;ÂŻÂ&#x2021;Â&#x17E;ÿ§Ă&#x201C;Â&#x17E;Ue Ă&#x2122;ÂŚÂ&#x2026;§Xcontrol §alt §win(super) Â&#x2026;§½ÜÂ&#x2DC;Â&#x2021;ÂŻÂ&#x2021;3ĂĄÂ&#x17E;mS­EĂľg" modifier Â&#x152;¹´ Control Shift Lock Button1, B1 Button2, B2 Button3, B3 Button4, B4 Button5, B5 Mod1, M1

Mod2, M2 Mod3, M3 Mod4, M4 Mod5, M5 Meta, M Alt Double Triple Quadruple

B1 LÂŤu)Â&#x2026;ÂŻÂ&#x2021;Â&#x17E;ÿ§à IÂ&#x2020;Â&#x2026;´?uUeG" Meta Ă&#x161;Alt Ă&#x2018;´Â&#x152;ÂąĂ?Lxmodmap UCN'X"äN´=Â&#x2DC;Â&#x2021;Â&#x2026;Ă&#x161;X XĂ&#x161;Â&#x2DC; k'X" Â&#x152;ÂąÂ?½þÂ&#x2021;modifier §^~Ă&#x2019;Š"X <Control-Alt-Key-colon> Ă&#x2122;ÂĽControl §Alt ´modifier §Key ´type §colon ´detail §Â&#x2021;ÂŻÂ&#x2021;ÂŁĂŁLÂŤĂ&#x201C;Â&#x17E; UeControl Alt Ă&#x161;kĂ&#x2019;§Â?Ă&#x2019;´`Ă&#x201C;Â&#x17E;UeControl Alt Shift Ă&#x161;ŠĂ&#x2019;§Ă?Â?Ă&#x201C;Â&#x17E;UeShift Ă&#x161;ŠĂ&#x2019;§LÂŤkĂ&#x2019;" Double ^uÂŁĂŁĂ IVĂ&#x201A;ÂŻÂ&#x2021;" type ´  ­ Â&#x2021;  § § ½ Ă&#x201A; ¡ Â&#x201A; Â&#x201D; ½ = Â&#x2DC; ÂŤ ÂŻ Â&#x2021; " Â&#x2DC; Â&#x201E; ´ButtonPress §ButtonRelease ½Ü´KeyPress §KeyRelease §Â?Â&#x152;¹´Ă&#x2122;ÂŚÂ&#x160;§Â&#x152;ÂąĂ?L annCharles@tom.com

1187Â?,208Â?

Python Ă&#x2020;S)P


o Tkinter ?§ man -S n bind w¤kÂŻÂ&#x2021;a." type ´ButtonPress Ă&#x161;Button Release Â&#x17E;ÿ§detail Â&#x152;¹´1, 2, 3, 4, 5 ^uLÂŤĂ IÂ&#x2026;§XJĂ&#x2DC;Â?½detail §LÂŤU?Ă&#x203A;Â&#x2026;" 5¿àIUÂ&#x2026;Â&#x160;Â?modifier Ă&#x161;type ÂŤO§Â?Ă&#x2019;´<Button1> Ă&#x161;<Button-1> ÂŤO" cĂśLÂŤ,ÂŤÂŻÂ&#x2021;u)Â&#x17E;ÿ§àI,Â&#x2021;UÂ&#x2026;?3UeG" ĂśLÂŤu) Ă IU Â&#x2026;ÂŻÂ&#x2021;" type ´Motion  Â&#x17E; Ăż § L ÂŤ Ă  I ÂŁ Ă&#x201E; ÂŻ Â&#x2021; " Â&#x2DC; Â&#x201E; Â? ½B1 modifier" X<B1-Motion> LÂŤĂ IÂ&#x2020;Â&#x2026;UeÂżÂ&#x2026;ÂŁĂ&#x201E;Ă I"XJĂ&#x2DC;Â?½modifier §@oL¤k Ă IÂŁĂ&#x201E;ÂŻÂ&#x2021;" XJtype ´KeyPress ½ÜKeyRelease §@odetail ^5Â?½.´=Â&#x2DC;Â&#x2021;Â&#x2026;UÂ&#x2026;" äNÂ&#x160;Â&#x152;Âąwkeysyms Â?Ă?" man keysyms keysyms ´Â&#x2DC;Â&#x2021;Â&#x152;Â&#x2039;<ASCII iĂ&#x17D;§½ÜÂ&#x2DC;Â&#x2021;Ă&#x2DC;Â&#x152;Â&#x2039;<ASCII iĂ&#x17D;£ã§Â&#x201E; Â&#x152;¹´Â&#x161;ASCII iĂ&#x17D;ÂŁĂŁ" ĂźÂ&#x2021;k^ "<1> <2> <3> ŠOLÂŤĂ IÂ&#x2020;Â&#x2026;§¼Â&#x2026;§mÂ&#x2026;UÂ&#x2026;ÂŻÂ&#x2021;"<a> <b> <c> ... LÂŤUea, b, c iĂ&#x17D;ÂŻÂ&#x2021;" ÂŻÂ&#x2021;ÂŁĂŁĂ&#x17E;~§XL4.6-2Âľ

§4.6.2 ÂŻÂ&#x2021;?nŸê u)ÂŻÂ&#x2021;Â&#x17E;ÿ§N^ÂŻÂ&#x2021;?nŸê§D4Â&#x2DC;Â&#x2021;ĂŤĂŞevent §^uÂŁĂŁÂŻÂ&#x2021;u) Â&#x17E;Ăż&E"^eÂĄÂ&#x201C;èÂ&#x152;ÂąÂ&#x2039;<¤k&E" def test(event): D = vars(event); for k in D: print "%-10s:%s"%(k,D[k]) äNĂŤĂŞXeL4.6-3

§4.6.3 ÂŻÂ&#x2021;

g

Ă&#x201C;Â&#x2DC;Â&#x2021;ÂŻÂ&#x2021;Â&#x152;ÂąkĂľÂ&#x2021;ÂŻÂ&#x2021;?nŸê§Ú ?nŸêåuĂ&#x2DC;Ă&#x201C; ÂąkĂľÂ&#x2021;ÂŻÂ&#x2021;?nŸê?nĂ&#x201C;Â&#x2DC;Â&#x2021;ÂŻÂ&#x2021;" Â&#x152;Âą3oÂ&#x2021;Ă&#x2DC;Ă&#x201C;

g"zÂ&#x2DC;Â&#x2021;

gÂ&#x201E;Â&#x152;

gÂĽÂ&#x201D;½¯Â&#x2021;"

â&#x20AC;˘ widget instance ? Â?½,Â&#x2DC;Â&#x2021;widget instance ÂŻÂ&#x2021;Â&#x201D;½"Â?k3ÂŻÂ&#x2021;u)3,Â&#x2DC;Â&#x2021;Â?½widget Â&#x17E; ÿ§âĂ&#x201C;Ÿ¯Â&#x2021;"Â&#x201D;½Â?{´w.bind(...) §w ´Â&#x2DC;Â&#x2021;widget instance " annCharles@tom.com

1188Â?,208Â?

Python Ă&#x2020;S)P


§4.6 ÂŻÂ&#x2021;Ă&#x161;ÂŻÂ&#x2021;Â?½

<Button-1> ½<1> <B1-Motion> <ButtonRelease-1> <Double-Button-1> <Enter> <Leave> <Return>

<Key> a <Shift-Up> <Configure>

UeĂ IÂ&#x2020;Â&#x2026; UeĂ IÂ&#x2020;Â&#x2026;Ă&#x201C;Â&#x17E;ÂŁĂ&#x201E;Ă I" ÂşÂ&#x2DC;Ă IÂ&#x2020;Â&#x2026;" 3ĂŠĂĄÂ&#x17E;mS(Â&#x161;~ÂŻÂ&#x201E;)§àIÂŁĂ&#x201E;Â?3ĂŠ Â&#x2030;Â&#x152;S(AvkÂŁĂ&#x201E;)§ÍYUeĂźgĂ IÂ&#x2020;Â&#x2026;" Ă IÂŁĂ&#x201E; Widget Â&#x2030;Â&#x152;Â&#x192;S"5ÂżĂ&#x2DC;´Ue

Â&#x2026;ÂŁÂ?Â&#x2026;§Enter LÂŤÂŻÂ&#x2021;type " Ă IlmWidget Â&#x2030;Â&#x152;Â&#x192;S" Ue Â&#x2026;ÂŁÂ?Â&#x2026;"´Â&#x2DC;Â&#x2021;{§L ÂŤ<KeyPress-Return> "3keysyms Â?Ă?ÂĽÂ&#x152;Âą A¤kÂ&#x161;Â&#x2039;<iĂ&#x17D;ÂŁĂŁ" Ue ?Ă&#x203A;Â&#x2026;" LÂŤUe Â&#x2026;â&#x20AC;&#x153;aâ&#x20AC;? Â&#x2026;" LÂŤU4Â&#x2026;Shift Â&#x2026;Ă&#x2DC;Â&#x2DC;Ă&#x201C;Â&#x17E;§Ue Â?Â&#x2022;Â&#x2026;ÂĽ ĂžÂ&#x2026;" LÂŤWidget Â&#x152;u)UCÂ&#x17E;ÿ¯Â&#x2021;" L 4.6-2: ÂŻÂ&#x2021;ÂŁĂŁĂ&#x17E;~

widget x,y x root, y root char keysym num wight, height type

)ÂŻÂ&#x2021;widget §¤kÂŻÂ&#x2021;event Ă&#x2018;ÂŹÂ&#x2DC;ĂšÂ&#x2021; ĂĄ5" LÂŤu)ÂŻÂ&#x2021;Â&#x17E;ÿ§à I3widget ÂĽÂ&#x192;Ê Â&#x2DC;" ß ´pixel LÂŤĂ I3Âś4ÂĽÂ&#x192;Ê Â&#x2DC;" a.´string §LÂŤĂ&#x161;Â&#x2026;k'ÂŻÂ&#x2021;¼§äNUe ´=Â&#x2DC;Â&#x2021;iĂ&#x17D;è" 3Ă&#x161;Â&#x2026;k'ÂŻÂ&#x2021;¼§LÂŤUÂ&#x2026;ŠiÂŁĂŁ" 3Ă&#x161;Ă Ik'ÂŻÂ&#x2021;¼§LÂŤĂ IUÂ&#x2026;" LÂŤwidget #Â&#x152;"Â?3configure ÂŻÂ&#x2021;ÂĽk" LÂŤÂŻÂ&#x2021;a." L 4.6-3: ÂŁĂŁÂŻÂ&#x2021;ĂŤĂŞ

annCharles@tom.com

1189Â?,208Â?

Python Ă&#x2020;S)P


o Tkinter ?§ â&#x20AC;˘ IÂ?? widget ¤ ĂĄ Toplevel ĂŠ Â&#x2013; ½ Ăśroot ĂŠ Â&#x2013; § ½ Ăś ` I Â? ? § Â? Â&#x201D; ½ Â? { ´root.bind(...) ½Ütop.bind(...) root Ă&#x161;top ŠOLÂŤToplevel ĂŠÂ&#x2013;Ă&#x161;root ĂŠ Â&#x2013;" â&#x20AC;˘ widget class ? ÂŚ^bind_class §L¤kÂ?½class instance Ă&#x2018;ÂŹkÂ&#x2DC;Â&#x2021;ÂŻÂ&#x2021;Â&#x201D;½" â&#x20AC;˘ A^§S? ?Ă&#x203A;/Â?u)ÂŻÂ&#x2021;§Ă&#x2018;ÂŹĂ&#x201C;Âź"ÂŚ^bind_all " ~XÂŚ^bind_all Â&#x201D;½F1 Â&#x2026;§ÚĂ&#x192;Ă&#x2DC;3?Ă&#x203A;/Â?§Â?Â&#x2021;U F1 Â&#x2026;Ă&#x2019;ÂŹÂ&#x2030;1Â?Ă?§ S" ´XJĂ&#x201C;Â&#x2DC;Â&#x2021;ÂŻÂ&#x2021;3Ă&#x2DC;Ă&#x201C; gĂžÂ&#x201D;ºþgÂ&#x17E;ÿ§TNoÂ?Q? ½Ü`Â&#x2DC;Â&#x2021;ÂŻÂ&#x2021;­ UÂ&#x201D;½Â&#x17E;ÿ§TNoÂ?ÂşÂ&#x;o´­UÂ&#x201D;½QÂş~X§¡Ă&#x201C;Â&#x17E;Â&#x201D;½ <Key> Ă&#x161;<Return> ÂŻÂ&#x2021;§Â&#x2DC;Â&#x2021;LÂŤUe?ÂżÂ&#x2026;§Â&#x2DC;Â&#x2021;LÂŤUeÂŁÂ?Â&#x2026;ÂŻÂ&#x2021;§<Return> ÂŻÂ&#x2021;Ă&#x201C;Â&#x17E;Â?´Â&#x2DC; Â&#x2021;<Key> ÂŻÂ&#x2021;§ÚĂ&#x2019;´­UÂ&#x201D;½" Ă&#x201E;k§Â&#x2DC;Â&#x2021;ÂŻÂ&#x2021;u)Â&#x17E;ÿ§Tkinter 3zÂ&#x2DC;Â&#x2021; gÞ§Ă?ĂŠÂ&#x2DC;Â&#x2021; Â&#x192;CÂŻÂ&#x2021;Â&#x201D; ½"~X§XJUe ÂŁÂ?Â&#x2026;§<Return> ÂŻÂ&#x2021;'<Key> ÂŻÂ&#x2021;Â?C"<Return> ÂŻÂ&#x2021;ÂŹĂ&#x201C; ٤<Key> ÂŻÂ&#x2021;KĂ&#x2DC;ÂŹĂ&#x201C;Âź" Â?Ă&#x2019;´`§­UÂŻÂ&#x2021;Â&#x192;ß½§ CÂŻÂ&#x2021;Ă&#x201C;Âź" ^aqĂŞĂ&#x2020;Â&#x160;ó£ãĂ&#x2019;´§zÂ&#x2DC;Â&#x2021;ÂŻÂ&#x2021;ÂŁĂŁĂ&#x2018;Â&#x2DC;Â&#x2021;ÂŻÂ&#x2021;8Ă&#x153;§8Ă&#x153;ÂĽÂ&#x192;´Â&#x2DC; Â&#x2021;ÂŻÂ&#x2021;§XJÂ&#x2DC;Â&#x2021;8Ă&#x153;A ´,Â&#x2DC;Â&#x2021;8Ă&#x153;B f8§@o`ĂšÂ&#x2021;A 'B "ÂŻÂ&#x2021;u)Â&#x17E; ÿ§@oĂ&#x2019;3zÂ&#x2DC;Â&#x2021; gĂžĂ?ĂŠÂ?šTÂŻÂ&#x2021; 8Ă&#x153;§, 2zÂ&#x2DC;Â&#x2021; gĂžĂ&#x201C;ÂźTÂŻÂ&#x2021;" XJ3widget instance gÂ&#x201D;½ <key> ÂŻÂ&#x2021;§3toplevel ĂžÂ&#x201D;½ <Return> ÂŻÂ&#x2021;§ @oUeÂŁÂ?Â&#x2026;Â&#x17E;ÿ§ÚÂ&#x2021;ÂŻÂ&#x2021;3ĂźÂ&#x2021; gĂžĂ&#x2018;ÂŹĂ&#x201C;Âź" Ú´Ă?Â?ÚßÂ&#x2021;ÂŻÂ&#x2021;Ă&#x2DC;´­UÂŻÂ&#x2021;§ ´3Ă&#x2DC;Ă&#x201C; gÞ¯Â&#x2021;§­UÂŻÂ&#x2021;´½Ă&#x201A;3Ă&#x201C;Â&#x2DC; gĂžVg§Â?Ă&#x2019;´`§­UÂŻÂ&#x2021;Ă&#x2018;´3Ă&#x201C;Â&#x2DC; gĂž" Tkinter Ă&#x201E;k3widget instance  gĂžĂ&#x201C;Ÿ¯Â&#x2021;§Â&#x2030;1ÂŻÂ&#x2021;?nŸê§, Â?g 3widget class  gÞ§Toplevel  gÞ§A^§S?Þ§ŠOĂ&#x201C;Ÿ¯Â&#x2021;"ĂšÂ&#x2021;Ă&#x201C;Ÿ¯ Â&#x2021;^SÊ­Â&#x2021;" Â?Ă&#x2019;´`§Ă&#x2DC;Ă&#x201C;

gÞ¯Â&#x2021;U^SĂ&#x201C;Âź"

§Sbind level.py ĂŠĂ?`² ĂšÂ&#x2DC;:" # File: bind_level.py from Tkinter import * root = Tk() def callback(event): annCharles@tom.com

1190Â?,208Â?

Python Ă&#x2020;S)P


§4.6 ÂŻÂ&#x2021;Ă&#x161;ÂŻÂ&#x2021;Â?½ print "clicked at", event.x, event.y def test(e): print "you press: " + e.keysym return def application_level_bind(e): print "application level binding" test(e) def class_level_bind(e): print "class level bind " test(e) def toplevel_bind(e): print "top level bind" test(e) def widget_level_bind(e): print "widget instance level bind" test(e) def myprint(a): print a frame = Frame(root, width=100, height=100) root.bind("<Key>", toplevel_bind) root.bind_class("Frame","<Key>",class_level_bind) root.bind_all("<Key>",application_level_bind) frame.bind("<Key>", widget_level_bind) frame.bind("<Return>", lambda e: myprint("RETURN PRESSED") ) frame.pack(expand=1,fill=BOTH) frame.focus_set() root.mainloop()

§4.6.4 Ă&#x201C;Â&#x2DC;Â&#x2021;ÂŻÂ&#x2021;ĂľÂ&#x2021;?nŸê Ă&#x201C;Â&#x2DC;Â&#x2021;ÂŻÂ&#x2021;Â&#x152;ÂąkĂźÂ&#x2021;¹ÞÂŻÂ&#x2021;?nŸê"bind(e,func) Ÿê%@Ă&#x201E;Â&#x160;´^Â?½ ÂŻÂ&#x2021;?nŸêfunc Â&#x201C;O¤kkÂŻÂ&#x2021;?nŸê"´XJÂ?½1nÂ&#x2021;ĂŤĂŞÂ?â&#x20AC;&#x153;addâ&#x20AC;? ~X: bind(e,func,"add") Ă&#x2019;Â&#x152;Âą35ÂŻÂ&#x2021;?nŸê§Â?Ă&#x2019;´3Â&#x2DC;Â&#x2021;ÂŻÂ&#x2021;?nŸêó O\Â&#x2DC;Â&#x2021;?nŸê" Â&#x2DC;Â&#x2021;ÂŻÂ&#x2021;u)Â&#x17E;ÿ§Ă&#x2019;ÂŹÂ?dÂ&#x2030;1ÂŻÂ&#x2021;?nŸêóÞzÂ&#x2DC;Â&#x2021;ÂŻÂ&#x2021;?nŸê"XJ=Â&#x2DC; Â&#x2021;ŸêÂ&#x2C6;ÂŁ Â&#x2DC;Â&#x2021;iĂ&#x17D;Gâ&#x20AC;&#x153;breakâ&#x20AC;? @oĂ&#x2019;ÂŹĂ&#x160;Â&#x17D;Â&#x2030;1 ÂĄÂŻÂ&#x2021;?nŸê§Ă&#x201C;Â&#x17E;Â?Ă&#x160;Â&#x17D;N^ annCharles@tom.com

1191Â?,208Â?

Python Ă&#x2020;S)P


o Tkinter ?§ Ă&#x2122;ÂŚ gÂŻÂ&#x2021;?nŸê" ~fchange text bind.py `² ĂšÂ&#x2021;ÂŻK" # change_text_bind.py from Tkinter import * def ignore (e): return "break" def ignore2(e): print "you can only input one line" root = Tk() t = Text() t.bind("<Return>",ignore2) t.bind("<Return>",ignore,"add") t.pack(fill=BOTH,expand=1) root.mainloop() ĂšÂ&#x2021;~fÂ&#x17D;?UÂ&#x2DC;Â&#x2021;Text widget %@ÂŻÂ&#x2021;Â&#x201D;½§3%@Â&#x153;še§UeÂŁÂ?Â&#x2026;LÂŤ Ă&#x2018;\#Â&#x2DC;1§XJ==Â&#x201D;½ignore2 ´Ă&#x2DC;1§Œ+OÂ&#x201C; instance ?OĂžÂ&#x201D;½'X§ ´<Return> ÂŻÂ&#x2021;?n´class ?OĂž§¤¹Â&#x201E;Ă&#x2DC;vÂąUC%@ĂśÂ&#x160;§^rÂ&#x201E;´Â&#x152;ÂąĂ&#x2018; \#Â&#x2DC;1"¤¹O\ignore Â&#x201D;½§4ÂŚÂ&#x192;ä¯Â&#x2021;?nŸêUYÂ&#x2030;1§ÚâUÂ&#x2C6;8 ",§3ignore2 ÂĽÂ&#x2C6;ÂŁâ&#x20AC;&#x153;breakâ&#x20AC;? Â?´Â&#x152;Âą" XJÂŻÂ&#x2021;?nŸêó¼kÂ&#x2DC;Â&#x2021;ŸêÂ&#x2C6;ÂŁ â&#x20AC;&#x153;breakâ&#x20AC;? @o2O\?nŸê´vkÂżĂ&#x201A;" Â&#x201E;kÂ&#x2DC;ÂŤÂ?{Â&#x152;ÂąÂ&#x2030;§ root.bind_class("Text","<Return",ignore) ´ÚÂ&#x2030;kÂ&#x2DC;Â&#x2021;":§\§S¼¤kText widget Ă&#x2018;Ă&#x2DC;UĂ&#x2018;Ă&#x2018;\#Â&#x2DC;1 ")ĂťÂ? {Ă&#x2019;´§MĂŻÂ&#x2DC;Â&#x2021;#a§UÂŤText §, 3?U#aÂŻÂ&#x2021;Â&#x201D;½'X"

§4.6.5 Ă&#x161;WM Â&#x192;'ÂŻÂ&#x2021;Â&#x201D;½ u)Ă&#x161;WM Â&#x192;'ÂŻÂ&#x2021;Â&#x17E;ÿ§~X§S z(qĂŁIz)§ Â&#x152;z§'4§ ÂŁĂ&#x201E;" ~^ÂŻÂ&#x2021;Ă&#x2019;´WM_DELETE_WINDOW LÂŤ^rÂŚ^WM 5'4IÂ?ÂŻÂ&#x2021;" Â&#x2021;Â&#x201D;½ÚÂ&#x2DC;aÂŻÂ&#x2021;Â?{´ w.protocol("WM_DELETE_WINDOW",handler) w ´Â&#x2DC;Â&#x2021;widget ĂŠÂ&#x2013;§handle ´¯Â&#x2021;?nŸê§Ă&#x2DC;D4?Ă&#x203A;ĂŤĂŞ" weÂĄ~f: from Tkinter import * from tkMessageBox import askokcancel annCharles@tom.com

1192Â?,208Â?

Python Ă&#x2020;S)P


§4.7 ~^A^§SŒ^Widget

def handler(): if askokcancel("Quit","Do you really want to exit?"): root.destroy() root=Tk() root.protocol("WM_DELETE_WINDOW",handler) root.mainloop() Â&#x2DC;Â&#x201E;Â&#x153;še´Ă&#x2DC;^ĂšÂ&#x201D;½§Ă?Â?§zÂ&#x2DC;Â&#x2021;IÂ??nWM_DELETE_WINDOW ÂŻÂ&#x2021;%@ Ă&#x201E;Â&#x160;Ă&#x2019;´N^destroy Ÿê5'4gC" Ă&#x2122;ÂŚaqWM_DELETE_WINDOW ÂŻÂ&#x2021;Â&#x152;ÂąwICCCM(Inter-Client Communication Conventions Manual) Š §

§4.7 ~^A^§SÂŚ^Widget §4.7.1 Ă&#x201E;IÂ? ¡Â&#x201A;Ž²^L §root=Tk() Ă&#x2019;ÂŹMĂŻÂ&#x2DC;Â&#x2021;root window §ÚÂ&#x2021;IÂ?'4 §@oĂ&#x2019; '4¤kĂ&#x2122;§IÂ?§§SòĂ&#x2018;" MĂŻÂ&#x2DC;Â&#x2021;Toplevel ĂŠÂ&#x2013;§Ă&#x2019;Â&#x152;ÂąMĂŻĂ&#x2122;ÂŚIÂ?§Ú IÂ?'4§Ă&#x2DC;òĂ&#x2018;§S§Ă&#x2122;§ Â?ÂĄToplevel Ă&#x161;root window ´Â&#x203A;Šaq" Toplevel Ă&#x2DC;Â&#x201D;Ă&#x2122;ÂŚWidget §Ă&#x2DC;^pack ½Ügrid §ŒĂ&#x2019;Â&#x152;ÂąwÂŤĂ&#x2018;5§Ă?Â?§´Â&#x2DC;Â&#x2021; IÂ?§WM ÂŹwÂŤÂŚ" zÂ&#x2021;IÂ?%@IK´â&#x20AC;&#x153;Tkâ&#x20AC;? §UCIÂ?IK^ root.Title("My title") Â&#x2DC;Â&#x2021;IÂ?IKÂ?{´ print root.Title()

§4.7.2 èß ~fmenubar2.py Â&#x203A;Â&#x160;èß9Â&#x2DC;Â&#x2021;~f" # menubar2.py from Tkinter import * import sys root = Tk()

annCharles@tom.com

1193Â?,208Â?

Python Ă&#x2020;S)P


o Tkinter ?§ mainmenu=Menu(root) root["menu"]=mainmenu filemenu = Menu(mainmenu) mainmenu.add_cascade(label=â&#x20AC;&#x2122;fileâ&#x20AC;&#x2122;,menu=filemenu) m = [ "new","open","save"] for i in m : filemenu.add_command( label=i, command=lambda t = i: sys.stdout.write(t+"\n") ) filemenu.add_command(label="exit", command= root.quit) mainloop() $1(JXĂŁ4-6 5¿§¯Â&#x2021;?nŸêE|§

ĂŁ 4-6: menubar2.py $1(J

lambda : sys.stdout.write(i) ´Ă&#x2DC;1" Ă?Â?zÂ&#x2DC;Â&#x2021;èß?nŸêĂ&#x2018;´Â&#x2DC;§Ă&#x2018;´Â&#x2039;<i Â&#x160;§Â&#x;oÂ&#x17E;Ăż\UC i Â&#x160;§ Â&#x2039;<(JĂ&#x2019;ÂŹC" lambda t = i : sys.stdout.write(i) annCharles@tom.com

1194Â?,208Â?

Python Ă&#x2020;S)P


§4.7 ~^A^§SÂŚ^Widget KĂ&#x2DC;Ă&#x201C;§zÂ&#x2DC;Â&#x2021;èß?nŸê´Ă&#x2DC;Â&#x2DC;§ŒÂ&#x201A;%@ĂŤĂŞĂ&#x2DC;Ă&#x201C;§%@ĂŤĂŞDÂ&#x160;´3Âź ĂŞMĂŻÂ&#x17E;Ăż" Â&#x152;Âąwlambda MïŸêÂ?BÂ&#x192;?§Â&#x152;Âą^ڍÂ?{§Â?, ÂŻÂ&#x2021;?nŸêO\% @ĂŤĂŞ"ĂšÂ&#x2DC;Â&#x2021;ÂŻÂ&#x2021;?nŸêÂ&#x152;Âą?nĂľÂ&#x2021;widget)ÂŻÂ&#x2021;§~ŸêêÞ§Â&#x152;Âą{ zO§Â?BÂ&#x2018;o" U^Â?{ĂźÂ?Â&#x160;ĂŠ¤Ă&#x201C;ĂľU§Ú§Sâ´Ă?§S" Â&#x201E;kÂ&#x2DC;ÂŤÂ&#x2030;{§Œ^Menubutton ~fmenubar3.py Â&#x203A;Â&#x160;èß9Â&#x2DC;Â&#x2021;~f" # menubar3.py from Tkinter import * import sys root = Tk() # create a frame to contain the menu bar menuframe = Frame() # create a menu button filemenuButton = Menubutton(text="File") filemenuButton.pack(side=LEFT,anchor=N) # create the "file" menu filemenu = Menu(filemenuButton) # connect the filemenu with hte filemenuButton filemenuButton[â&#x20AC;&#x2122;menuâ&#x20AC;&#x2122;]=filemenu m = [ "new","open","save"] for i in m : filemenu.add_command(label=i, command= lambda t = i: sys.stdout.write(t+"\n") ) filemenu.add_command(label="exit", command= root.quit) menuframe.pack(side=TOP,fill=X,expand=1) mainloop() $1(JXĂŁ4-7 Ăź Â&#x2021; ~ f Â&#x201E; ´ k ÂŤ O  "Menubutton ´ Â&#x2DC; Â&#x2021; Ă&#x161;Button a q  Ă&#x20AC; Ă&#x153; §  ´ ÂŚ % @ command Ă&#x201E;Â&#x160;´Ă&#x2DC;Â&#x2DC;Â&#x2021;èß" ÂŚ^Menubutton kÂąeAÂ&#x2021;Ă&#x161;½: 1. ĂŻĂĄMenubutton. mb = Menubutton() annCharles@tom.com

1195Â?,208Â?

Python Ă&#x2020;S)P


o Tkinter ?§

ĂŁ 4-7: menubar3.py $1(J 2. 3ŒÞ¥wÂŤÂ&#x2DC;Â&#x2021;Ă?SN§JÂŤ^r" mb["text"]="press me" 3. MĂŻÂ&#x2DC;Â&#x2021;Menu §Œmaster widget ´mb m = Menu(mb) 4. rMĂŻMenu Ă&#x161;Menubutton ĂŠX3Â&#x2DC;ĂĽ" mb["menu"] = m 5. O\menu SN m.add_command(label="new", command=lambda : sys.stdout.write("Hello Menu\n") 6. wÂŤMenubutton mb.pack() XJÂ&#x2021;3menu ĂžO\Â&#x2DC;Â&#x2021;ŠÂ&#x201A;§^ m.add_separator() XJÂ&#x2021;3menu ĂžO\Â&#x2DC;Â&#x2021;fèߧ^ submenu = Menu(m) # 5Âż master widget Â&#x2DC;½Â&#x2021;´Ièß" m.add_cascade(menu=submenu,label="a submenu") annCharles@tom.com

1196Â?,208Â?

Python Ă&#x2020;S)P


§4.7 ~^A^§SŒ^Widget

§4.7.3 óä9 ĂŠĂľA^§SĂ&#x2018;kÂ&#x2DC;Â&#x2021;óä9"Ă&#x2122;¢Â&#x2DC;Â&#x2021;óä9Ă&#x2019;´Â&#x2DC;Â&#x2021;Frame §Ă&#x2122;ÂĽÂ?š ĂŠĂľ Button" Â&#x17E;w~ftoolbar.py " # toolbar1.py from Tkinter import * root = Tk() def callback(): print "called the callback!" x = ["error", "gray12", "gray25", "gray50", "gray75", "hourglass", "info", "question", "warning"] # create a toolbar toolbar = Frame(root) for i in x : b = Button(toolbar, text=i, bitmap=i, command=lambda t=i: sys.stdout.write("%s\n"%t) ) b.pack(side=LEFT, padx=2, pady=2,fill=BOTH,expand=1) toolbar.pack(side=TOP, fill=X) mainloop() $1(JXĂŁ4-8 zÂ&#x2DC;Â&#x2021;Button Ă&#x2018;Þ¥kÂ&#x2DC;Â&#x2021;ĂŁI§Â&#x2DC;Â&#x2DC;Â?ª´¾Â&#x201A;Â&#x2020;Â&#x2DC;§gĂ&#x201E;UCÂ&#x152;§UCÂ&#x152; Â&#x17E;Ăż3X Y Â?Â&#x2022;ĂžĂ&#x2018;Â&#x2039;XÂ&#x2DC;ĂĽUCButton Â&#x152;§ÞeÂ&#x2020;mĂ&#x2018;3Ă&#x2018;52 Â&#x2021;Â&#x201D;Â&#x192;Â&#x2DC; Y" toolbar Â&#x2DC;Â&#x2DC;Â?ª´: Â&#x201A;ĂžÂ&#x2DC;§3X Â?Â&#x2022;ĂžgĂ&#x201E;UCÂ&#x152;" Ă&#x2DC; ÂŚ^bitmap otption Â&#x2DC;Â&#x2DC;ĂŁIÂ&#x192; §Â&#x201E;Â&#x152;ÂąUCimage option 5wÂŤĂŁI§ÚIÂ&#x2021; ÂŚ^PhotoImage MĂŻÂ&#x2DC;Â&#x2021;ĂŁÂ&#x201D;"

§4.7.4 G9 Êþ§SeÂ?Ă&#x2018;kÂ&#x2DC;Â&#x2021;G9§Ă&#x2122;¢Â?´Â&#x2DC;Â&#x2021;Frame Ă&#x2122;¼škÂ&#x2DC;Â&#x2021;½ÜþÂ&#x2021;Label § annCharles@tom.com

1197Â?,208Â?

Python Ă&#x2020;S)P


o Tkinter ?§

ĂŁ 4-8: toolbar1.py $1(J

Â&#x152;ÂągCÂ&#x2DC;Â&#x2021;§S§Â?Ă&#x2DC;J" Â&#x17E;w~fstatusbar.py " # toolbar1.py from Tkinter import * root = Tk() def callback(): print "called the callback!" x = ["error", "gray12", "gray25", "gray50", "gray75", "hourglass", "info", "question", "warning"] # create a toolbar toolbar = Frame(root) for i in x : b = Button(toolbar, text=i, bitmap=i, command=lambda t=i: sys.stdout.write("%s\n"%t) ) annCharles@tom.com

1198Â?,208Â?

Python Ă&#x2020;S)P


§4.7 ~^A^§SŒ^Widget b.pack(side=LEFT, padx=2, pady=2,fill=BOTH,expand=1) toolbar.pack(side=TOP, fill=X) mainloop() Œ^tkSimpleStatus.py " # File: tkSimpleStatusBar.py from Tkinter import * class StatusBar(Frame): def __init__(self, master): Frame.__init__(self, master) self.label = Label(self, bd=1, relief=SUNKEN, anchor=W) self.label.pack(fill=X) def set(self, format): self.label.config(text=format) self.label.update_idletasks() def clear(self): self.label.config(text="") self.label.update_idletasks() $1(JXã4-9

ĂŁ 4-9: statusbar1.py $1(J ĂšÂ&#x2021;~fÂĽÂ?kÂ&#x2DC;Â&#x2021;wÂŤ9§ÊN´O\Â&#x2DC;Â&#x2021;wÂŤ9§Ă&#x192;Â&#x161;Ă&#x2019;´O\Â&#x2DC;Â&#x2021;Label "

§4.7.5 IOĂŠ{Âľ XJĂ&#x2019;´{ĂźĂ&#x2018;\&E§XÂ&#x2DC;Â&#x2021;ĂŞi§Â&#x2DC;Â&#x2021;iĂ&#x17D;G§£Â&#x2030;´Â&#x201E;´Ă&#x2DC;´§Â&#x2DC;Â&#x2021; annCharles@tom.com

1199Â?,208Â?

Python Ă&#x2020;S)P


o Tkinter ?§ ŠÂ&#x2021;œ¥§Â&#x2DC;Â&#x2021;iNœ¥§Â&#x2DC;Â&#x2021;Ă´Ă&#x161;§ky¤{ĂźIOĂ&#x2018;\Âľ"ĂŠĂ?^" {ĂźÂ&#x17E;EÂľ tkMessageBox ÂŹJø ÊþŸê§^5MĂŻÂ&#x2DC;Â&#x2021;{ĂźÂ&#x17E;EÂľ" ´Â&#x2021;5¿§Ă&#x2DC;UE^Â&#x17E;E¾§Windows e§SĂ&#x2019;²~Ă&#x2018;Â&#x2DC;Â&#x2021;Â&#x17E;E¾§¯¡Â&#x2021;Ă&#x2DC; Â&#x2021;§Â&#x2021;Ă&#x2DC;Â&#x2021;Ă˝òĂ&#x2018;§r^r¤ä§Â&#x2DC;Â&#x2021;Ă?Â?{´1Â&#x2DC;gĂ&#x2018;5ĂŠ{¾§ ^r AT%§Ă&#x201C;Â&#x17E;^rÂ&#x152;ÂąĂ&#x20AC;JÂą Ă&#x2DC;Â&#x2021;2Ă&#x2018;5ÚÊ{Âľ " Â&#x152;ÂąwÂ&#x2DC;etkMessageBox.py  §S§åh<§vÂ&#x17D;ĂšoĂĄ§SÂ&#x152;Âą¤Úo þ¯Â&#x153;§Œ+Â&#x152;þê¯Â&#x153;Ă&#x2018;´Tk Â&#x2030;" Â&#x152;Âą$1 python

/usr/lib/python2.2/lib-tk/tkMessageBox.py

wÂŚÿà §S" ĂšÂ&#x2021;ÂŹJø Â&#x2DC;eŸê: showinfo, showwarning, showerror, askquestion, askokcancel, askyesno, Ă&#x161; askretryignore. ÂŚÂ&#x201A;N^Â?{Ă&#x2018;Â&#x2DC;" tkMessageBox.function(title, message [, options]). title ´IK"message ´Â&#x2021;wÂŤÂ&#x2030;^r&E" option kÂąeĂ&#x20AC;J: default

icon message parent title type

Â&#x152;¹´ABORT, RETRY, IGNORE, OK, CANCEL, YES, ½ÜNO LÂŤ%@^Â&#x2021;e§=Â&#x2DC;Â&#x2021;UĂ&#x153; :" LÂŤÂŚ^Â&#x;oIOĂŁI"Â&#x152;¹´ERROR, INFO, QUESTION, WARNING Ă&#x161;1Â&#x2021;ĂŤĂŞmessage ´Â&#x2DC;Â&#x2021;Âżg" LÂŤĂŠ{Âľ(ĂĽÂ&#x192; §=Â&#x2DC;Â&#x2021;IÂ?C¤ cIÂ?" Ă&#x161;1Â&#x2DC;Â&#x2021;ĂŤĂŞtitle ´Â&#x2DC;Â&#x2021;Âżg" wÂŤ=Â&#x2DC;aUĂ&#x153;§Â&#x152;¹´ABORTRETRYIGNORE, OK, OKCANCEL, RETRYCANCEL, YESNO, YESNOCANCEL"l Â&#x201C;èÂ&#x152;Âąw§zÂ&#x2DC;Â&#x2021;Ÿê Ž²%@Ă? type §ÚĂ??´Jp§SÂ&#x152; Ă&#x2013;5"

annCharles@tom.com

1200Â?,208Â?

Python Ă&#x2020;S)P


§4.7 ~^A^§SÂŚ^Widget {ßêâĂ&#x2018;\

3tkSimpleDialg ¼§Jø Â&#x2DC;Â&#x2021;Ă&#x2018;\{ßêâ{ßÊ{Âľ"

tkSimpleDialog.askstring(title, prompt,[options])

Â&#x152;ÂąÂ&#x2C6;ÂŁÂ&#x2DC;Â&#x2021;iĂ&#x17D;G§XU Cancel UĂ&#x153;§@oÂ&#x2C6;ÂŁNone Ă&#x2122;ÂĽÂľ title prompt options initialvalue parent

LÂŤIÂ?IK" LÂŤJÂŤ^rĂ&#x2018;\&EŠi" Â&#x152;¹´¹eĂ&#x20AC;J" LÂŤĂ?ŠÂ&#x160;´Â&#x;o" LÂŤ^rĂ&#x2018;\. §wÂŤ=Â&#x2DC;Â&#x2021;IÂ?"

Â&#x201E;kaqtkSimpleDialog.askinteger Ă&#x161;tkSimpleDialog.askfloat ^{Ă&#x161;Þ¥Â&#x2DC;§ XJ^rU Cancel §@oÂ&#x2C6;ÂŁNone ÚßÂ&#x2021;ŸêÂ&#x201E;kĂźÂ&#x2021;option Â&#x152;ÂąĂ&#x20AC;J"minvalue Ă&#x161;maxvalue ŠOLÂŤÂ Â&#x152; Â&#x160;§^u Â&#x203A;^r3Â&#x2DC;½Â&#x2030;Â&#x152;SĂ&#x2018;\ĂŞÂ&#x160;" Â&#x2039;mŠÂ&#x2021;ĂŠ{Âľ

tkFileDialog ÂŹJø ĂźÂ&#x2021;Ÿê:

tkFileDialog.askopenfilename tkFileDialog.asksavefilename Â&#x152;ÂąÂ&#x2C6;ÂŁÂ&#x2DC;Â&#x2021;ŠÂ&#x2021;ĂŠÂ&#x2013;§XJ^rU Cancel @oÂ&#x2C6;ÂŁNone " ÂŚ^Â?{´:

tkFileDialog.askopenfilename(options) tkFileDialog.asksavefilename(options) Â&#x152;¹Œ^option k: annCharles@tom.com

1201Â?,208Â?

Python Ă&#x2020;S)P


o Tkinter ?§ œ¥ defaultextension

a. string

filetypes

list

initialdir initialfile parent title

string string widget string

ÂŁĂŁ XJ^rvkÂ&#x2030;Ă&#x2018;ŠÂ&#x2021;* Ă?Ϥ@oĂ&#x2019;gĂ&#x201E;\ÞÚÂ&#x2021; *Ă?ϴ" list ÂĽ  z Â&#x2DC; Â&#x2021;  Â&#x192; ´ Â&#x2DC; Â&#x2021;(label,pattern) tuple " c ÂĄ label ^ u J ÂŤ ^ r´Â&#x;oa.Š Â&#x2021;§pattern ^uÂ&#x161;ŠÂ&#x2021;Âś ÂĄ" Ă?Š8š" %@ŠÂ&#x2021;ϴ" Ă&#x201C;Ăž" IÂ?IK"

~X: openfile(filetypes=[("text file","*.txt")]) Â&#x2039;mÂ&#x2DC;Â&#x2021;ĂŠ{¾§JÂŤ^rÂ&#x2039;mŠŠÂ&#x2021;§Â?Ă&#x2019;´¹txt (Â&#x2014;ŠÂ&#x2021;" Ă&#x20AC;JĂ´Ă&#x161;ĂŠ{Âľ tkColorChooser ÂŹJø Â&#x2DC;Â&#x2021;askcolor Ÿê^uJÂŤ^rĂ&#x2018;\Â&#x2DC;Â&#x2021;Ă´Ă&#x161;Â&#x160;"ÂŚ^Â? {´: askcolor([color[,options]]) Â&#x152;^options Xe: color

parent title

LÂŤÂ&#x2DC;Â&#x2021;Ă´Ă&#x161;Â&#x160;§Â&#x152;¹´Â&#x2DC;Â&#x2021;iĂ&#x17D;G§Â&#x201E;Ă&#x152;Ă´Ă&#x161;½Ă&#x201A; Â&#x201A;ª§7L´â&#x20AC;&#x153;#rgbâ&#x20AC;? â&#x20AC;&#x153;#rrggbbâ&#x20AC;? â&#x20AC;&#x153;#rrrrggggbbbbâ&#x20AC;? Â&#x201A;ÂŞ"Â?Â&#x152;¹´Â&#x2DC;Â&#x2021;tuple Ă&#x2122;¼šknÂ&#x2021;Â&#x192;§Š OLÂŤRGB nÂ&#x2021;Ă&#x2DC;Ă&#x201C;ŠÞ"ĂšÂ&#x2021;Ă´Ă&#x161;Â&#x160;Ă&#x161;1Â&#x2DC;Â&#x2021; Íê´Â&#x2DC;Â&#x2021;Âżg§Â?² Ă?ŠôĂ&#x161;Â&#x160;" Ă&#x201C;Ăž" IÂ?IK"

Â&#x2C6;ÂŁÂ&#x160;´Â&#x2DC;Â&#x2021;tuple§Ă&#x2122;ÂĽkĂźÂ&#x2021;Â&#x192;§1Â&#x2DC;Â&#x2021;´^tuple LÂ&#x2C6;Ă´Ă&#x161;Â?ª§1Â&#x2021;´^ iĂ&#x17D;GLÂ&#x2C6;Ă´Ă&#x161;Â?ÂŞ" g½Ă&#x201A;ĂŠ{Âľ x ¹ÞÊ{ÂľĂ&#x2DC;ávÂ&#x2021;ÂŚÂ&#x17E;ÿ§Â&#x152;¹Œ^tkSimpleDialog ÂŹÂĽJøDialog a" Â&#x152;ÂąwtkSimpleDialog.py  Â&#x201C;è§Â?Ă&#x2DC;´AOE," annCharles@tom.com

1202Â?,208Â?

Python Ă&#x2020;S)P


§4.7 ~^A^§SÂŚ^Widget ÂŚ^Â?{ĂŠ{Ăź"Dialog aUÂŤ Toplevel §¤¹ŒÂ?´Â&#x2DC;Â&#x2021;IÂ?ĂŠÂ&#x2013;" weÂĄ~finputpassword.py #inputpassword.py from Tkinter import * from tkSimpleDialog import * class DlgInputPassword(Dialog): def body(self,master): Label(master,text="user name:").grid(row=0,column=0) Label(master,text="password :").grid(row=1,column=0) self.username = Entry(master) self.username.grid(row=0,column=1) self.password = Entry(master) self.password.grid(row=1,column=1) def apply(self): self.result = self.username.get() , self.password.get() def validate(self): return 0 root = Tk() d=DlgInputPassword(root) print d.result $1(JXĂŁ4-10

ĂŁ 4-10: inputpassword.py $1(J Ă&#x2122;¼­ body Ÿê§Ă&#x161;apply Ÿê"k ÚßÂ&#x2021;ŸêĂ&#x2019;Â&#x152;Âą¤Â&#x2DC;Â&#x201E;ĂľUĂśÂ&#x160;

"body Ÿê^5MĂŻĂŠ{¾¼zÂ&#x2DC;Â&#x2021;widget §´Ă&#x2DC;Â?šOK Ă&#x161;Cancel UĂ&#x153;" annCharles@tom.com

1203Â?,208Â?

Python Ă&#x2020;S)P


o Tkinter ?§ apply Ÿê^uÂ&#x2C6;ÂŁk^Â&#x160;§Â&#x2DC;Â&#x201E;Â&#x2DC;self.result ĂĄ5§^uÂ&#x2C6;ÂŁ&E" 3^rU OK UĂ&#x153;Â&#x17E;ÿ§Ă&#x2019;ÂŹN^apply ŸêÂ&#x2DC;self.result "XJU Cancel U Ă&#x153;§self.result Ă&#x2019;´None " Â&#x201E;kÂ&#x2DC;Â&#x2021;Ÿêvalidate()Â&#x152;¹­"vk?Ă&#x203A;ĂŤĂŞ"validate() ĂšÂ&#x2021;Ÿê^5ä^rĂ&#x2018; \&E´Ă&#x201E;ávÂ&#x2021;Τ^rU OK UĂ&#x153;Â&#x17E;ÿ§Ă&#x2019;ÂŹgĂ&#x201E;N^ĂšÂ&#x2021;Ÿê§XJĂšÂ&#x2021;Âź ĂŞÂ&#x2C6;ÂŁ1 §LÂŤ^rĂ&#x2018;\´ávĂ&#x153;6Â&#x2021;ÂŚ§Ă&#x2019;N^apply Â&#x2DC;self.result , Â&#x2C6;ÂŁ"XJĂš Â&#x2021;ŸêÂ&#x2C6;ÂŁ0§U OK Â?Ă&#x2DC;ĂĽÂ&#x160;^" Ă?Â&#x2030;^rÂ&#x2DC;Â&#x2021;J§wÂ&#x160;^rÂ?Â&#x;oĂ&#x2DC;U~ò Ă&#x2018;" Â&#x201E;kÂ&#x2DC;Â&#x2021;buttonbox ŸêÂ&#x152;¹­"Â?´vkĂľ{ĂŤĂŞ"ĂšÂ&#x2021;Ÿê%@Ă&#x201E;Â&#x160;´MĂŻ ĂźÂ&#x2021;UĂ&#x153;§Â&#x2DC;Â&#x2021;´OK Â&#x2DC;Â&#x2021;´Cancel "UĂšÂ&#x2021;ŸêÂ&#x152;ÂąMĂŻ^rgCÂ&#x17D;Â&#x2021;UĂ&#x153;/ª§ %@ĂźÂ&#x2021;UĂ&#x153;"Ă&#x201C;Â&#x17E;§rOK UĂ&#x153;?nŸêĂ&#x161;self.ok Â&#x201D;½§Cancel UĂ&#x153;?nŸê Ă&#x161;self.cancel Â&#x201D;½"self.ok Ă&#x161;self.cancel ´ßÂ&#x2021;Ž²Ă?%@Ÿê" wtkSimpleDialog.py ÂŹÂ?Ăľ&E"

annCharles@tom.com

1204Â?,208Â?

Python Ă&#x2020;S)P


1Ă&#x160;Ă&#x2122;

Python * Ă? §5.1 ^C?*Ă?ÂŹ ^C Â&#x160;Ăł?*Ă?´ÊÂ&#x152;Â&#x2DC;Â&#x2021;K8"kĂ&#x17E;Â&#x2021;~f" $ls #c8šÂ?kÂ&#x2DC;Â&#x2021; demo.c spammodule.c $cat spammodule.c #include <Python.h> /*7LÂ&#x2021;\\Ă&#x17E;ŠÂ&#x2021;*/ static PyObject * /*¤kPythonĂŠÂ&#x2013;Ă&#x2018;´ÚÂ&#x2021;a..*/ spam_system(PyObject * self, PyObject * args) { char *command; int sts; if (!PyArg_ParseTuple(args, "s", &command)) return NULL; sts = system(command); return Py_BuildValue("i", sts); } static PyMethodDef SpamMethods[] = { {"system", spam_system, METH_VARARGS, "Execute a shell command."}, {NULL, NULL, 0, NULL} /* LÂŤLÂ&#x201A;(ĂĽ */ }; void initspam(void) { annCharles@tom.com

1205Â?,208Â?

Python Ă&#x2020;S)P


Ă&#x160; Python*Ă? Py_InitModule("spam", SpamMethods); } ¡Â&#x201A;F"ĂŻĂĄÂ&#x2DC;Â&#x2021;module ÂśiÂ&#x160;spam§¡Â&#x152;ÂąĂ?Lspam.system(cmd) Â?ª§¤ Ă&#x161;os.systemaqĂłÂ&#x160;" Ă&#x201E; k Š Ă&#x203A; Â&#x2DC; e Ăš Â&#x2021; § S § Â&#x2DC;  k Ăź Â&#x2021; Âź ĂŞ §initspam(...) §spam_system(...) §Â&#x2DC;Â&#x2021;Ă&#x203A;CÞ§SpamMethords "initspam´ÂŹĂ?ŠzŸê§importÂ&#x17E;ÿN ^§§´Â?Â&#x2DC;Â&#x161;¡Ÿê"Âśi´init + module_name/ª§¡Â&#x201A;module  Â&#x2030;spam"ÂŚÂ&#x192;umain Ÿê"ÂŚĂ&#x152;Â&#x2021;?Ă&#x2013;´Ă?python )ºÏ§¡Â&#x201A;spam ÂĽkĂľ Â&#x2021;Ÿê"Py_InitModule Ă&#x2019;´ZĂšÂ&#x2021;ÂŻÂ&#x153;"1Â&#x2DC;Â&#x2021;Íê´"spam" §LÂŤmodule  ϴ"1Â&#x2021;Íê´SpamMethords ´Â&#x2DC;Â&#x2021;LÂ&#x201A;§Ă?python §¡Â&#x201A;spam kĂľÂ&#x2021;Âź ĂŞ"SpamMethors Â&#x2DC;½Â&#x2021;´Ă&#x203A;¡CÞ§a.´PyMethodDef" PyMethordDef ÂąÂ&#x2DC;LÂŤLÂ&#x201A;(ĂĽ"zÂ&#x2DC;1koÂ&#x2021;iĂŁÂľ â&#x20AC;˘ 1 Â&#x2DC; Â&#x2021; L ÂŤpython ÂĽ Âź ĂŞ  Âś i § Ăš p ´ system§ 3python ÂĽ Â&#x152; Âą Ă? Lspam.system 5N^ĂšÂ&#x2021;Ÿê" â&#x20AC;˘ 1Â&#x2021;iã´Â&#x2DC;Â&#x2021;ŸêÂ?§spam_system§ÚÂ&#x2021;Ÿê.Â&#x2DC;½Â&#x2021;´ static PyObject * spam_system(PyObject * self, PyObject * args); Â? Ă&#x161;METH_VARARGSÂ&#x192;ĂŠA" â&#x20AC;˘ 1nÂ&#x2021;iã´doc string§3python ÂĽÂ&#x152;ÂąĂ?Lspam.system.__doc__ " â&#x20AC;˘  Â&#x2DC; i ĂŁ ´ Â&#x2DC; Â&#x2021; á(macro) § L ÂŤ Âź ĂŞ a . " lCÂ&#x160; Ăł  * : 5 w §Python ÂĽ  Âź ĂŞ k Ăź ÂŤ § Â&#x2DC; ÂŤ ´ ~ ^  ^tuple 5 D 4 ĂŤ ĂŞ § Â&#x2DC; Â&#x201E; ´METH_VARARGSL§Â&#x2DC;´^dictionary 5D4ꐤÂ&#x2030; keyword parameter§ ^METH_VARARGS|METH_KEYWORDSLÂŤ"ÚßÂ&#x2021;Macro Ă&#x2019;ŠOĂŠAÚߍŸê"ߍ Â?ÂŞ3C Â&#x160;ó¼ÊAŸê.´Ă&#x2DC;Â&#x2DC;" w w ¡ Â&#x201A; Ă˝  Z š  Âź ĂŞspam_system§ ÂŚ  Â&#x2C6; ÂŁ Â&#x160; L ÂŤPython ÂĽ Âź ĂŞ  Â&#x2C6; ÂŁ Â&#x160; §â&#x20AC;&#x153;Â&#x2DC; Â&#x192; Ă&#x2018; ´ ĂŠ Â&#x2013;â&#x20AC;? Ăš ĂŠ { 3C Â&#x160; Ăł ÂĽ  L y / ÂŞ Ă&#x2019; ´PyObject* § Â&#x2DC; Â&#x192; Ă&#x2018; ´PyObject*"XJĂ&#x2018;Â&#x2020;§@o3C Â&#x160;ó¼kŸê§Â&#x152;Âą^5Ă&#x2018;Ă&#x2030;~§Â&#x2C6;ÂŁÂ&#x160;Ă&#x2019;´NULL " spam_systemĂŤĂŞkĂźÂ&#x2021;§wÂŚÂ&#x201A;a.´PyObject*Ă&#x2019;Â&#x2DC;:Â?Ă&#x2DC;Ă&#x203A;% j" â&#x20AC;˘ self Â&#x2DC;Â&#x201E;Ă&#x2DC;^§XJ´Ă&#x2DC;Ă&#x201C;Ÿê{§Œo´NULL§XJΫÂ&#x2DC;Â&#x2021;class methord {§self LÂŤclass instance" â&#x20AC;˘ argsLÂŤD?5Í꧴Â&#x2DC;Â&#x2021;tuple §5Âżtuple 3C SĂ&#x153;Â?´PyObject* annCharles@tom.com

1206Â?,208Â?

Python Ă&#x2020;S)P


§5.1 ^C?*Ă?ÂŹ PyArg_ParseTuple^5ĂŤĂŞ"Ă&#x2122;ÂĽargs ´D?5ĂŤĂŞ""s"LÂŤÂ&#x201A;ÂŞ=Â&#x2020;a .iĂ&#x17D;G§sLÂŤstring a.§Â&#x201E;kĂ&#x2122;§a." ÂĄĂŤĂŞĂ&#x2019;Â&#x2021;Ă&#x161;"s"¤Â?½a.Â&#x192;¡A" Ă&#x161;"s"Â&#x192;¡Aa.´char**§´Â&#x2DC;Â&#x2021;iĂ&#x17D;Â?Â?"Â?Ă&#x2019;´`§Ă&#x2DC;^¡Â&#x201A;gC5? S+nŸê§XJPythonÂĽXĂ&#x161;ŸêPyArg_ParseTuple~Â&#x2C6;£§@ocommandĂ&#x2019;Â? Â&#x2022;Â&#x2DC;Â&#x2021;kiĂ&#x17D;G"XJ´Â&#x201D;}§@oĂ&#x2019;Â&#x2C6;ÂŁNULL"PyArg_ParseTuple Â&#x201D;}Â&#x17E;ÿ§ ÂŚÂŹgĂ&#x201E;Ă&#x2018;Ă&#x2030;~§Ă&#x2DC;^¡Â&#x201A;gC3?Ă&#x2018;Ă&#x2030;~Â&#x201C;è"ĂšÂ?wĂ&#x2018;Ă&#x2030;~Ă&#x2026;Â&#x203A;Ă??" eÂĄĂ&#x2019;´N^system §Ú Ă&#x161;C Â&#x160;Ăł?§vkÂ&#x;oĂź"¡Â&#x201A;rsystemÂ&#x2C6;ÂŁÂ&#x160; sts Â&#x160;Â?¡Â&#x201A;ŸêÂ&#x2C6;ÂŁÂ&#x160;"Py_BuildValue()´^5MĂŻÂ&#x2DC;Â&#x2021;python ĂŠÂ&#x2013;^§Â&#x2C6;ÂŁ Â&#x2DC;Â&#x2021;PyObject* §Œ1Â&#x2DC;Â&#x2021;ĂŤĂŞ^5Â?²ÊÂ&#x2013;a.""i"LÂŤinteger" ÂĄĂŤĂŞĂ&#x161;ĂŤ ĂŞa.Â&#x192;Â&#x2DC;Â&#x2014;"Ă&#x201E;KÂŹĂ&#x2018;Ă&#x2030;~§Â&#x2C6;ÂŁNULL" ¡uy*Ă?Python '^Python ?§IÂ&#x2021;Jþ§Ă&#x2019;Â&#x201D;?°Ă&#x201E;§SÂ&#x2021;'Ă&#x160;Ă?A^§ SJ§Ă?Â?Ă&#x2DC;Â&#x2021;ĂŠXĂ&#x161;N^ )§Â&#x201E;Â&#x2021;ĂŠĂśÂ&#x160;XĂ&#x161;SĂ&#x153;k

)"*Ă?Python Â?´Â&#x2DC; §IÂ&#x2021;ĂŠPython ¢yĂ&#x2026;Â&#x203A;k¤ )"Ă? §y3¡Â&#x201A;Â&#x2021;)¤¡Â&#x201A;module "^C Â&#x160; Ăłmodule ´kߍÂ?{\Python ÂĽ"Â&#x2DC;´rÂ&#x2020;Ă&#x161;Python  Â&#x201C;èÂ&#x2DC;ĂĽ?Ă&#x2C6;" 3Unix²e§Ê{ߧÂ?Â&#x2021;3Modules/Setup.localÂĽ\ĂžÂ&#x2DC;1§ spam spammodule.o , §rspammodule"c Â&#x20AC;Modules 8šeÂĄĂ&#x2019;Â&#x152;Âą "­#?Ă&#x2C6;Python "ĂšÂ&#x2021;Â?{ kw ´Â&#x201E;":§­#?Ă&#x2C6;Python Â&#x152;vkÂ&#x;oĂ? " 1Â&#x2021;Â?{§rC §S?Ă&#x2C6;¤Â?Ă&#x201E;ĂŤÂĽ"´kÂ&#x2021;ÂŻK§Ă&#x2DC;Ă&#x201C;²eĂŠĂ&#x201E;ĂŤ ÂĽ|ÂąÂ?ª´Ă&#x2DC;Â&#x2DC;§OĂŠÂ&#x152;"3Ă?§¡Â&#x201A;kÂ&#x2DC;Â&#x2021;distutils package Â&#x152;ÂąÂ?¡ Â&#x201A;Â&#x2030;ĂšÂ&#x2021;ÂŻÂ&#x153;"?Â&#x2DC;Â&#x2021;setup.py ŠÂ&#x2021;§ŠÂ&#x2021;SNXe" $ls setup.py spammodule.c $cat setup.py from distutils.core import setup, Extension module1 = Extension(â&#x20AC;&#x2122;spamâ&#x20AC;&#x2122;, sources = [â&#x20AC;&#x2122;spammodule.câ&#x20AC;&#x2122;]) setup (name = â&#x20AC;&#x2122;spam packageâ&#x20AC;&#x2122;, version = â&#x20AC;&#x2122;1.0â&#x20AC;&#x2122;, description = â&#x20AC;&#x2122;This is a spam packageâ&#x20AC;&#x2122;, ext_modules = [module1]) äNÂżg§Â&#x152;¹Ídistulis $python setup.py build running build running build_ext annCharles@tom.com

Ă&#x192;Ăž"

#?Ă&#x2C6;

1207Â?,208Â?

Python Ă&#x2020;S)P


Ă&#x160; Python*Ă? building â&#x20AC;&#x2122;spamâ&#x20AC;&#x2122; extension creating build creating build/temp.linux-i686-2.2 gcc -DNDEBUG -g -O3 -Wall -Wstrict-prototypes -fPIC \ -I/usr/include/python2.2 -c spammodule.c \ -o build/temp.linux-i686-2.2/spammodule.o creating build/lib.linux-i686-2.2 gcc -shared build/temp.linux-i686-2.2/spammodule.o \ -o build/lib.linux-i686-2.2/spam.so $ $ls #Ăľ Â&#x2DC;Â&#x2021;build f8š build setup.py spammodule.c $cp build/lib.linux-i686-2.2/spam.so . #Â&#x20AC;c8š $python #$1python )ºÏ Python 2.2 (#1, Apr 12 2002, 15:29:57) [GCC 2.96 20000731 (Red Hat Linux 7.2 2.96-109)] on linux2 Type "help", "copyright", "credits" or "license" for more information. >>> import spam #Ă&#x161;\¡Â&#x201A; module >>> print spam.system.__doc__ #w DOC string Execute a shell command. >>> print spam.system("echo â&#x20AC;&#x2122;helloâ&#x20AC;&#x2122;") #ww¤þ Ă­Âş hello #ok,~Ă&#x2018;Ă&#x2018; 0 # spam.system Â&#x2C6;ÂŁÂ&#x160; >>>

annCharles@tom.com

1208Â?,208Â?

Python Ă&#x2020;S)P

Python Note  

a python learn note

Advertisement