Python ÆS)P X’ LeafWang@163bj.com or AnnCharles@tom.com
2003c08 26F
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 list eIร flist . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
6
ยง1.4.3 flist J . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
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ร G Lยซ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
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ยงS Sย ยผรช . . . . . . . . . . . . . . . . . . . . . . . . . 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 G 9 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 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§ Emacs r *Ð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++ ó*ÐPython A5"X? # ¬§O\# êâa. " i \ Python )ºìÚ ±éN´ i\ ^rgC C½ö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;´3 pÂŞ$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§S 3Â&#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;Âą$1 Unix ŠÂ&#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;1 AĂ?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;o LÂ&#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;o LÂ&#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 list eIĂ&#x161;flist list eIl0mŠ§Ă&#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 flist J Â&#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;ÂŹUC 5 list"
§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;y gĂŞ" >>> 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\"XJindex u0§Ă&#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() òL S" >>> >>> >>> [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;G LÂŤ ^ĂźĂ&#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;ĂŤY VĂ&#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;G fG Â&#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´ý 5 iĂ&#x17D;G Â&#x20AC; §UC iĂ&#x17D;G´Ă&#x2DC;ÂŹUC 5 iĂ&#x17D;G "Ă&#x2DC;Â&#x152;Âą^fiĂ&#x17D;G Â?ÂŞUC 5 iĂ&#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;ÂŁĂŠ substring gĂŞ" >>> "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;5 JÂ&#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;5 JÂ&#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 Ă?Â?width iĂ&#x17D;G"Ă&#x201E;K iĂ&#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; eI fsequence§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;tuple pair§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; 3 keyÂ&#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; 3 key§ Ă&#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; §?Uc SNĂ&#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´þ1 LÂ&#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;§k râ&#x20AC;&#x153;{â&#x20AC;? ; 3if ¥§k K,ĂĽÂ&#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;vk break Â&#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ÂĽĂŠA SN" >>> >>> ... ... >>> 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ÂĽĂŠA SN§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"
Z O# 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; P C++§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;LGB 5K§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Ăž ¤3 name 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 x bind '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§3 c8š(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;˘ 3 c8š¼ ĂŠ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\3 c8šïå Â&#x2DC;Â&#x2021;Ă&#x161;IOÂĽÂĽÂ&#x2018;k I OmodulekÂ&#x192;Ă&#x201C; Âśi@oÂŹ^\ module Â&#x201C;OXĂ&#x161;module§ )#ÂśĂ&#x2122;Š ÂŻK§¤ ¹¡Â&#x201A;Â&#x2021;5¿§gC module Âś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;˘ y3 c8š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;g J name 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;<Âśi Charles§ ´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 ÂĽ name bind 'X§Ă&#x2DC;ÂŹKÂ? global name space ÂĽÂ&#x192;Ă&#x201C; name" zÂ&#x2021;object Ă&#x2018;kgC name 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;ÿ§function local 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;Âąw sayHello§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 ¼¤k CĂžĂ&#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;èÂ^§~ ÂE5 mu"ÂĄÂ&#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;m N '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; §^ĂŠA 1Â&#x2DC;ÂŤÂ?ÂŞ Â&#x152;Ă&#x2013;5ÂŹÂ?Ă?§ ´ŒÂ&#x201A;Â&#x152;Âą Ă&#x2030;ĂŤĂŞCÞ§Â?Ă&#x2019;´§S3$1 Â&#x17E;ĂżÂ&#x152;Âą?n attribute " Â&#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;i3 cname 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;vk Mï§Â?Ă&#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 ¼k EŸê
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" 3 cname space ÂĽMĂŻmodule object Â?{´Œ^import Â&#x160;ĂŠ" module 1 Â&#x2DC;gimport ½Ü reload Â&#x17E;ÿ§$1Ă&#x2122;ÂĽ Â&#x160;ĂŠ" 3 cname 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 ¤kyk name 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;U D4Â&#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;U DĂŤĂŞ" ¡Â&#x201A;Â&#x152;þêÂ&#x153;šŒ^bound methord § Â&#x153;šŒ^unbound methord " ÂŚ^unbound methord ;.Â&#x153;šĂ&#x2019;´§N^Ia unbound 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 Â1 JÂľ 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;ÂŻhk attribute "Þ¥ ~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 C vk^ "for Â&#x160;ĂŠl0 mŠ§ ^Â&#x2DC;Â&#x2021;Ă&#x2DC;ä4O key 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 ¤k python ĂśÂ&#x160;Ă&#x17D;Ă&#x2018;kڍÂ1Ă&#x2026;Â&#x203A;" \Â&#x152;Âą Â&#x2DC;Â&#x2021;gC class §4ÂŚwĂĽ5§ Â&#x201D;list §dictionary Â&#x2DC; §|¹¤k list ¤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;<a UÂŤ(
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 [xĂ&#x152;äC ĂŠÂ&#x152;§XJÂ&#x2DC;Â&#x2021;ak10 Â&#x201C;¹Þ yma§@oÂ&#x2021; Â&#x17D;Ă&#x2013;Ă&#x192;ڍa´Ê(J " ^|Ă&#x153;ĂŠÂ&#x2013; Â?ª§Â&#x152;Âą~ aÂ&#x192;m E,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Ïêâ( "k NÏêâ( ´ÊE, §~X ä§Ă&#x153; êâ( "H{Â&#x17D;{´þþ §Œ^SÂ&#x201C;ĂŹÂ&#x152;ÂąĂ&#x203A;ĂľÂ&#x17D;{ [!§4ÂŚ^ ܹĂ&#x161;Â&#x2DC; /ÂŞN^"ڍÂ?{4§S LÂ&#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;AO CÞ§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;1 yeild Â&#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) m UÂŤ ~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 A vkÂŤ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^Ia methord "
§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;rF S §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;Âąw CÂ&#x160;Ăł Ă&#x2018;Â&#x2020;?nkÂ&#x2021;ÂąeAÂ&#x2021;A:Âľ â&#x20AC;˘ §S zÂ&#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§´Ê²w kÂŻ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§Ia Ia§Ia Ia Ia... except Ă&#x2DC; Â&#x152;ÂąÂ?½exception a.§Â&#x201E;Â&#x152;Âą Ă&#x201A; Ă&#x2018;5 object" ĂžÂ&#x2DC;Â&#x2021;~fÂĽarg Ă&#x2019;´raise Â&#x160;ĂŠ Ă&#x2018;5 UserList([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"XJ KĂš ?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^r IΤ á^ r IŒ§Ú Â&#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\eZG L«Ñ §@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ù ª§¬r 5é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"X KL ª(regular expression)§ Perl§Sed§Awk"XWeb ÑÖ ì?§§ Perl" kDoc String§lambda¼ê§ LISP" k¼ê Cëê§?¿ ê ë꧷¶ëê§ C++§Java §VB" ¦ k gC A5§¦r ?ª { Ü©§ Ù´Xd r 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. u SC"3Emacs ÂĽ$1§ M-x locate-library RET python-mode RET ATÂ&#x152;¹Ê python-mode.el§XJĂŠĂ&#x2DC; §@oATu load-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;U gC ä ?§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;Âą$1 3?6 python §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;Âąr 3?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 5u region 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;¡-A 3Emacs ¤ 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 5u region mĂ&#x17E;Ă&#x161;(Â&#x2014;"Ă&#x201C; Â&#x152;¹Œ^ĂŤĂŞ"ĂšÂ&#x2021;¡-A 3Emacs ¤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? Ăľ1 5Âş Â&#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;1 mĂ&#x17E;šk Â&#x2DC;Â&#x201A;ĂŞ u4 §@oĂ&#x2019;wŒ§Ă&#x201E;KĂ&#x2019;Ă&#x2DC;w §C-x $ LÂŤw¤k 1"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;§w NĂľ ?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Á " Ï ´ã/.¡§äN NÁ {§¹¢ ¬ Ò¬ " 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;obj name 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;´cls instance 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 ^u iĂ&#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§S SÂ&#x2DC;Ÿê \ ÂŹ import§ \Â&#x2DC;Â&#x2021;module" Â&#x2030;1Â&#x201C;è exec code [ in globaldict[,localdict]]" >>> exec "a=1" #3 c 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Â?r IÂŚ"XJÂ&#x152;¹áv^r IΤĂ&#x2019;Ă&#x2DC; ^ " Ă&#x2019;Â&#x17D;Ă&#x2DC;Uáv^r IΤÂ?Ă&#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"´ÊA Python §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;" UC c8š 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;Œ¤ k f8š¼ ʜ¥´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;5 ff ? iĂ&#x17D;"f.read(size)LÂŤlŠÂ&#x2021;ÂĽĂ&#x2013; size Â&#x2021;iĂ&#x17D;§XJ Ă&#x2018;size @oòr¤ k SNĂ&#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;P M "'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;G mĂ&#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;G LÂŤ{Â&#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Âż ´lstr mĂ&#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;1 mŠ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;G mĂ&#x17E;"XJvk3Ăľ1 ÂŞ(MULTILINE) e Â&#x17E;ÿ§\A Ă&#x161;^ ´Â&#x2DC;Â&#x2021;Âżg§ ´3Ăľ1 ÂŞe\A Â?Â&#x161; 1Â&#x2DC;1 1Ă&#x201E;" ^Â&#x161; zÂ&#x2DC;1 1Ă&#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;1 1Â&#x2014;" ^Â&#x161; zÂ&#x2DC;1 1Â&#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>." ¹Þ¤k metacharacter ÂżĂ&#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; o iĂ&#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¼§w kĂš Â&#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;ÿ§w AOk^"ڍÂ?{ ´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 ^5N RegxObject Â? [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!) Ă?Â?1 iĂ&#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ÂŤ Ă?Â?4 iĂ&#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;´Ă?^ §Â?)Þ¥J gnuplot §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.py k269 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;\ Ăźc mĂ&#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¢y QÂş 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;Âąw getattr ÂŚ^´'Â&#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;§S 1Â?§Ă&#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;G list" Ă&#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 óä8 KÂ?"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 e mLÂŤ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"ĂĄ ´u pÂŞĂ&#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§N JĂ&#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; §@oA vk<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 "r option m Ă&#x17E;ĂźÂ&#x2021;~Ă&#x2019; K§rĂ&#x2122;ÂĽ ~Ă&#x2019;C¤eyÂ&#x201A;§Ă&#x2019;´CĂž ϴ"ĂžÂ&#x2021;~fÂĽĂ&#x2019;´rÂ&#x192; A CĂžÂ&#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;še IΤ ´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;~f JÂ&#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 Âśi KĂ&#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;IO C Â&#x160;Ăł Ÿêœ¥´Â&#x2DC; §¤¹Í ² Ăž Â&#x192;A C Â&#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;m LÂŤÂŚ^Â&#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; ĂľU socket §^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+f Yá §Â&#x2DC;Ă&#x2DC;e @oĂľ Y§Ă&#x2019;/eÂ&#x2DC;Â&#x152;§Â? Â&#x2DC;Â&#x152;3Ă&#x2014;p§XJ\Â&#x2021;Â&#x201D; Ă&#x153;/\ {§Ă&#x2019; Â&#x2DC;ÂŹ § Â?+f Y6e §eg2/" XJsend Â&#x2C6;ÂŁ0 {§LÂŤ Ă&#x201A;Â?r+fĂ&#x2014;4 " Ă&#x201A;Â?3+f ,Â&#x2DC;Ă&#x17E; 6Ă&#x2018;5 Y§Â?N^Ă&#x2014;§Â?N@¼§Â?N^ §Â?N^ § ´ Ă&#x2018;5 Y§Ă&#x2DC;Â&#x2DC;½´uxĂ Ă&#x201C;Â&#x2DC;ÂĽS Y§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;m socket "¤¹ Â? ;Â?Ă&#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;1 1Â&#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 eÌ ·-: 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;IP eÂ&#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 ;ux eÂ&#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;g RCPT ¡-¤þÂ&#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;Ă ÂŹ@Â? ÂĄ ¤k 1Ă&#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;ÂĽ3 K \ â&#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;1 3 MAIL ¡-ÂĽ reverse path &E" ĂšĂ&#x2019;ÂżÂ&#x203A;X§ ªĂ&#x201A;Â&#x2021;<w eÂ&#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;^r Gourzenkyinplatz " ĂšÂ&#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 ªàþ§ Ø´^r e ¥" 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 ^ r e ¥" SAML ·- ¿g´SEND or MAIL §L«uxe ^r ªàþ§¿ ux ^ r e ¥" 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;a cÂĄĂ&#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;\ §S 3Â&#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¤k option. Ă?~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;½ "¤k widget option Ă&#x2018;k%@Â&#x160;§¤¹ {Ăź MĂŻÂ&#x2DC;Â&#x2021;widget Â?{ ´¤k option Ă&#x2018;ÂŚ^%@Â&#x160;§Â?Ă&#x2019;´Ă&#x2DC;Â?½?Ă&#x203A;option§Â?IÂ?½widget master widget§XJ\ĂŠB {§$Â&#x2013;ĂŤmaster widget Â?Â&#x152;ÂąĂ&#x2DC;^Â?½§Tkinter ÂŹ^ C ÂŚ^L master widget Â&#x160;Â?%@ master widget " â&#x20AC;˘ w.cget(option) Â&#x2DC;Â&#x2021;widget option Â&#x160;"w ´Â&#x2DC;Â&#x2021;widget "¤k widget 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") ¤k widget 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 ¤k option " 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;N Widget ¤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; ¤k slave 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ÂŤw zÂ&#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 N UCgC Â&#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¤k slave widget Ă&#x2018;{Â&#x2DC;Ă? § ´Â&#x201E;kÂ?{Â&#x2DC;m§ŒÝ½´Ă&#x2DC;´rmaster Â?{Â&#x2DC;mÂ&#x2030;¤kparcel " 5¿§¹Þ¤k option 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 o widget ^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¤k slave 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;ÂŚ Â?e slave 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;N master widget °Ă?Ă&#x161;p Ă?§^5 Ă? Â&#x2DC;Â&#x2DC;¤k slave 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;´¤k Widget {Â&#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;m W¿ü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¤k slave 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;¤k slave 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; ĂŤY 1(½ ) Â&#x2030;Â&#x2DC;Â&#x2021;cell group §cell group °Ă?(½ÜpĂ?)´|S¤kcell °Ă?(½ÜpĂ?) Ă&#x161;"XJcell group
Â&#x152;§v Â&#x2DC; eÂ&#x192;ĂŠA slave 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 ¼¤k cell weight Ă&#x2018;´0§@oĂ&#x2019;²ÞO\|S¤k cell °Ă?(½pĂ?)" Â?ge §Â&#x152;Âą(½zÂ&#x2DC; (½1) °Ă?(½pĂ?)§Ú zÂ&#x2DC;Â&#x2021;cell Ă&#x161;cell group Â&#x152; Ă&#x2019;(½ " Â&#x2DC;Â&#x2DC;1 weight§Â&#x152;¹Œ^grid rowconfgure Ÿê§~X m.grid_rowconfigure(0,weigtht=2) r101 weight Â&#x2DC;Â?2 " Â&#x2DC;Â&#x2DC; weight§Â&#x152;¹Œ^grid columnconfgure Ÿê§~X m.grid_columnfigure(0,weigtht=2) r10 weight Â&#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;¤k 1(½Ü )§Â&#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; bC i N5Â&#x201C;O"¤¹3Â?½iN Â&#x17E;ĂżTk 8.0 l5Ă&#x2018;Ă&#x2DC;ÂŹ wÂ&#x2020;Ă&#x2DC; "XJĂŠĂ&#x2DC;  bC i N§@oĂ&#x2019;´^%@iN" ´Tk @Â? bC iN§k Â&#x17E;ÿ¿Ă&#x2DC;´\Â&#x17D;Â&#x2021; §¤¹Ă&#x2DC; Â&#x2021;LĂľ Â?Â&#x201A;ĂšÂ&#x2021;A5" Windows e Tk 4.2 Â?|¹ÚiN LÂ&#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; |aq widget Â?½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; §\o Times 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; § ´¤k Widget Ă&#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;Âąw cĂ IUÂ&#x2026; ½Ă&#x201A;" 3 wu)Â&#x;oÂŻÂ&#x2021; Â&#x17E;ÿ§¹eóä´Êk^ " xmodmap xev
wĂ&#x161;?UX Â&#x2026; N 'XĂ&#x161;Ă IN 'X" ^5 wÂŻÂ&#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;´?uUe G " 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;?3Ue G " Ăś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(A vkÂŁĂ&#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;§ @o UeÂŁÂ?Â&#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¤k k ÂŻÂ&#x2021;?nŸê" ´XJÂ?½1nÂ&#x2021;ĂŤĂŞÂ?â&#x20AC;&#x153;addâ&#x20AC;? ~X: bind(e,func,"add") Ă&#x2019;Â&#x152;Âą 3 5 ÂŻÂ&#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¼¤k Text 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;Âąw lambda MïŸê Â?BÂ&#x192;?§Â&#x152;Âą^ڍÂ?{§Â?, ÂŻÂ&#x2021;?nŸêO\% @ĂŤĂŞ"Ăš Â&#x2DC;Â&#x2021;ÂŻÂ&#x2021;?nŸêÂ&#x152;Âą?nĂľÂ&#x2021;widget ) ÂŻÂ&#x2021;§~ Ÿê êÞ§Â&#x152;Âą{ z O§Â?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 G 9 Êþ§S eÂ?Ă&#x2018;kÂ&#x2DC;Â&#x2021;G 9§Ă&#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;o IOĂŁ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;kaq tkSimpleDialog.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;o a. Š Â&#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 * /*¤k PythonĂŠÂ&#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;¡A a.´char**§´Â&#x2DC;Â&#x2021;iĂ&#x17D;Â? Â? "Â?Ă&#x2019;´`§Ă&#x2DC;^¡Â&#x201A;gC5? S +n Ÿê§XJPythonÂĽXĂ&#x161;ŸêPyArg_ParseTuple ~Â&#x2C6;£§@ocommandĂ&#x2019;Â? Â&#x2022;Â&#x2DC;Â&#x2021;k iĂ&#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