You are on page 1of 435

Edice CZ.

NIC
O autorovi Mark Pilgrim se nesmazateln zapsal do povdom pythonovsk komunity u svoj knihou
Dive Into Python, ve kter originlnm a nezapomenutelnm zpsobem piblil tenm osobit styl
programovn v tomto jazyce, aby se o nkolik let pozdji pipomenul jet vraznji s knihou Dive Into
Python 3, kter je stejn originlnm a zbavnm zpsobem vnovna jeho nejnovj verzi. S podobnm
nadenm se vak zabv i dalmi tmaty, jeho nejnovj kniha HTML5: Up & Running je tivm
vodem do problematiky poslednho hitu na poli pedvn informac na Internetu standardu HTML5.

O edici Edice CZ.NIC je jednm z osvtovch projekt sprvce esk domny nejvy rovn. Clem
tohoto projektu je vydvat odborn, ale i populrn publikace spojen s internetem a jeho technologiemi.
Krom titnch verz vychz v tto edici souasn i elektronick podoba knih. Ty je mon najt
na strnkch knihy.nic.cz
M
a
r
k

P
i
l
g
r
i
m


P
o
n
o

m
e

s
e

d
o

P
y
t
h
o
n
(
u
)

3
E
d
i
c
e

C
Z
.
N
I
C
Edice CZ.NIC
3
Ponome se do Python(u) 3
Mark Pilgrim
Dive Into Python 3 knihy.nic.cz
D
i
v
e

I
n
t
o

P
y
t
h
o
n

3
ISBN: 978-80-904248-2-1
Python
NIC_python3_cover_v6_full.indd 1 11/18/10 6:05:19 PM
Process CyanProcess MagentaProcess YellowProcess BlackPANTONE 636 C
1
2u1u Mail PIIgiIm
Ponome se do Python(u) 3
DIvo Inlo Pyllon 8
VyuaI CZ.NIC, z. s. . o.
AmoiIcl 28, 12u uu Piala 2
vvv.nIc.cz
ISBN: u78-8u-uu4248-2-1
LuIco CZ.NIC
3
LuIco CZ.NIC
Ponome se do Python(u) 3
DIvo Inlo Pyllon 8
Mail PIIgiIm
4
5
Pedmluva a edin poznmka
PioumIuva a ouIcnI oznmla
6
7
Ven teni,
o sclu nasI iouclozI uhIIlaco PioGIl jsmo so iozlouII, zo liolI lnIla
v LuIcI CZ.NIC huuo lal lioclu na ouohno loma a v ouohnom uuclu.
Ol juo o iolIau voIIco lvaIIlnI zalianIcnI uhIIlaco a lalo v lomlo iI-
au so u ocolval, zo joj oconI lIavn iogiamloiI. Samoziojm jsmo
I lonlolil slII o lnIzo, lloi jo ou voInou IIconcI a louy IIIozoIIo jojI
uIsliIhuco jo hIIzl nasI ouIcI.
Pouohn jalo v iIau nsliojo GIl jo I Pyllon loclnoIogIo, lloi jo mym
loIogum voIIco uohio znma. Piv v iogiamovacIm jazyco Pyllon jo
nasna ouslaln csl nasolo conliInIlo iogIsliu io sivu uomon,
lloiy so jmonujo IRLD. Tolo jo jon jouon z mnola uulazu, ioc jo nulno
so lImlo iogiamovacIm jazylom vzn zahyval.
Auloi lnIly Murk Pilgrim nonI vo svl Pyllonu iozloun zunym no-
znmym jmonom. Svo ionomo sI vyhuuovaI jIz nasnIm ioucluuco lolo
lnIly s lomi slojnym jmonom. Piv scl uiIvjsIlo uIIa jo io ns
ziulou, zo I lalo voizo sI najuo svo clonio.
Al uz jslo louy v Pyllonu novcly noho sI jon clcolo iozsIiIl svo uosavaunI
znaIoslI, iojI Vm iIjomnou colhu.
Ondej Filip
Piala 17. IIsloauu 2u1u
LuIcnI oznmla auloia
Pnnnrmo so dn Pythnnu 8 oliyv vIaslnoslI jazyla Pyllon 8 a oIsujo iozuIIy iolI jazylu Pyllon 2.
Vo siovnnI s Divo Intn Pythnn zuo naIoznolo asI 2u iovIuovanolo loxlu a asI 8u novolo maloiIIu.
KnIlu ovazujI za uolonconou, aIo zln vazha jo vzuy vIlna.
PioumIuva a ouIcnI oznmla
8
9
Obsah
Ohsal
10
11
Ohsal
PiolIou laIloI
-1. Co najdete v Ponome se
do Pythonu 3 novho 17
0. Instalujeme Python 21
1. V prvn pythonovsk program 45
2. Pirozen datov typy 61
3. Genertorov notace 91
4. etzce 105
5. Regulrn vrazy 123
6. Uzvry a genertory 143
7. Tdy a itertory 159
8. Itertory pro pokroil 173
9. Unit Testing 193
10. Refaktorizace 219
11. Soubory 235
12. XML 255
13. Serializace pythonovskch objekt 277
14. Webov sluby nad HTTP 297
15. Ppadov studie: Pepis chardet pro Python 3 329
16. Balen pythonovskch knihoven 359
A. Pepis kdu do Python 3 s vyuitm 2to3 377
B. Jmna specilnch metod 405
C. m pokraovat 423
D. Odstraovn problm 427
12
-1. Co najdete v Ponome se
do Pythonu 3 novho 17
-1.1. anoh ,zoin iovo 19
0. Instalujeme Python 21
u.1. Ponoimo so 23
u.2. Kloiy Pyllon jo io vs
lon sivny 23
u.8. InslaIaco ou MIciosoIl WInuovs 24
u.4. InslaIaco ou Mac OS X 29
u.. InslaIaco ou Ihunlu LInux 36
u.6. InslaIaco na jInycl IalIoimcl 40
u.7. PouzIlI Pyllon SloII 41
u.8. LuIloiy a vyvojov iosliouI
io Pyllon 43
1. V prvn pythonovsk program 45
1.1. Ponoimo so 47
1.2. DolIaiaco IunlcI 48
1.2.1. NoovInno a ojmonovano
aigumonly 49
1.8. PsanI cIloInolo louu 51
1.8.1. DolumonlacnI iolzco 51
1.4. VylIouvacI cosla io import 52
1.. Vsoclno jo ohjoll 53
1..1. Co lo vIasln jo ohjoll 54
1.6. OusazovnI louu 54
1.7. VyjImly 55
1.7.1. OhsIula clyh Imoilu 57
1.8. VoIno iomnno 58
1.u. Vso jo cIlIIvo na voIIlosl Ismon 58
1.1u. SouslnI sliIlu 59
1.11. Piocllo sI 60
2. Pirozen datov typy 61
2.1. Ponoimo so 63
2.2. BooIoovsly ly 63
2.8. CIsIa 64
2.8.1. VynuconI iovouu coIycl cIsoI
na ioIn a naoal 65
2.8.2. Bzno ooiaco s cIsIy 66
2.8.8. ZIomly 67
2.8.4. TiIgonomoliIo 67
2.8.. CIsIa v hooIoovslom lonloxlu 68
2.4. Soznamy 69
2.4.1. VylvoionI soznamu 69
2.4.2. VylvionI ousoznamu 70
2.4.8. PiIuvnI oIozol uo soznamu 71
2.4.4. VylIouvnI lounoly v soznamu 73
2.4. OusliaovnI oIozol zo soznamu 74
2.4.6. OusliaovnI oIozol zo soznamu:
Bonusovo loIo 75
2.4.7. Soznamy v hooIoovslom lonloxlu 75
2.. N-lIco 76
2..1. N-lIco v hooIoovslom lonloxlu 78
2..2. PiIiazonI vIco lounol najounou 78
2.6. MnozIny 79
2.6.1. VylvoionI mnozIny 79
2.6.2. Iiava mnozIny 81
2.6.8. OusliaovnI oIozol z mnozIny 82
2.6.4. Bzno mnozInovo ooiaco 83
2.6.. MnozIny v hooIoovslom lonloxlu 85
2.7. SIovnIly 86
2.7.1. VylvoionI sIovnIlu 86
2.7.2. Iiava sIovnIlu 87
2.7.8. SIovnIly so smIsonym ohsalom 87
2.7.4. SIovnIly v hooIoovslom lonloxlu 88
2.8. None 89
2.8.1. Nono v hooIoovslom lonloxlu 90
2.u. Piocllo sI 90
3. Genertorov notace 91
8.1. Ponoimo so 93
8.2. Pico so souhoiy a s auiosiI 93
8.2.1. AlluInI iacovnI auiosi 93
8.2.2. Pico so jmony souhoiu a auiosiu 94
8.2.8. VyIs auiosiu 96
8.2.4. ZIslnI uaIsIcl InIoimacI
o souhoiu 97
8.2.. Jal vylvoiIl ahsoIulnI cosly 98
8.8. Gonoiloiov nolaco soznamu 98
8.4. Gonoiloiov nolaco sIovnIlu 100
8.4.1. DaIsI Iogicly s gonoiloiovou
nolacI sIovnIlu 102
8.. Gonoiloiov nolaco mnozIn 103
8.6. Piocllo sI 103
Ohsal
13
Ohsal
4. etzce 105
4.1. Pi nuunycl vcI, lloiym musImo
iozuml uiIvo, noz so huuomo
mocI onoiIl 107
4.2. InIcouo 109
4.8. Ponoimo so 111
4.4. IoimlovacI iolzco 111
4.4.1. SIozon jmona ohIaslI 113
4.4.2. SocIIIlloiy Ioimlu 114
4.. DaIsI hzno molouy iolzcu 115
4..1. VyliajovnI ouiolzcu 117
4.6. Rolzco vs. hajly 117
4.7. Zviocn oznmla: KouovnI znalu
v yllonovslom zuiojovom loxlu 120
4.8. Piocllo sI 121
5. Regulrn vrazy 123
.1. Ponoimo so 125
.2. PiIauov sluuIo: Auiosa uIIco 125
.8. PiIauov sluuIo: RImsl cIsIa 128
.8.1. KonlioIa lIsIcovol 128
.8.2. KonlioIa slovol 129
.4. VyuzIlI synlaxo {n,m} 131
.4.1. KonlioIa uosIlol a jounolol 132
.. VIcosIovno ioguIinI vyiazy 134
.6. PiIauov sluuIo:
AnaIyza loIoIonnIcl cIsoI 136
.7. SlinulI 141
6. Uzvry a genertory 143
6.1. Ponoimo so 145
6.2. J vIm jal na lo! PouzIjomo
ioguIinI vyiazy! 146
6.8. Soznam IunlcI 148
6.4. Soznam vzoilu 150
6.. Souhoi vzoilu 152
6.6. Gonoiloiy 154
6.6.1. Gonoiloi IIhonaccIlo
osIounoslI 155
6.6.2. Gonoiloi iavIuoI io mnozno
cIsIo 156
6.7. Piocllo sI 158
7. Tdy a itertory 159
7.1. Ponoimo so 161
7.2. DoIInIco liIu 161
7.2.1. Moloua __init__() 162
7.8. VylvionI InslancI liIu 163
7.4. CIonslo iomnno 163
7.. IIhonaccIlo Iloiloi 164
7.6. Iloiloi io iavIuIa
mnoznolo cIsIa 166
7.7. Piocllo sI 172
8. Itertory pro pokroil 173
8.1. Ponoimo so 175
8.2. NaIozonI vsocl vyslylu vzoilu 176
8.8. NaIozonI jouInocnycl ivlu
osIounoslI 177
8.4. CInImo iouolIauy 178
8.. Gonoiloiovo vyiazy 179
8.6. Vyocol oimulacI (io Ionocly) 180
8.7. DaIsI Iogicly v mouuIu IloilooIs 182
8.8. Novy zusoh iavy iolzco 185
8.u. VylounocovnI IIhovoInycl iolzcu
zaclycujIcIcl yllonovslo vyiazy 187
8.1u. Sojmo lo vsoclno uoliomauy 190
8.11. Piocllo sI 191
9. Unit Testing 193
u.1. (No)onoimo so 195
u.2. JouIn olzla 196
u.8. ,Zaslav a zacnI loiol 202
u.4. VIco zaslvol, vIco oln 206
u.. A josl jouna vc... 209
u.6. SymoliIo, lloi olsI 211
u.7. VIco salnycl vsluu 215
10. Refaktorizace 219
1u.1. Ponoimo so 221
1u.2. ZvIunI mnIcIcl so ozauavlu 223
1u.8. RoIalloiIzaco 228
1u.4. SlinulI 232
14
11. Soubory 235
11.1. Ponoimo so 237
11.2. ClonI z loxlovycl souhoiu 237
11.2.1. KouovnI znalu vyslilujo
svou oslIIvou lIavu 237
11.2.2. Ohjolly lyu slioam 238
11.2.8. ClonI ual z loxlovolo souhoiu 239
11.2.4. ZavIinI souhoiu 241
11.2.. AulomalIclo zavIinI souhoiu 242
11.2.6. ClonI ual o iucIcl 243
11.8. ZIs uo loxlovycl souhoiu 245
11.8.1. A znovu louovnI znalu 246
11.4. BIninI souhoiy 246
11.. Ohjolly lyu slioam
z nosouhoiovycl zuioju 247
11..1. Pico s lomiImovanymI souhoiy 249
11.6. SlanuaiunI vslu, vyslu
a clyhovy vyslu 250
11.6.1. PiosmiovnI slanuaiunIlo
vysluu 251
11.7. Piocllo sI 254
12. XML 255
12.1. Ponoimo so 257
12.2. PlImInulovy iyclIoluiz XML 258
12.8. Sliulluia Alom Ioou 261
12.4. AnaIyza XML 263
12.4.1. LIomonly jsou ioiozonlovny
soznamy 264
12.4.2. AliIhuly jsou ioiozonlovny
sIovnIly 264
12.. VylIouvnI uzIu v XML
uolumonlu 265
12.6. IxmI juo josl uI 268
12.7. GonoiovnI XML 270
12.8. AnaIyza oiusonolo XML 273
12.u. Piocllo sI 275
13. Serializace pythonovskch
objekt 277
18.1. Ponoimo so 279
18.1.1. Sliucn oznmla l iIlIauum
v lolo laIloIo 279
18.2. IIozonI ual uo ,IclIo souhoiu 280
18.8. NacIlnI ual z ,IclIo souhoiu 281
18.4. ,PIlIonI hoz souhoiu 283
18.. Bajly a iolzco znovu zvouajI
svo oslIIvo lIavy 284
18.6. LaunI ,IclIo souhoiu 284
18.7. SoiIaIIzaco yllonovslycl ohjollu
io clonI z jInycl jazylu 286
18.8. IIozonI ual uo JSON souhoiu 287
18.u. ZohiazonI yllonovslycl ualovycl
lyu uo JSON 289
18.1u. SoiIaIIzaco ualovycl lyu, lloio
JSON noouoiujo 289
18.11. NacIlnI ual z JSON souhoiu 293
18.12. Piocllo sI 295
14. Webov sluby nad HTTP 297
14.1. Ponoimo so 299
14.2. VIaslnoslI HTTP 300
14.2.1. PouzIvnI mozIamlI 300
14.2.2. KonlioIa Lasl-MouIIIou 301
14.2.8. KonlioIa LTag 303
14.2.4. Komioso 304
14.2.. PiosmiovnI 304
14.8. Jal so nouoslal l ualum
ios HTTP 305
14.4. Co zo lo mmo na uil 306
14.. Piouslavujomo httplib2 309
14..1. Kill ouhocla vysvlIujIcI, ioc
httplib2 viacI hajly mIslo iolzcu 311
14..2. Jal httplib2 zaclzI s mozIamlI 312
14..8. Jal httplib2 zaclzI s lIavIclamI
Lasl-MouIIIou a LTag 315
14..4. Jal http2lib iacujo s lomiosI 318
14... Jal httplib2 iosI iosmiovnI 318
14.6. Za lianIcomI HTTP GLT 322
14.7. Za lianIcomI HTTP POST 326
14.8. Piocllo sI 328
15. Ppadov studie:
Pepis chardet pro Python 3 329
1.1. Ponoimo so 331
1.2. Co so iozumI aulouololcI
znalovolo louovnI 331
Ohsal
15
Ohsal
1.2.1. NonI lo nlouou noiovouIloIno 331
1.2.2. LxIslujo lalovy aIgoiIlmus 332
1.8. Ivou uo mouuIu chardet 332
1.8.1. UTF-N s BOM 332
1.8.2. KouovnI oscao solvoncomI 333
1.8.8. VIcohajlov louovnI 333
1.8.4. Jounohajlov louovnI 334
1.8.. windows-1252 334
1.4. SouslImo 2to3 335
1.. Kill ouhocla l vIcosouhoiovym
mouuIum 338
1.6. Oiavmo, co 2to3 noumI 340
1.6.1. IaIso jo synlallIcl clyha 340
1.6.2. NonaIozon mouuI constants 341
1.6.8. Jmono 'file' nonI uoIInovno 342
1.6.4. Rolzcovy vzoiol noIzo ouzIl
io hajlovo ohjolly 343
1.6.. Ohjoll lyu 'bytes' noIzo ImIIcIln
iovosl na str 345
1.6.6. Noouoiovano lyy ooianuu
io +: 'int' a 'bytes' 348
1.6.7. Iunlco ord() ocolvaIa iolzoc
o uoIco 1, aIo hyI naIozon int 350
1.6.8. NousoiualoIno ualovo lyy:
int() >= str() 352
1.6.u. GIohInI jmono 'reduce'
nonI uoIInovno 355
1.7. SlinulI 357
16. Balen pythonovskch
knihoven 359
16.1. Ponoimo so 361
16.2. VcI, lloio za ns DIslulIIs
nouuIajI 362
16.8. Sliulluia auiosio 363
16.4. PIsomo svuj InslaIacnI sliIl 364
16.. PiIuvmo lIasIIIlacI nasolo
haIIclu 366
16..1. PiIlIauy uohiycl lIasIIIlloiu
haIIclu 367
16.6. IiconI uaIsIcl souhoiu
iosliounIclvIm manIIoslu 368
16.7. KonlioIa clyh v nasom InslaIacnIm
sliIlu 369
16.8. VylvoionI uIsliIhuco ohsalujIcI
zuiojovo loxly 369
16.u. VylvoionI giaIIclolo InslaIacnIlo
iogiamu 371
16.u.1. Tvoiha InslaIacnIcl haIIclu
io jIno ooiacnI syslomy 373
16.1u. PiIunI nasolo soIlvaiu
uo Pyllon Paclago Inuox 373
16.11. VIco moznycl huuoucnoslI
haIonI yllonovslycl iouullu 375
16.12. Piocllo sI 375
A. Pepis kdu do Pythonu 3
s vyuitm 2to3 377
A.1. Ponoimo so 379
A.2. PiIlaz print 379
A.8. LIloiIy InIcouo iolzcu 380
A.4. GIohInI Iunlco unicode() 380
A.. Dalovy ly long 380
A.6. PoiovnnI <> 381
A.7. SIovnIlov moloua has_key() 381
A.8. SIovnIlovo molouy, lloio viacojI
soznamy 382
A.u. MouuIy, lloio hyIy iojmonovny
noho iooiganIzovny 383
A.u.1. http 383
A.u.2. urllib 384
A.u.8. dbm 385
A.u.4. xmlrpc 385
A.u.. OslalnI mouuIy 386
A.1u. RoIalIvnI Imoily uvnIli haIIclu 387
A.11. Moloua Iloiloiu next() 388
A.12. GIohInI Iunlco filter() 388
A.18. GIohInI Iunlco map() 389
A.14. GIohInI Iunlco reduce() 390
A.1. GIohInI Iunlco apply() 390
A.16. GIohInI Iunlco intern() 390
A.17. PiIlaz exec 391
A.18. PiIlaz execfile 391
A.1u. repr-IIloiIy (zlno aoslioIy) 392
A.2u. PiIlaz try...except 392
16
Ohsal
A.21. PiIlaz raise 393
A.22. Moloua gonoiloiu throw 393
A.28. GIohInI Iunlco xrange() 394
A.24. GIohInI Iunlco raw_input()
a input() 395
A.2. AliIhuly IunlcI func_* 395
A.26. Moloua xreadlines()
VlV ohjollu 396
A.27. lambda Iunlco, lloio alcolujI
n-lIcI mIslo vIco aiamoliu 396
A.28. AliIhuly socIInIcl molou 397
A.2u. SocIInI moloua __nonzero__ 397
A.8u. OllaIovo IIloiIy 398
A.81. sys.maxint 398
A.82. GIohInI Iunlco callable() 399
A.88. GIohInI Iunlco zip() 399
A.84. VyjImla StandardError 399
A.8. Konslanly mouuIu types 400
A.86. GIohInI Iunlco isinstance() 400
A.87. Dalovy ly basestring 401
A.88. itertools mouuIo 401
A.8u. sys.exc_type, sys.exc_value,
sys.exc_traceback 401
A.4u. Gonoiloiy soznamu nau n-lIcomI 402
A.41. Iunlco os.getcwdu() 402
A.42. MolaliIuy 402
A.48. VcI lylajIcI so slyIu 403
A.48.1. MnozInovo IIloiIy (set();
oxIIcIln) 403
A.48.2. GIohInI Iunlco buffer()
(oxIIcIln) 403
A.48.8. BIIo znaly loIom ciol
(oxIIcIln) 404
A.48.4. Bzno ohialy (oxIIcIln) 404
B. Jmna specilnch metod 405
B.1. Ponoimo so 407
B.2. ZlIauy 407
B.8. TiIuy, lloio so clovajI
jalo Iloiloiy 407
B.4. VyocIlvano aliIhuly 408
B.. TiIuy, lloio so clovajI jalo Iunlco 411
B.6. TiIuy, lloio so clovajI
jalo mnozIny 412
B.7. TiIuy, lloio so clovajI
jalo sIovnIly 413
B.8. TiIuy, lloio so clovajI jalo cIsIa 414
B.u. TiIuy, lloio so uajI oiovnval 417
B.1u. TiIuy, lloio ouoiujI soiIaIIzacI 418
B.11. TiIuy, lloio molou hyl ouzIly
v hIolu with 418
B.12. Oiavuu osoloiIclo vcI 420
B.18. Piocllo sI 420
C. m pokraovat 423
C.1. DooiucujI l ioclonI 425
C.2. Kuo lIoual lou lomalIhIInI
s Pyllonom 8 426
D. Odstraovn problm 427
D.1. Ponoimo so 429
D.2. Jal so uoslal l iIlazovomu iulu 429
D.8. SuslnI Pyllonu z iIlazovolo
iulu 429
17
-1. Co najdete v Ponome se
do Pythonu 3 novho
-1. KaIloIa
Isnt this where we came in?
PInl IIoyu, The Wu
18
Ohsal laIloIy
-1. Co najdete v Ponome se
do Pythonu 3 novho 17
-1.1. anoh ,zoin iovo 19
19
-1.1. anoh ,zoin iovo
Iz jslo v jazyco Pyllon iogiamovaII ColII jslo oiIgInInI uhIIlacI ,DIvo Inlo Pyllon KouIII jslo sI
jI v lnIznI ouoh (Poluu ano, uIly!) Jslo iIiavonI onoiIl so uo jazyla Pyllon 8... Poluu lomu lal
jo, cllo uI. (Poluu nIc z lolo noIalI, mII hyslo iaujI zacIl ou zacllu.)
Pyllon 8 so uouv so sliIlom nazvanym 2to3. Nauclo so joj. MIIujlo joj. PouzIvojlo joj. PioIs louu
uo Pyllonu 8 s vyuzIlIm 2to3 jo ioIoioncnI iIiuclou lo vsom vcom, lloio sliIl 2to3 umI oiavIl
aulomalIcly. A iolozo iaua lcllo vcI souvIsI so zmnamI synlaxo, jo lalo iIiucla uohiym vyclozIm
houom lo sluuIu synlallIclycl zmn, lloio Pyllon 8 iInsI. (Z iIlazu print so slaIa Iunlco, ohial
`x` ioslaI Iungoval alu.)
PiIauov sluuIo: PioIs chardet io Pyllon 8 oIsujo mo (nalonoc ssno) sIII o ioIs noliIvII-
nI lnIlovny z Pyllonu 2 uo Pyllonu 8. Mozn vm lalo sluuIo omuzo, mozn no. IcIcI liIvla jo zuo
omin slim, iolozo nojuiIvo musIlo oiozuml lnIlovn samolno. Toivo olom muzolo iozuml
lomu, ioc ioslaIa Iungoval a jalym zusohom jsom jI oiavII. Raua iohIomu so vzo na iolzco.
Kuyz uz o nIcl mIuvImo...
Rolzco. IIIII. Kuo mm zacIl Pyllon 2 ouzIvaI ,iolzco a ,iolzco v InIcouo. Pyllon 8 iozIIsujo
,hajly a ,iolzco. Vsoclny iolzco so nynI slvajI iolzcI v InIcouo. Poluu s ohsalom clcomo zacl-
zol jalo s hajly, musImo ouzIl novy ualovy ly nazvany bytes. Pyllon 8 nLdy sliyl noiovuI iolz-
co na hajly a naoal. Talzo oluu sI v lazuom momonl nojslo jIslI, zua ouzIvlo lon cI onon ly, lou
vasolo iogiamu lomi jIsl ioslano Iungoval. DaIsI ouiohnoslI naIoznolo v laIloIo Rolzco.
PiohIom hajly voisus iolzco so v loxlu lolo lnIly vynoiujo znovu a znovu.
- V laIloIo Souhoiy so soznmIlo s iozuIIom mozI clonIm souhoiu v ,hIninIm a ,loxlovom
iozImu. PiI clonI (aIo lalo iI zIsu) souhoiu v loxlovom iozImu so vyzauujo zaunI aiamoliu
uicujIcIlo louovnI (encoding). Nlloio molouy loxlovycl souhoiu ocIlajI znaly, aIo jIno mo-
louy zaso ocIlajI hajly. Poluu vo svom zuiojovom louu iouolIulo, zo so jouon znal iovn
jounomu hajlu, al lo iI ioclouu na vIcohajlovo znaly Ie:|une [ungovu|.
- V laIloIo Wohovo sIuzhy nau HTTP clo mouuI httplib2 lIavIcly a uala iosliounIclvIm
iololoIu HTTP. HIavIcly so viacojI v ouoh iolzcu, aIo lIa so viacojI jalo hajly.
- V laIloIo SoiIaIIzaco yllonovslycl ohjollu so naucIlo, ioc mouuI pickle io Pyllon 8 uoII-
nujo novy ualovy Ioiml, lloiy jo zln nolomalIhIInI s voizI io Pyllon 2. (Novua: Duvo-
uom jsou hajly a iolzco.) Pyllon 8 ouoiujo lalo soiIaIIzacI ohjollu uo a z json, lloiy uolonco
noiacujo s lyom bytes. Ilzomo sI, jal so lo u ohojIl.
- V cslI PiIauov sluuIo: PioIs chardet io Pyllon 8 so solllo so zaliaconym zmallom mozI
hajly a iolzcI In vsuuo.
-1.1. anoh ,zoin iovo
Ka.
Ka.
Ka.
Ka.
Ka.
Ka.
Ka.
20
Dolonco I luyhy vs InIcouo noclvaI In clIauno (aIo no, nonocl), huuolo sI uicIl cllIl nco
iocIsl o IoimlovnI iolzcu v jazyco Pyllon 8. ZcoIa so IIsI ou iouIsu IoimlovnI iolzcu v jazyco
Pyllon 2.
S Iloiloiy so v Pyllonu 8 solllo vsuuo. A lou uz jIm iozumIm mnolom vIc, noz lomu hyIo iou lI
Ioly, luy jsom nasaI ,DIvo Inlo Pyllon. Snazlo so jIm oiozuml lalo, iolozo mnolo IunlcI, lloio
v jazyco Pyllon 2 viacoIy soznamy, viacI v Pyllonu 8 iv Iloiloiy. PiInojmonsIm hyslo sI mII io-
cIsl uiulou oIovInu laIloIy Iloiloiy a uiulou oIovInu laIloIy Iloiloiy io oliocIIo.
Na inI cloniu jsom iIuaI iIIolu Jmona socIInIcl molou, lloi so ouoh laIloIo Dala MouoI
(Dalovy mouoI) uvouono v uolumonlacI jazyla Pyllon.
V uoh, luy jsom saI ,DIvo Inlo Pyllon, mIy vsoclny uosluno lnIlovny io icI s XML mIzoi-
nou lvaIIlu. Pal aIo IiouiIl Lunul nasaI mouuI FlomontTroo, lloiy nonI ue vIet mzerny. Pyllonov-
slI holovo mouuio zacIonIII LIomonlTioo uo slanuaiunI lnIlovny, a lal so lonlo mouuI slaI zlIauom
mo novo laIloIy o XML. SlaisI zusohy ziacovnI XML jsou slIo ouoiovano, aIo mII hyslo so jIm
vylnoul, iolozo jsou zlilla mIzoino!
V Pyllonu jo novo lalo lo no v jazyco, aIo v lomunIl uzIvaloIu , zo so ohjovIIa IozIsl louu, jalo
jo Pythnn Puckugo Indox (PyPI}. Pyllon so uouv s ulIIIlamI l zahaIonI vasolo louu uo slanuaiunI-
lo Ioimlu a lylo haIIcly al molou hyl zvoiojnny na PyPI. O ouiohnoslocl so uoclolo v laIloIo
BaIonI yllonovslycl lnIlovon.
-1.1. anoh ,zoin iovo
Ka.
Ka.
21
0. Instalujeme Python
u. KaIloIa
Tempora mutantur nos et mutamur in illis.
(Casy so mnI a my so mnImo s nImI.)
iIsIovI zo slaiolo RIma
22
Ohsal laIloIy
0. Instalujeme Python 21
u.1. Ponoimo so 23
u.2. Kloiy Pyllon jo io vs lon sivny 23
u.8. InslaIaco ou MIciosoIl WInuovs 24
u.4. InslaIaco ou Mac OS X 29
u.. InslaIaco ou Ihunlu LInux 36
u.6. InslaIaco na jInycl IalIoimcl 40
u.7. PouzIlI Pyllon SloII 41
u.8. LuIloiy a vyvojov iosliouI io Pyllon 43
23
u.1. Ponoimo so
Noz zacnomo iogiamoval v jazyco Pyllon 8, musImo sI joj naInslaIoval. Noho no
u.2. Kloiy Pyllon jo io vs lon sivny
Poluu ouzIvlo col na loslovanom soivoiu, molI hyl Pyllon 8 jIz naInslaIovn jolo sivcom.
Poluu iovozujolo LInux uoma, muzolo mIl Pyllon 8 jIz lalo l uIsozIcI. NojouIinjsI uIsliIhuco
syslomu GNIlLInux ohsalujI v zlIaunI InslaIacI Pyllon 2. MaI, aIo zvlsujIcI so sluIna uIsliIhucI
ohsalujo lalo Pyllon 8. Mac OS X so uouv s Pyllonom 2 (voizo sousln ios iIlazovy iuol),
aIo v uoh sanI lolo lnIly noohsalovaI Pyllon 8. MIciosoIl WInuovs so nououv s zunou voizI
Pyllonu. AIo noioauojlo zouIaIslvI! NozvIsIo na lom, jaly ooiacnI syslom ouzIvlo, muzolo
Pyllon naInslaIoval na nloIIl lIIlnulI.
NojjounouussI zusoh ovionI sI, zua mlo l uIsozIcI Pyllon 8 na svom syslomu LInux noho Mac OS X,
zacIn lIm, zo so uoslanolo na iIlazovy iuol. JalmIIo so naclzIlo za vyzyvacIm iolzcom iIlazovo-
lo iulu, naIslo jounouuso python3 (vso maIymI Ismony, hoz mozoi), slIslnlo ENTER a uvIuIlo, co
so slano. Na svom uomcIm syslomu LInux uz mm Pyllon 8.1 naInslaIovany. Ivouonym iIlazom
vslouIm uo y|honov:L6ho n|eruL|vnho :heu.
mark@atlantis:~$ python3
Python 3.1 (r31:73572, Jul 28 2009, 06:52:23)
[GCC 4.2.4 (Ubuntu 4.2.4-1ubuntu4)] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>>
(Az huuolo cllIl yllonovsly InloiallIvnI sloII ouslIl, naIslo exit() a slIslnlo ENTER.)
Muj oslylovaloI vohovolo iosloiu ouzIv lalo LInux a umozujo iIslu ios iIlazovy iuol,
aIo Pyllon 8 nonI na soivoiu naInslaIovn. (Boooo!)
mark@manganese:~$ python3
bash: python3: command not found
Talzo zl l olzco, lloiou jsmo lulo oulaIloIu zaljIII: ,Kloiy Pyllon jo io vs lon sivny
Ton, lloiy ohzI na ocIlacI, lloiy mlo l uIsozIcI.
> NsIouujo nvou io InslaIacI ou WInuovs, noho iosloclo na InslaIaco ou Mac OS X,
InslaIaco ou Ihunlu LInux noho InslaIaco na jInycl IalIoimcl.
u.1. Ponoimo so
u.2. Kloiy Pyllon jo io vs lon sivny
24
u.8. InslaIaco ou MIciosoIl WInuovs
V unosnI uoh so WInuovs uouvajI vo uvou aiclIlolluicl: 82hIlovo a 64hIlovo. Mmo lu samozioj-
m iauu iuznycl voizI WInuovs XP, VIsla, WInuovs 7 , aIo Pyllon hzI na vsocl. RozIIsonI mozI
82hIlovou a 64hIlovou aiclIlolluiou jo uuIozIljsI. Poluu nomlo vuhoc lusonI, jalou aiclIlolluiu
ouzIvlo, al jo lo iavuouohn 82hIlov.
Piojulo na slinlu python.org/download/ a sllnlo sI vInuovsovsly InslaIloi Pyllon 8, lloiy so
louI io vasI aiclIlolluiu. MoznoslI vasI voIhy huuou vyaual njal lallo:
- Pythnn 8.1 Windnws instullor (WInuovs hInaiy uoos nol IncIuuo souico)
- Pythnn 8.1 Windnws AMD4 instullor (WInuovs AMD64 hInaiy uoos nol IncIuuo souico)
NoclcI zuo uvul lonliolnI oulazy, iolozo Pyllon nouslIo ioclzI uiohnymI iavamI a noclcI
hyl zouovuny za lo, zo jslo njalou uuIozIlou iavu iosvIlII. Vzuy hyslo mII naInslaIoval co noj-
novjsI voizI Pyllonu 8.x, louy oluu nomlo njalo osoloiIclo uuvouy l lomu, ahyslo lal noucInIII.
JalmIIo so slalovnI uoloncI, olIoojlo na souhoi s iIonou .msi. Piolozo so snazIlo o suslnI
iogiamu, zohiazI WInuovs hozocnoslnI vaiovnI. OIIcIInI InslaIloi Pyllonu jo uIgIlIn ouosn
jmonom oiganIzaco Fy|hon 3o[|wure Foundu|on, lloi uolIIzI na vyvoj jazyla Pyllon. NoiIjImojlo
ImIlaco!
InslaIacI Pyllonu 8 zaljImo slIslnulIm lIacIlla Run.
NojuiIvo so vs InslaIloi zol, zua clcolo Pyllon 8 naInslaIoval io vsoclny uzIvaloIo, noho jon io
soho. VoIha ,InslaIoval io vsoclny uzIvaloIo jo iounaslavona. Poluu nomlo njaly uohiy uuvou
io jInou voIhu, al lolo jo la nojIosI. (Jouon mozny uuvou, ioc hyslo molII cllIl ,InslaIoval jon
io mno, jo lon, zo sI clcolo naInslaIoval Pyllon na ocIlacI v icI a vs col vo WInuovs nom
oivnnI aumInIsliloia. AIo ioc hyslo v lalovom iIau cllII InslaIoval Pyllon hoz svoIonI svolo
sivco WInuovs No ahyslo m uoslaII uo olIzI!)
u.8. InslaIaco ou MIciosoIl WInuovs
25
SvojI voIhu zusohu InslaIaco olviuIlo slIslom lIacIlla Next.
InslaIloi vs olo vyzvo l vyhiu InslaIacnIlo auiosio. Pio vsoclny voizo Pyllon 8.1.x jo iounasla-
vona lounola C:\Python31\, lloi hy mIa vylovoval vlsIn uzIvaloIu. Poluu ovsom nomlo zvIslnI
uuvou coslu zmnIl. Poluu InslaIujolo vsoclny aIIlaco na uIsl oznacony jInym Ismonom, muzolo
iIsIusnou coslu vyhial iIsIusnymI ovIuacImI ivly. Noho iosl coslu l auiosiI naIsolo uo sou-
nIlo oIo. Pyllon nomusIlo InslaIoval jon na uIsl C:. Muzolo sI joj naInslaIoval na IIhovoIny uIsl
a uo IIhovoInolo auiosio.
VoIhu cIIovolo auiosio olviuIlo slIslom lIacIlla Next.
u.8. InslaIaco ou MIciosoIl WInuovs
26
DaIsI uIaIogov slinla vyau lomIIlovan, aIo vo slulocnoslI nonI. V iIau Pyllonu 8 mlo moz-
nosl noInslaIoval In vsoclny jolo lomononly ouohn jalo u jInycl InslaIacnIcl iogiamu.
Poluu mlo ohzvIsl mIo mIsla na uIslu, muzolo nlloio lomononly vynoclal.
- VoIha Rogistor Fxtonsinns (asocIoval iIony) vm zajIslI moznosl sousll yllonovslo
sliIly (souhoiy s iIonou .py) olIonIm na jojIcl Ilonu. Jo lo sIco uooiucono, aIo nonI lo
nozhylno. (Talo voIha novyzauujo zuny uIslovy iosloi, lalzo jojI olIaconI nonI vylouno.)
- Tcl/Tk jo giaIIcl lnIlovna, lloiou vyuzIv yllonovsly sloII. Ton huuomo ouzIval v coIo
lnIzo. VoImI uooiucujI, ahyslo lulo voIhu onoclaII zanulou.
- VoIha Dncumontutinn vouo l InslaIacI souhoiu s novuou, lloi ohsalujo mnolo z InIoimacI
uvouonycl na docs.python.org. Poluu mlo omozony iIslu l Inloinolu noho oluu ouzIv-
lo vylcono iIojonI, uooiucujI voIhu onoclal zanulou.
- VoIha Utility Scripts v soh zalinujo I InslaIacI sliIlu 2to3.py, o lloiom so huuomo ucIl v lolo
lnIzo ozujI. Poluu so clcolo naucIl ioIsovnI oxIslujIcIlo louu nasanolo io Pyllon 2
uo ouohy io Pyllon 8, al so zanulI lolo voIhy vyzauujo. Poluu nomlo zuno iogiamy
nasano io Pyllon 2, muzolo lulo voIhu vynoul.
- VoIha Tost Suito zajIslI InslaIacI sauy sliIlu, lloio so ouzIvajI io loslovnI IunlcnoslI Inloi-
iolu jazyla Pyllon. V lolo lnIzo jo nohuuomo ouzIval. A noouzIvaI jsom jo nIluy anI hlom
vyuly iogiamovnI v Pyllonu. VoIha jo zcoIa na vs.
Poluu sI nojslo jIslI, loIIl mlo mIsla na uIslu, lIIlnlo na lIacIllo Disk Usage. InslaIloi zohiazI
soznam Ismon vasIcl uIslu, zjIslI, loIIl mIsla jo na lazuom z nIcl, a vyocIl, loIIl mIsla na nIcl
zhuuo o InslaIacI.
u.8. InslaIaco ou MIciosoIl WInuovs
27
SlIslom lIacIlla OK so uoslanomo na uIaIogovou slinlu ,CuslomIzIng Pyllon.
Poluu so iozlounolo voIhu vynoclal, slIslnlo lIacIllo io iozhaIonI soznamu a vyhoilo ,LnlIio Ioaluio vIII
ho unavaIIahIo (coI csl huuo nouoslun). VynoclnIm Tosl SuIlo usoliIlo na uIslu lnycl 7uu8 lh.
Vyhi voIoh olviuIlo slIslom lIacIlla Next.
u.8. InslaIaco ou MIciosoIl WInuovs
28
InslaIloi naloIiujo vsoclny nozhylno souhoiy uo vmI vyhianolo auiosio. (Piohlno lo lal iyclIo,
zo jsom lo musoI zlusIl liIlil, noz so mI ouaiIIo zaclylIl ohizol lololo iocosu.)
SlIslom lIacIlla Finish uloncImo cInnosl InslaIloiu.
Vo vasom monu Start hy so mIa ohjovIl oIozla s nzvom Python 3.1. V nI so naclzI iogiam IDLE.
Vyhiom lolo oIozly suslIlo InloiallIvnI yllonovsly sloII. (Poznmla iolIaualoIo: Nluy lo
auloi oznacujo jalo ,giaIIcly InloiallIvnI sloII. Juo o ohuohu InloiallIvnIlo yllonovslolo sloI-
Iu, lloiy so souslI v lonzoIovom oln. Tonlolil aIo vyuzIv iosliouly giaIIclolo uzIvaloIslolo
u.8. I nslaIaco ou MIciosoIl WInuovs
29
iozlianI (GII) a v monu olna naIoznomo I oIozly io suslnI ouIloiu noho io suslnI IauIcIlo
iozImu. DaIo hy so iIcl, zo jo lo nslioj ,lomi In, aIo no zcoIa naioslo noouohny... lIasIclym
IDL (Inlogiovano vyvojovo iosliouI). Jonzo lo nonI sousliouno loIom ouIloiu, aIo sIs loIom sloIIu.
Jo lo iosl IDLL. No zlilla so na lo ouIvojlo a iozlounlo so samI, jal lomu huuolo iIlal.)
u.4. InslaIaco ou Mac OS X
Vsoclny mouoinI ocIlaco MacInlosl ouzIvajI iocosoi IIimy InloI (slojny jalo vlsIna osohnIcl
ocIlacu s WInuovs). SlaisI ocIlaco Mac ouzIvajI iocosoiy PovoiPC. RozuIIum iozuml nomusIlo,
iolozo oxIslujo jon jouon jouIny InslaIloi Pyllonu io vsoclny ocIlaco MacInlosl.
Piojulo na slinlu python.org/download/ a sllnlo sI iIsIusny InslaIloi io Mac. Buuo u nj
nasno nco vo slyIu Pythnn 8.1 Muc Instullor Disk Imugo, acloIIv cIsIo voizo so muzo IIsIl. IjIsllo
so, zo slalujolo voizI 8.x a no 2.x.
Vs iolIIzoc hy mI aulomalIcly iIojIl ohiaz uIslu a oloviIl olno IInuoi zohiazujIcI jolo ohsal.
(Poluu so lal noslano, huuolo musol najIl ohiaz uIslu vo svom auiosiI io slazono souhoiy a iIojIl
joj olIonIm. Jmonujo so python-3.1.dmg noho ouohn.) Ohiaz uIslu ohsalujo iauu loxlovycl sou-
hoiu (Build.txt, License.txt, ReadMe.txt) a lalo slulocny InslaIacnI haIIl Python.mpkg.
u.4. InslaIaco ou Mac OS X
30
PolIoojlo na Python.mpkg a InslaIloi Mac Pyllon so suslI.
Na ivnI slinco naIoznolo sliucny oIs jazyla Pyllon a io vIco uolaIIu jslo oulznI na souhoi
ReadMe.txt. (...lloiy jslo nocolII. Noho colII)
DI so osunomo slIslom lIacIlla Continue.
NsIouujIcI slinla uIaIogu ohsalujo nlloio uuIozIlo InIoimaco: Pyllon vyzauujo Mac OS X 1u.8 noho
novjsI. Poluu slIo ouzIvlo Mac OS X 1u.2, huuolo joj musol alluaIIzoval na vyssI voizI. SoIocnosl
AIo uz io vs ooiacnI syslom nooslylujo hozocnoslnI alluaIIzaco a uz iI oulom iIojonI na
Inloinol vyslavujolo svuj ocIlac iIzIlu. A navIc nomuzolo ouzIval Pyllon 8.
u.4. InslaIaco ou Mac OS X
31
Poliacujomo slIslom lIacIlla Continue.
Tal jalo vsoclny uohio InslaIloiy, I lon yllonovsly zohiazI IIconcnI ujounnI. Pyllon jo oon souico
a jolo IIconco jo sclvIona soIocnoslI Oon Souico InIlIalIvo. Blom lIsloiIclolo vyvojo mI Pyllon
iauu vIaslnIlu a sonzoiu. Kazuy z nIcl zanoclaI v jolo IIconcI svuj olIsl. AIo lonocny vysIouol
vyau lallo: Pyllon jo oon souico, muzolo joj ouzIval na IIhovoIno IalIoim, io IIhovoIny coI,
zuaima a hoz zvazlu l iolIsIuzh.
SlIslnlo lIacIllo Continue josl jounou.
u.4. InslaIaco ou Mac OS X
32
Ahyslo molII InslaIacI uoloncIl, musIlo lvuII manyium v juiu aIovslolo InslaIloiu iojovIl
,soulIas so soIlvaiovou IIconcI. AIo iolozo Pyllon jo oon souico, vo slulocnoslI ,soulIasIlo
s lIm, zo vm IIconco zaiucujo iva navIc, noz ahy vs omozovaIa.
Poliacujomo slIslom lIacIlla Agree.
Na uaIsI ohiazovco muzolo zmnIl umIslnI InslaIaco. Pyllon musIlo InslaIoval na zavucI uIsl,
aIo lvuII omozonIm InslaIloiu lo nonI vynucono. Poiavu iocono, nIluy jsom noocIlovaI oliohu
umIslnI InslaIaco mnIl.
Na lolo ohiazovco lalo muzolo InslaIacI uiavIl vyIouconIm lomononl, lloio nooliohujolo. Poluu
lal clcolo ucInIl, slIslnlo lIacIllo Customize. V oacnom iIau slIslnlo lIacIllo Install.
u.4. InslaIaco ou Mac OS X
33
Poluu zvoIIlo uzIvaloIslou iavu InslaIaco (Custom Install), nahIuno vm InslaIloi nsIouujIcI
soznam:
- Pythnn Frumownrk. Juo o juio Pyllonu. Piolo jo lalo moznosl iouvoIona a soucasn
jo zalzno jI mnIl. Talo csl so naInslaIoval musI.
- GUI Applicutinns v soh zalinujo IDLE, coz jo giaIIcly yllonovsly sloII. Buuomo joj
ouzIval hlom coIo lnIly. VoImI uooiucujI, ahyslo lulo voIhu onoclaII zanulou.
- UNIX cnmmund-lino tnnls v soh ohsalujo lonzoIovou aIIlacI python3. VoImI uooiucujI,
ahyslo lalo lulo voIhu onoclaII zanulou.
- Pythnn Dncumontutinn ohsalujo mnolo z InIoimacI uvouonycl na docs.python.org. Poluu
mlo omozony iIslu l Inloinolu noho oluu ouzIvlo vylcono iIojonI, uooiucujI voIhu
onoclal zanulou.
- Sholl prnfilo updutor lonlioIujo, zua jo nulno alluaIIzoval vs sloIIovsly ioIII (ouzIly
v Terminal.app) lal, ahy hyIo zajIslno, zo umIslnI InslaIovano voizo Pyllonu huuo soucslI
iolIouvanycl cosl. Tulo voIhu iavuouohn nohuuolo oliohoval mnIl.
- VoIhu Fix systom Pythnn hyslo mnIl nomII. (RIl vasomu ocIlacI, ahy hyI Pyllon 8 ouzIl
jalo ioIoiovany Pyllon io souslnI vsocl sliIlu, vcoln zahuuovanycl sliIlu uouva-
nycl IIimou AIo. DoauIo hy lo voImI saln, iolozo vlsIna lcllo sliIlu hyIa nasna
io Pyllon 2 a ou voizI Pyllon 8 hy nohzoIy sivn.)
Poliacujomo slIslom lIacIlla Install.
InslaIloi so vs zol na losIo sivco, iolozo syslomovo hIninI souhoiy a nsliojo so InslaIujI
uo auiosio /usr/local/bin/. Boz aumInIsliloislycl oivnnI Mac Pyllon zlilla nonaInslaIujolo.
u.4. InslaIaco ou Mac OS X
34
SlIslom lIacIlla OK zaljImo InslaIacI.
Blom InslaIaco cslI, lloio jslo sI vyhiaII, InslaIloi InuIlujo oslu InslaIaco.
Poluu sIo vsoclno uohio, oznmI vm InslaIloi ssno uolonconI InslaIaco zohiazonIm
zoIono ,IajIly.
u.4. InslaIaco ou Mac OS X
35
SlIslom lIacIlla Close cInnosl InslaIloiu uloncImo.
Za iouolIauu, zo jslo nozmnIII umIslnI InslaIaco, najuolo nov naInslaIovano souhoiy v ou-
auiosiI Python 3.1 uvnIli auiosio /Applications. NojuuIozIljsI soucslI jo zuo giaIIcly
yllonovsly sloII zvany IuIo.
PolIoojlo na nj a yllonovsly sloII so suslI.
u.4. InslaIaco ou Mac OS X
36
V yllonovslom sloIIu slivIlo iI iuzlumu jazyla Pyllon nojvIco casu. I iIlIauu huuomo v lolo
lnIzo iouolIual, zo so l yllonovslomu sloIIu umIlo uoslal.
u.. InslaIaco ou Ihunlu LInux
MouoinI uIsliIhuco syslomu LInux jsou ouoiony oliomnymI IozIslI ioulomIIovanycl aIIlacI,
lloio jsou iIiavony l olamzIlo InslaIacI. DolaIIy so io lonliolnI uIsliIhuco IIsI. NojsnaunjsI
zusoh InslaIaco Pyllonu 8 ou Ihunlu LInux socIv v ouzIlI nsliojo Add/Remove, lloiy najuolo
v monu Applications.
u.. InslaIaco ou Ihunlu LInux
37
Kuyz oivo suslIlo aIIlacI Add/Remove, zohiazI vm soznam iouvyhianycl aIIlacI v iuznycl lalogo-
iIIcl. Nlloio z nIcl jsou jIz naInslaIovano, aIo vlsIna z nIcl no. Piolozo IozIsl ohsalujo ios 1u lIsIc
aIIlacI, muzolo omocI iuznycl IIIliu omozIl zohiazonI jon na jolo maIo cslI. ZlIauom jo IIIli
,CanonIcaI-maInlaInou aIIcalIons, coz jo maI oumnozIna z coIlovolo mnozslvI aIIlacI, lloio
jsou oIIcIIn ouoiovny soIocnoslI CanonIcaI, lloi vylvoiIIa a uuizujo uIsliIhucI Ihunlu LInux.
Pyllon 8 nonI soIocnoslI CanonIcaI uuizovn, lalzo jalo ivnI liol olIacImo cInnosl lololo IIIliu
a vyhoiomo ,AII Oon Souico aIIcalIons (vsoclny oon souico aIIlaco).
JalmIIo zmnIlo naslavonI IIIliu lal, ahy zalinovaI vsoclny oon souico aIIlaco, ouzIjlo l vylIounI
Pythonu 3 vylIouvacI hox naclzojIcI so lnou za nahIulou IIIliu.
u.. InslaIaco ou Ihunlu LInux
38
V lom olamzIlu so soznam aIIlacI zzI jon na ly, lloio souvIsojI s Pyllonom 8. Polo vyhoiomo uva
haIIcly. TIm ivnIm jo Python (v3.0). Ohsalujo vIaslnI Inloiiol jazyla Pyllon.
Diuly ozauovany haIIcol so naclzI hozioslioun nau nIm: IDLE (using Python-3.0). Juo o giaIIc-
ly yllonovsly sloII, lloiy huuomo ouzIval hlom coIo lnIly.
Po oznaconI uvouonycl uvou haIIclu oliacujlo slIslom lIacIlla Apply Changes.
u.. InslaIaco ou Ihunlu LInux
39
Sivco haIIclu vs ozu o olvizonI, zo clcolo iIual jal IDLE (using Python-3.0), lal Python (v3.0).
Poliacujomo slIslom lIacIlla Apply.
Blom slalovnI oliohnycl haIIclu z Inloinolovolo IozIsl soIocnoslI CanonIcaI zohiazujo sivco
haIIclu InuIlloi osluu slalovnI.
JalmIIo jsou haIIcly slazony, zaljI sivco haIIclu aulomalIcly jojIcl InslaIacI.
Poluu sIo vsoclno uohio, olviuI sivco haIIclu, zo hyIy oha ssn naInslaIovny. V lomlo olamzI-
lu muzolo olIonIm na IDLE suslIl yllonovsly sloII, noho muzolo slIslom lIacIlla Close uloncIl
cInnosl sivco haIIclu.
Pyllonovsly sloII muzolo suslIl luyloIIv lIm zusohom, zo v monu Applications a v oumonu
Programming vyhoiolo IDLE.
u.. InslaIaco ou Ihunlu LInux
40
V yllonovslom sloIIu slivIlo iI iuzlumu jazyla Pyllon nojvIco casu. I iIlIauu huuomo v lolo
lnIzo iouolIual, zo so l yllonovslomu sloIIu umIlo uoslal.
u.6. InslaIaco na jInycl IalIoimcl
Pyllon 8 jo uosluny io iauu iuznycl IalIoiom. Ahyclom hyII lonliolnjsI, jo uosluny io iallIc-
ly lazuou uIsliIhucI syslomu LInux, BSD a io uIsliIhuco zaIozono na syslomu SoIaiIs. Talzo naiIlIau
RouHal LInux ouzIv sivco haIIclu yum. IiooBSD m svou shIilu oils anu aclagos coIIoclIon, SUSE
m zypper a SoIaiIs m pkgadd. Kuyz zlusIlo zhzn iolIoual voh iI zaunI Python 3 + v0: oerutn
:y:|6m, uozvIlo so, zua jo haIIl s Pyllonom 8 uosluny, a oluu ano, jal joj muzolo naInslaIoval.
u.6. InslaIaco na jInycl IalIoimcl
41
u.7. PouzIlI Pyllon SloII
Pyllon SloII (lvuII slIoovnI a zohocnnI olIouu mu huuomo iIlal lalo y|honov:Ly :he) huuo
nsliojom io sluuIum synlaxo jazyla Pyllon, zuiojom InloiallIvnI novuy l iIlazum a iosliou-
lom io IaunI lillycl iogiamu. GiaIIcly yllonovsly sloII (ojmonovany IDLE) ohsalujo navIc
uclzojIcI loxlovy ouIloi, lloiy ouoiujo haiovno zvyiazovnI synlaxo a zajIslujo soIuicI
s (lonzoIovym) yllonovslym sloIIom. Poluu jIz nomlo njaly svuj ohIIhony loxlovy ouIloi, mII
hyslo sI IDLE vyzlousol.
AIo iohoimo nojuiIvo lIavnI vcI. Samolny Pyllon SloII jo zasno InloiallIvnI iosliouI, so lloiym sI
vyliajolo. V coIo lnIzo so huuolo sollval s iIlIauy, jalo jo lonlo:
>>> 1 + 1
2
TiI lIovo zvoily (>>>) jsou vyzyvacIm iolzcom yllonovslolo sloIIu. Tulo csl nooIsujlo. Vyjau-
iujI lIm lo, zo hyslo sI iIlIau mII vyzlousol v yllonovslom sloIIu.
Vy huuolo sl ouzo csl 1 + 1. V yllonovslom sloIIu muzolo nasal jalyloIIv Ialny yllonovsly
vyiaz noho iIlaz. Noslyulo so! Nolousno vs lo! PiInojloisIm so slano lo, zo so vm zohiazI clyhovo
lIsonI. PiIlazy so iovujI olamzIl (jalmIIo slIslnolo ENTER). Talo vyiazy jsou vylounocony ola-
mzIl a yllonovsly sloII vylIslno jojIcl vysIouol.
Talzo zohiazon csl 2 jo vysIoulom vylounoconI iouclozIlo vyiazu. Piolozo so lal slaIo, jo 1 + 1
zjovn Ialnym yllonovslym vyiazom. Jolo vysIouol jo samoziojm 2.
Vyzlousojmo nco uaIsIlo.
>>> print('Hello world!')
Hello world!
DocoIa jounouuclo, zo AIo v yllonovslom sloIIu lolo muzolo uIal mnolom vIc. Kuyz so nluy za-
uilnolo luyz sI nomuzolo vzomonoul na njaly iIlaz noho sI nomuzolo vzomonoul na sivno
aigumonly iouvano njalo IunlcI , muzolo so v yllonovslom sloIIu uoslal l InloiallIvnI nov-
u. NaIslo iosl help a slIslnlo ENTER.
>>> help
Type help() for interactive help, or help(object) for help about object.
Novuu muzomo ouzIval vo uvou iozImocl. Muzomo zIslal novuu io jouon ohjoll. VylIslno so
iosl jolo uolumonlaco a vilIlo so na vyzyvacI iuol yllonovslolo sloIIu. Noho muzomo vslouIl
uo re2mu n0ov6dy, vo lloiom mIslo vylounocovnI yllonovslycl vyiazu Isomo lIIcov sIova noho
jmona iIlazu a Pyllon zohiazujo vso, co o lcllo iIlazocl vI.
u.7. PouzIlI Pyllon SloII
42
Pio vslu uo InloiallIvnIlo iozImu novuy naIslo help() a slIslnlo ENTER.
>>> help()
Welcome to Python 3.0! This is the online help utility.
If this is your first time using Python, you should definitely check out
the tutorial on the Internet at http://docs.python.org/tutorial/.
Enter the name of any module, keyword, or topic to get help on writing
Python programs and using Python modules. To quit this help utility and
return to the interpreter, just type "quit".
To get a list of available modules, keywords, or topics, type "modules",
"keywords", or "topics". Each module also comes with a one-line summary
of what it does; to list the modules whose summaries contain a given word
such as "spam", type "modules spam".
help>
VsImnlo sI, zo so vyzyvacI iolzoc zmnII z >>> na help>. M vm lo iIomonoul, zo so naclzIlo
v InloiallIvnIm iozImu novuy. V lomlo olamzIlu muzolo nasal IIhovoIno lIIcovo sIovo, iIlaz,
jmono mouuIu, jmono Iunlco v ouslal coloIIv, comu Pyllon iozumI a ioclolo sI l lomu zoh-
iazonou uolumonlacI.
help> print }1]
Help on built-in function print in module builtins:
print(...)
print(value, ..., sep=' ', end='\n', file=sys.stdout)

Prints the values to a stream, or to sys.stdout by default.
Optional keyword arguments:
file: a file-like object (stream); defaults to the current sys.stdout.
sep: string inserted between values, default a space.
end: string appended after the last value, default a newline.
help> PapayaWhip }2]
no Python documentation found for 'PapayaWhip'
help> quit }8]
You are now leaving help and returning to the Python interpreter.
If you want to ask for help on a particular object directly from the
u.7. PouzIlI Pyllon SloII
43
interpreter, you can type "help(object)". Executing "help('string')"
has the same effect as typing a particular string at the help> prompt.
>>> }4]
}1] Ahyslo uoslaII uolumonlacI l IunlcI print(), naIslo iInl a slIslnlo ENTER. V InloiallIvnIm
iozImu novuy so zohiazI nco ouohnolo jalo manovsl slinla: jmono Iunlco, sliucny
oIs, aigumonly Iunlco a jojIcl iounaslavono lounoly a lal uIo. Poluu so vm zu ohsal
uolumonlaco nojasny, noioauojlo anIco. V nsIouujIcIcl nloIIla laIloIcl so o lcllo
vcocl uozvIlo vIco.
}2] V InloiallIvnIm iozImu novuy so samoziojm nouozvIlo vsoclno. Poluu zuo naIsolo nco,
co nonI yllonovslym iIlazom, mouuIom, IunlcI noho njalym zahuuovanym lIIcovym
sIovom, iozIm InloiallIvnI novuy iosl olicI svymI vIiluInImI iamony.
}8] InloiallIvnI iozIm novuy uloncIlo lIm, zo naIsolo quit a slIslnolo ENTER.
}4] VyzyvacI iuol so zmnI zl na >>>, cImz so uozvIlo, zo jslo ouslIII iozIm InloiallIvnI no-
vuy a vilIII jslo so uo yllonovslolo sloIIu.
GiaIIcly yllonovsly sloII IDLE navIc ohsalujo loxlovy ouIloi sIly na mIiu jazylu Pyllon.
u.8. LuIloiy a vyvojov iosliouI io Pyllon
Poluu juo o sanI iogiamu v jazyco Pyllon, noiouslavujo IuIo jouInou moznosl. JalloIIv muzo hyl
uzIlocny iI soznamovnI so s jazylom jalo lalovym, mnozI vyvojiI uvajI iounosl jInym loxlovym
ouIloium noho Inlogiovanym vyvojovym iosliouIm (Inlogialou DovoIomonl LnvIionmonl, cIII IDE).
Nohuuu so zuo jImI zahyval, aIo lomunIla uzIvaloIu jazyla Pyllon uuizujo soznam ouIloiu ouoiujI-
cIcl jazyl Pyllon, lloiy oliyv sIiolo iozlI ouoiovanycl IalIoiom a soIlvaiovycl IIconcI.
Mozn clcolo nalIounoul I uo soznamu Iuo ouoiujIcIcl jazyl Pyllon, I luyz zalIm ouzo nomnolo
z nIcl ouoiujI Pyllon 8. JounIm z lcl, lloio joj ouoiujI, jo PyDov, zsuvny mouuI io LcIIso,
lloiy zmnI LcIIso na Inolounolno yllonovslo Inlogiovano vyvojovo iosliouI. Jal LcIIso, lal
PyDov jsou muIlIIalIoimnI a oon souico.
Z lomoicnIcl iouullu jmonujmo Komouo IDE soIocnoslI AclIvoSlalo. LIconco jo vzna na uzIvalo-
Io. SluuonlI molou zIslal sIovu a l uIsozIcI jo I zlusohnI, casov omozon voizo.
V jazyco Pyllon iogiamujI uz uovl Iol. Svo iogiamy ouIlujI v iosliouI GNI Lmacs a IauIm jo v
lonzoIovom yllonovslom sloIIu. PiI vyvojI v jazyco Pyllon nonI zun cosla sivnjsI noho vyIozo-
n saln. Najulo sI zusoh, lloiy vylovujo iv vm!
u.8. LuIloiy a vyvojov iosliouI io Pyllon
44
45
1. V prvn pythonovsk program
1. KaIloIa
Dont bury your burden in saintly silence.
You have a problem? Great. Rejoice,
dive in, and investigate.
(Nouljlo svo hiIm vo svalom mIconI.
Mlo iohIom Paiua. Rauujlo so,
onoilo so uo nj, huojlo.)
Von. HonooIa Gunaialana
46
Ohsal laIloIy
1. V prvn pythonovsk program 45
1.1. Ponoimo so 47
1.2. DolIaiaco IunlcI 48
1.2.1. NoovInno a ojmonovano aigumonly 49
1.8. PsanI cIloInolo louu 51
1.8.1. DolumonlacnI iolzco 51
1.4. VylIouvacI cosla io import 52
1.. Vsoclno jo ohjoll 53
1..1. Co lo vIasln jo ohjoll 54
1.6. OusazovnI louu 54
1.7. VyjImly 55
1.7.1. OhsIula clyh Imoilu 57
1.8. VoIno iomnno 58
1.u. Vso jo cIlIIvo na voIIlosl Ismon 58
1.1u. SouslnI sliIlu 59
1.11. Piocllo sI 60
47
1.1. Ponoimo so
Konvonco nm uIllujo, zo hycl vs lou mI oliavoval zlIaunImI slavohnImI lamony, lloio s iogia-
movnIm souvIsojI. A z nIcl hyclom al mII omaIu huuoval nco uzIlocnolo. Pioslocmo lo. Tauy
mlo Iny a IunlcnI yllonovsly iogiam. Piavuouohn vm huuo zcoIa noocloIloIny. Zuno
sliacly. RozIlvmo lo iuol o iulu. AIo nojuiIvo sI joj coIy iocllo a zjIsllo, co z nj clolo
(oluu vuhoc nco).
SUFFIXES = {1000: ['KB', 'MB', 'GB', 'TB', 'PB', 'EB', 'ZB', 'YB'],
1024: ['KiB', 'MiB', 'GiB', 'TiB', 'PiB', 'EiB', 'ZiB', 'YiB']}
def approximate_size(size, a_kilobyte_is_1024_bytes=True):
'''Convert a file size to human-readable form.
Keyword arguments:
size -- file size in bytes
a_kilobyte_is_1024_bytes -- if True (default), use multiples of 1024
if False, use multiples of 1000
Returns: string
'''
if size < 0:
raise ValueError('number must be non-negative')
multiple = 1024 if a_kilobyte_is_1024_bytes else 1000
for suffix in SUFFIXES[multiple]:
size /= multiple
if size < multiple:
return '{0:.1f} {1}'.format(size, suffix)
raise ValueError('number too large')
if __name__ == '__main__':
print(approximate_size(1000000000000, False))
print(approximate_size(1000000000000))
Suslmo iogiam z iIlazovolo iulu. Pou WInuovs lo huuo vyaual njal lallo:
c:\home\diveintopython3\examples> c:\python31\python.exe humansize.py
1.0 TB
931.3 GiB
1.1. Ponoimo so
48
Pou Mac OS X noho ou LInuxom lo huuo vyaual zaso lallIo:
you@localhost:~/diveintopython3/examples$ python3 humansize.py
1.0 TB
931.3 GiB
Co so lo vIasln slaIo SuslIII jslo svuj ivnI yllonovsly iogiam. Z iIlazovolo iulu jslo zavoIaII
Inloiiol jazyla Pyllon a iouaII jslo mu jmono sliIlu, lloiy mI hyl iovouon. Ivouony sliIl
uoIInujo jouInou IunlcI, approximate_size(), lloi iohIi iosnou voIIlosl souhoiu v hajlocl
a vyocIl voIIlosl ,v lozcIm lvaiu (aIo iIhIIznou). (Piavuouohn uz jslo nco ouohnolo vIuII
v PiuzlumnIlu WInuovs, v oln IInuoi na Mac OS X noho v aIIlacIcl NaulIIus noho DoIlIn noho
Tlunai na LInuxu. Kuyz sI nocllo sIozlu s uolumonly zohiazIl v ouoh vIcosIoucovolo soznamu,
uvIuIlo v lahuIco Ilonu uolumonlu, jmono uolumonlu, voIIlosl, ly, ualum osIounI zmny a lal
uIo. Poluu sIozla ohsalujo souhoi so jmonom TODO a s voIIloslI 1uu8 hajlu, nozohiazI vs sivco
souhoiu TODO 1093 bytes. MIslo lolo so ulzo nco jalo TODO 1 KB. A iv lolIo uI Iunlco
approximate_size().)
PouIvojlo so na lonoc sliIlu a uvIuIlo uva iuly s voInIm print(approximate_size(argumenty)).
Juo o voInI IunlcI. NojuiIvo so voI Iunlco approximate_size() a iouvajI so jI aigumonly. JojI
nvialov lounola so iouv iImo IunlcI print(). Iunlco print() aliI mozI zahuuovano (huIIl-In).
JojI uolIaiacI nIluy nouvIuIlo. Muzolo jI aIo ouzIval luyloIIv a luoloIIv. (Zahuuovanycl IunlcI
oxIslujo coI iaua. A josl mnolom vIco so jIcl naclzI v iuznycl modueth. Jon lIIu...)
Talzo ioc vIasln suslnIm sliIlu z iIlazovolo iulu zIslmo olazuo slojny vyslu K lomu so
josl uoslanomo. NojuiIvo so ouIvmo na IunlcI approximate_size().
1.2. DolIaiaco IunlcI
Pyllon iacujo s IunlcomI ouohn jalo vlsIna uaIsIcl jazylu, aIo noouuIujo lIavIclovo souhoiy
jalo c++ noho solco rozhran/implementace jalo PascaI. Poluu oliohujolo njalou IunlcI, iosl jI
uolIaiujolo, jalo lioha zuo:
def approximate_size(size, a_kilobyte_is_1024_bytes=True):
DolIaiaco Iunlco zacIn lIIcovym sIovom def. NsIouujo jmono Iunlco a v zvoico al aigumonly.
VIco aigumonlu so ouuIujo cilamI.
VsImnlo sI, zo Iunlco nouoIInujo ly nvialovo louno-
ly. Iunlco v jazyco Pyllon nouicujI ualovy ly nvialovo
lounoly. NouicujI uolonco anI lo, joslII viacojI lounolu noho
no. (Vo slulocnoslI lazu yllonovsl Iunlco viacI lounolu.
Poluu Iunlco iovouo iIlaz return, vilI v nm uvouonou
Pokud potebujete njakou
funkci, prost ji deklarujte.
1.2. DolIaiaco IunlcI
49
lounolu. V oslalnIcl iIauocl viacI None, coz jo yllonovsly olvIvaIonl lounoly nuII, nII, nIc, zu-
n lounola.)
> V nlloiycl jazycIcl Iunlco (lloio viacojI lounolu) zacInajI sIovom function a ouiogiamy
(lloio noviacojI lounolu) zacInajI sIovom sub. Jazyl Pyllon zuno ouiogiamy nozn. Vso
jsou Iunlco, vsoclny Iunlco viacojI lounolu (I luyz nluy jo lo None) a vsoclny Iunlco zacIna-
jI sIovom def.
Iunlco approximate_size() iohIi uva aigumonly size a a_kilobyte_is_1024_bytes , aIo
u zunolo z nIcl nonI uicon ualovy ly. V jazyco Pyllon nomajI iomnno oxIIcIln uicon ly nIluy.
Pyllon zjIslI, jalolo lyu iomnn jo, a vnIlin sI lo ovIuujo.
> V jazyco Java a v uaIsIcl jazycIcl so slalIclymI ualovymI lyy musImo uicoval ualovy ly n-
vialovo lounoly Iunlco a lazuolo aigumonlu Iunlco. V jazyco Pyllon nIluy oxIIcIln nouicu-
jomo ualovy ly cololoIIv. Pyllon vnIlin sIouujo ualovy ly ouIo lolo, jalou lounolu jsmo
iIiauIII.
1.2.1. NoovInno a ojmonovano aigumonly
Pyllon umozujo naslavIl aigumonlum Iunlco ImIIcIlnI lounolu. Poluu IunlcI zavoImo hoz zaunI
aigumonlu, zIsl aigumonl svou ImIIcIlnI lounolu. Poluu ouzIjomo ojmonovano aigumonly, mu-
zomo jo navIc (iI voInI Iunlco) zaual v IIhovoInom oiauI.
Tou so na uolIaiacI Iunlco approximate_size() ouIvmo josl jounou:
def approximate_size(size, a_kilobyte_is_1024_bytes=True):
I uiulolo aigumonlu, a_kilobyte_is_1024_bytes, jo uvouona ImIIcIlnI lounola True. To znamon,
zo lonlo aigumonl jo neovnny. IunlcI muzomo zavoIal, anIz hyclom lo zauaII. Pyllon so huuo clo-
val, jalo luyhyclom iI voInI Iunlco zauaII na mIsl uiulolo aigumonlu lounolu True.
Tou so ouIvojlo na lonoc sliIlu:
if __name__ == '__main__':
print(approximate_size(1000000000000, False)) }1]
print(approximate_size(1000000000000)) }2]
}1] Zuo so Iunlco approximate_size() voI s uvma aigumonly. Piolozo jsmo uiulomu aigumonlu
oxIIcIln iouaII lounolu False, nahyv a_kilobyte_is_1024_bytes uvnIli Iunlco approxi-
mate_size() lounolu False.
1.2. DolIaiaco IunlcI
50
}2] Zuo so Iunlco approximate_size() voI ouzo s jounIm aigumonlom. AIo jo lo v oiulu,
iolozo uiuly aigumonl jo voIIloIny! A iolozo lo voIajIcI nouicII, nahyv uiuly aigumonl
ImIIcIlnI lounoly True iosn jal hyIo uicono v uolIaiacI Iunlco.
Hounolu aigumonlu muzomo uo Iunlco ioual lalo jalo ojmonovanou.
>>> from humansize import approximate_size
>>> approximate_size(4000, a_kilobyte_is_1024_bytes=False) }1]
'4.0 KB'
>>> approximate_size(size=4000, a_kilobyte_is_1024_bytes=False) }2]
'4.0 KB'
>>> approximate_size(a_kilobyte_is_1024_bytes=False, size=4000) }8]
'4.0 KB'
>>> approximate_size(a_kilobyte_is_1024_bytes=False, 4000) }4]
File "<stdin>", line 1
SyntaxError: non-keyword arg after keyword arg
>>> approximate_size(size=4000, False) }]
File "<stdin>", line 1
SyntaxError: non-keyword arg after keyword arg
}1] Zuo so Iunlco approximate_size() voI s lounolou ivnIlo aigumonlu 4000 (size) a s lou-
nolou False io ojmonovany aigumonl a_kilobyte_is_1024_bytes. (Slouou oloInoslI jo lo
uiuly aigumonl, aIo na lom nozIozI jal uvIuIlo o clvIII ozujI.)
}1] Zuo so Iunlco approximate_size() voI s lounolou 4000 io ojmonovany aigumonl size
a s lounolou False io ojmonovany aigumonl a_kilobyte_is_1024_bytes. (Pojmonovano
aigumonly jsou zuo slouou oloInoslI uvouony vo slojnom oiauI, v jalom jsou uvouony
v uolIaiacI Iunlco, aIo na lom iovnz nozIozI.)
}8] Zuo so Iunlco approximate_size() voI s lounolou False io ojmonovany aigumonl
a_kilobyte_is_1024_bytes a s lounolou 4000 io ojmonovany aigumonl size. (VIuIlo J
jsom vm iIlaI, zo na oiauI nozIozI.)
}4] Tolo voInI soIlaIo, iolozo jsmo ouzIII ojmonovany aigumonl a loivo o nm nsIouovaI
noojmonovany (ozIcnI) aigumonl. TolIo noIungujo nIluy. PiI clonI soznamu aigumonlu zIova
uoiava so o ouzIlI ivnIlo ojmonovanolo aigumonlu musI vsoclny nsIouujIcI aigumonly
uvosl lalo jalo ojmonovano.
}] Tolo voInI iovnz soIlv zo slojnolo uuvouu jalo iouclozI voInI. Jo lo lal iolvaIvo
Kuyz so lo lal vozmo, iouvmo lounolu 4000 io ojmonovany aigumonl size a jo ,ziojmo,
zo lounola False hyIa mysIona jalo lounola aigumonlu a_kilobyte_is_1024_bytes. AIo Py-
llon lImlo zusohom noIungujo. JalmIIo ouzIjomo ojmonovany aigumonl, vsoclny aigumon-
ly uvouono naiavo ou nj musI hyl lalo ojmonovano.
1.2. DolIaiaco IunlcI
51
1.8. PsanI cIloInolo louu
Nohuuu vs zuo nuuIl uIoulym iosIovom o uuIozIloslI uolumonlovnI vasolo louu. Jon sI uvuom-
lo, zo lou so Iso jounou, aIo clo so mnololil. A nojuuIozIljsIm cloniom vasolo zuiojovolo loxlu
huuolo vy samI sosl msIcu olo, co jslo joj nasaII (lo znamon olo, co uz jslo o nm vsoclno za-
omnII a mlo v nm nco oiavIl). V jazyco Pyllon so cIloIny lou Iso snauno, lalzo lolo vyuzIjlo.
Za sosl msIcu mI oulujolo.
1.8.1. DolumonlacnI iolzco
Pyllonovslou IunlcI muzolo zuolumonloval lIm, zo jI iIuIIlo uolumonlacnI iolzoc (zlicon
docstring). V nasom iogiamu jo u Iunlco approximate_size() uolumonlacnI iolzoc uvouon:
def approximate_size(size, a_kilobyte_is_1024_bytes=True):
'''Convert a file size to human-readable form.
Keyword arguments:
size -- file size in bytes
a_kilobyte_is_1024_bytes -- if True (default), use multiples of 1024
if False, use multiples of 1000
Returns: string
'''
TiI aoslioIy uvozujI vIcoiulovy iolzoc. Vso mozI ocloc-
nImI a loncovymI aoslioIy (noho uvozovlamI) so slv sou-
cslI jouInolo iolzco, vcoln loncu iulu, vounIcl hIIycl
znalu a jounouuclycl aoslioIu. VIcoiulovo iolzco muzolo
ouzIl luoloIIv, aIo nojcasljI so s nImI solllo iI zIsocl
uolumonlacnIcl iolzcu.
> PouzIlI zliojonycl aoslioIu iouslavujo iovnz jounouucly zusoh io zIs iolzcu, vo llo-
iycl so vyslylujI jal aoslioIy, lal uvozovly. ClovajI so jalo zIs qq/.../ v jazyco PoiI .
Vso, co so naclzI mozI zliojonymI aoslioIy, jo uolumonlacnI iolzoc, lloiy oIsujo, co Iunlco
uI. Poluu docstring oxIslujo, al lo musI hyl ivnI vc, lloi so v lIo Iunlco ohjovI. (To znamon,
zo musI hyl uvouon na iulu nsIouujIcIm za uolIaiacI Iunlco.) Z loclnIclolo olIouu nonI nulno
docstring IunlcI vuhoc iIuIoval, aIo iallIcly hyslo lo mII uuIal vzuy. J vIm, zo jslo o lom sIysoII
v lazuom luizu iogiamovnI, lloiy jslo navslvovaII. AIo u jazyla Pyllon mmo jouon molIvacnI
Ialloi navIc: docstring jo uosluny za hlu iogiamu v ouoh aliIhulu (vIaslnoslI) Iunlco.
Kad funkce si zaslou
decentn docstring.
1.8. PsanI cIloInolo louu
52
> Mnol yllonovsl Inlogiovan vyvojov iosliouI ouzIvajI docstring io coIy lonloxlov
cIlIIvo novuy. To znamon, zo o nasnI jmona Iunlco so jojI docstring zohiazI v ouoh lo-
oIlIu (lj. maIolo InIoimacnIlo olonla zohiazovanolo ohIIz uanolo mIsla). Muzo lo hyl voImI
uzIlocno, aIo huuo lo uohio jon lal, jal uohio naIsolo uolumonlacnI iolzco.
1.4. VylIouvacI cosla io import
Noz ujuomo uI, cllI hycl so sliucn zmInIl o vylIouvacI cosl io lnIlovny (IIhiaiy soaicl all).
Kuyz so olousIlo Imoiloval mouuI, lIou joj Pyllon na nloIIla mIslocl. PiosnjI iocono, lIou
joj vo vsocl auiosiIcl, lloio jsou uoIInovny iomnnou sys.all. Juo o hzny soznam a jolo ohsal
muzolo snauno zohiazIl noho mnIl iosliounIclvIm slanuaiunIcl molou soznamu. (O soznamocl so
uozvImo vIco v laIloIo PiIiozono ualovo lyy.)
>>> import sys }1]
>>> sys.path }2]
['',
'/usr/lib/python31.zip',
'/usr/lib/python3.1',
'/usr/lib/python3.1/plat-linux2@EXTRAMACHDEPPATH@',
'/usr/lib/python3.1/lib-dynload',
'/usr/lib/python3.1/dist-packages',
'/usr/local/lib/python3.1/dist-packages']
>>> sys }8]
<module 'sys' (built-in)>
>>> sys.path.insert(0, '/home/mark/diveintopython3/examples') }4]
>>> sys.path }]
['/home/mark/diveintopython3/examples',
'',
'/usr/lib/python31.zip',
'/usr/lib/python3.1',
'/usr/lib/python3.1/plat-linux2@EXTRAMACHDEPPATH@',
'/usr/lib/python3.1/lib-dynload',
'/usr/lib/python3.1/dist-packages',
'/usr/local/lib/python3.1/dist-packages']
}1] ImoilovnIm mouuIu sys ziIslunImo vsoclny jolo Iunlco a aliIhuly.
}2] sys.path jo soznam auiosiu, lloio lvoiI alluInI vylIouvacI coslu. (I vs lo huuo vyaual
jInal v zvIsIoslI na vasom ooiacnIm syslomu, na voizI Pyllonu, lloiy ouzIvlo, a na lom,
lam hyI naInslaIovn.) Poluu so olousIlo o Imoil, lIou Pyllon souhoi s uanym jmonom
a iIonou .py iv v lcllo auiosiIcl (v uvouonom oiauI).
}8] No, vo slulocnoslI jsom lioclu zaIlaI. Piavua jo o nco lomIIlovanjsI, iolozo no vsoclny
mouuIy jsou uIozony v ouoh souhoiu s iIonou .py. I nlloiycl juo o zuIudovun6 /Iu|-n)
1.4. VylIouvacI cosla io import
Ka.
53
mouuIy. Vo slulocnoslI jsou soucslI iogiamu Pyllon. Zahuuovano mouuIy so clovajI In
slojn jalo hzno mouuIy, aIo nonI l nIm l uIsozIcI yllonovsly zuiojovy lou, iolozo nojsou
nasny v jazyco Pyllon! Zahuuovano mouuIy jsou nasny v jazyco C, slojn jalo samolny
Pyllon.
}4] K yllonovslo vylIouvacI cosl muzolo za hlu iIual novy auiosi lIm, zo jolo jmono iIu-
lo uo sys.all. KuyloIIv so ou lolo olamzIlu olusIlo Imoiloval njaly mouuI, Pyllon huuo
iolIouval I lonlo auiosi. LIoll liv lal uIoulo, uoluu Pyllon hzI.
}] PouzIlIm iIlazu sys.path.insert(0, new_path) jsmo vIozIII novy auiosi jalo ivnI oIoz-
lu soznamu sys.path, coz znamon, zo so ocIlIa na zacllu yllonovslo vylIouvacI cosly.
VlsInou oliohujomo iv lolIo. V iIau lonIIIllu jmon (naiIlIau luyz so Pyllon uouv
s lonliolnI lnIlovnou voizo 2, aIo my clcomo ouzIl luloz lnIlovnu vo voizI 8) uvouonym
ohialom zajIslImo, zo nmI ozauovano mouuIy huuou naIozony uiIvo noz mouuIy uouano
s Pyllonom.
1.. Vsoclno jo ohjoll
Poluu vm lo nlouou unIlIo, iolII jsmo sI, zo yllonovslo Iunlco majI aliIhuly a lylo aliIhuly jsou
iIsluno za hlu iogiamu. Iunlco, slojn jalo vsoclno oslalnI v Pyllonu, jo ohjollom.
Suslmo InloiallIvnI yllonovsly sloII a vyzlousojmo sI:
>>> import humansize }1]
>>> print(humansize.approximate_size(4096, True)) }2]
4.0 KiB
>>> print(humansize.approximate_size.__doc__) }8]
Convert a file size to human-readable form.
Keyword arguments:
size -- file size in bytes
a_kilobyte_is_1024_bytes -- if True (default), use multiples of 1024
if False, use multiples of 1000
Returns: string
}1] Na ivnIm iulu Imoilujomo iogiam humansize jalo mouuI lus louu, lloiy muzomo
ouzIval InloiallIvn noho z vlsIlo yllonovslolo iogiamu. JalmIIo jo Imoil mouuIu io-
vouon, muzomo so oulazoval na jolo voiojno Iunlco, liIuy noho aliIhuly. MouuIy molou uIal
loloz, cImz sI ziIsluujI Iunlcnosl z jInycl mouuIu. A my lo muzomo uuIal v InloiallIvnIm
yllonovslom sloIIu lalo. Talo loncoco jo uuIozIl a v lnIzo so s nI ollmo josl mnololil.
}2] Poluu clcomo ouzIl Iunlco uoIInovano v Imoilovanycl mouuIocl, musImo uvosl I jmono mo-
uuIu. Talzo noslacI nasal jon approximate_size. MusImo uvosl humansize.approximate_size.
Poluu jslo ouzIvaII liIuy v jazyco Java, mIo hy vm lo nco iIomInal.
1.. Vsoclno jo ohjoll
54
}8] Zuo so mIslo ocolvanolo voInI Iunlco lmo na jouon z jojIcl aliIhulu, lloiy jo
nazvn __doc__.
> Pyllonovsly iIlaz import so ouoh iIlazu require v jazyco PoiI. JalmIIo iovouomo
import yllonovslolo mouuIu, vyjauiujomo iIslu l jolo IunlcIm zIsom modul.funkce.
JalmIIo v jazyco PoiI iovouomo iIlaz require, uoslanomo so na jolo Iunlco zIsom
modul::funkce.
1..1. Co lo vIasln jo ohjoll
V Pyllonu jo ohjollom vsoclno. A vso muzo mIl aliIhuly a molouy. Vsoclny Iunlco majI zahuuovany
aliIhul __doc__, lloiy viacI uolumonlacnI iolzoc Iunlco uoIInovany vo zuiojovom souhoiu. MouuI
sys jo ohjoll, lloiy (mImo jIno) m aliIhul zvany path. A lal uIo.
TIm aIo slIo noouovIumo na zlIaunjsI olzlu: Co jo lo vIasln ohjoll Ruzno iogiamovacI jazyly
uoIInujI ,ohjoll iuznym zusohom. V nlloiycl jazycIcl lo znamon, zo v:ethny ohjolly mu: mIl
aliIhuly a molouy. V jInycl jazycIcl lo znamon, zo vsoclny ohjolly Izo iozuIIl uo liIu. Jazyl Pyllon
uoIInujo ohjoll voInjI. Nlloio ohjolly nomusI mIl anI aliIhuly anI molouy, ue mohou je m|. No vsocl-
ny ohjolly majI svou liIuu. AIo vso jo ohjollom v lom smysIu, zo lo muzo hyl iIiazono uo iomnno
noho iouno jalo aigumonl Iunlco.
V jInycl souvIsIoslocl s iogiamovnIm jslo uz mozn sIysoII ojom ,ivoliIunI ohjoll (,IIisl-cIass
ohjocl). KvuII IosI siozumIloInoslI mu iIlojmo (oIsom) nohodno|ny oIjeL|. V jazyco Pyllon jo
nohodno|nym oIjeL|em I Iunlco. IunlcI muzomo ioual jalo aigumonl jIno IunlcI. MouuIy jsou
iovnz nohodno|nym oIjeL|y. IunlcI muzomo ioual jalo aigumonl coIy mouuI. TiIuy jsou lalo
Inolounolno ohjolly a jounolIIvo Inslanco liIuy jsou iovnz InolounolnymI ohjolly.
To jo voImI uuIozIlo, lalzo io iIau, zo hy vm lo na zacllu ilil ulolIo, zoalujI znovu: V juzyte
Fy|hon je v:ethno oIjeL|em. Rolzco jsou ohjolly. Soznamy jsou ohjolly. Iunlco jsou ohjolly. TiIuy jsou
ohjolly. Inslanco liIu jsou ohjolly. Dolonco mouuIy jsou ohjolly.
1.6. OusazovnI louu
V jazyco Pyllon so io oznacovnI mIsl, luo lou Iunlco zacIn a luo loncI, noouzIvajI sIova begin
a end a anI zuno sIozono zvoily. JouInym ouuIovacom lIa jo uvojlocla (:) a ousazonI louu.
def approximate_size(size, a_kilobyte_is_1024_bytes=True): }1]
if size < 0: }2]
raise ValueError('number must be non-negative') }8]
}4]
1.6. OusazovnI louu
55
multiple = 1024 if a_kilobyte_is_1024_bytes else 1000
for suffix in SUFFIXES[multiple]: }]
size /= multiple
if size < multiple:
return '{0:.1f} {1}'.format(size, suffix)
raise ValueError('number too large')
}1] BIoly louu (hIoly zuiojovolo loxlu) jsou uicony jojIcl ousazonIm. ,BIolom louu zuo io-
zumIm voInI IunlcI, iIlazy if, cylIy for, cylIy while a uaIsI. BIol jo zaljon ousazonIm
(ousloconIm iulu viavo) a loncI iousazonIm (ousloconIm nsIouujIcIlo iulu vIovo).
Nonajuomo zuo zuno oxIIcIlnI zvoily noho lIIcov sIova. To aIo znamon, zo ouzIvnI
hIIycl znalu m svuj vyznam a zo jo musImo uzIval uusIoun. V lomlo iIlIauu jo lou Iunlco
ousazon o clyiI mozoiy. NomusI lo hyl ziovna clyiI mozoiy, aIo musImo ouzIl slojno ousazonI.
PivnI iuol, lloiy nonI ousazony, oznacujo lonoc Iunlco.
}2] V Pyllonu za iIlazom if nsIouujo hIol louu. Poluu vyiaz za if nahyv lounoly true,
iovouo so nsIouujIcI ousazony hIol. V oacnom iIau so iovouo hIol za else (oluu jo
uvouon). PovsImnlo sI, zo loIom vyiazu clyhI zvoily.
}8] Tonlo iuol so naclzI v hIolu louu, lloiy jo uvnIli iIlazu if. PiIlaz raise vyvoI vyjImlu
(lyu ValueError), aIo jon v iIau, luy IalI size < 0.
}4] Zuo josl nonI lonoc Iunlco. ZcoIa izuno iuly so noocIlajI. DIly nIm muzo hyl lou cIloI-
njsI, aIo noovazujI so za ouuIovaco hIolu louu. Na uaIsIm iulu Iunlco oliacujo.
}] Rovnz iIlaz cylIu for zalajujo hIol louu. BIoly louu so molou slIual z mnola iulu, aIo
vsoclny musI hyl ousazony slojn. Tonlo cylIus for m hIol s liomI iuly louu. Pio vIcoiulo-
vo hIoly louu so noouzIv zun jIn zvIslnI synlaxo. Piosl ousauImo a jouomo uI.
Po oclocnIcl ioloslocl a sailaslIclycl iIiovnnIcl l Ioilianu sI na lo zvylnolo a zjIslIlo, jalo
lo m vylouy. Jouna z nojvlsIcl vylou socIv v lom, zo vsoclny yllonovslo iogiamy vyauajI
ouohn, iolozo ousazovnI jo vynucono samolnym jazylom a nonI jon vcI slyIu. Pyllonovsly lou
nasany nlym jInym so iolo snaunjI clo a jo siozumIloInjsI.
> Pyllon ouzIv l ouuIovnI iIlazu lonoc iulu. OuuIonI hIolu louu so vyjauiujo uvoj-
loclou a ousazonIm. Jazyly c++ a Java ouzIvajI l ouuIovnI iIlazu sliounIl a l ouuIovnI
hIolu louu sIozono zvoily.
1.7. VyjImly
V jazyco Pyllon najuolo vyjImly vsuuo. PouzIv jo iallIcly lazuy mouuI slanuaiunI yllonovslo
lnIlovny a samolny Pyllon jo vyvoIv iI mnola iuznycl oloInoslocl. V coIo lolo lnIzo so s nImI
huuolo oalovan sollval.
1.7. VyjImly
56
Co lo vIasln jo vyjImla OhvylIo juo o iojov njalo clyhy. Vyjauiujo, zo nco nouoauIo uohio. (No
vsoclny vyjImly jsou vyjuionIm clyhy. AIo v lomlo olamzIlu na lom nozIozI.) V nlloiycl io-
giamovacIcl jazycIcl jsmo vouonI l ouzIvnI nvialovycl clyhovycl louu, lloio al Lon|roujeme.
Pyllon ns vouo l ouzIvnI vyjImol, lloio al oI:uhujeme.
Kuyz so v yllonovslom sloIIu ohjovI clyha, vyIso njalo ouiohnoslI o vyjImco a jal l nI uosIo. A lo
jo iv ono. RIlmo lomu neoI:ou2en0 vyjImla. V olamzIlu vyvoInI vyjImly so v oloII nonaclzoI
zuny lou, lloiy hy sI lolo vsImaI a lloiy hy so jI zahyvaI. Talzo vyjImla iohuhIaIa zl az uo loinIcl
iovnI yllonovslolo sloIIu. Ton vyIIvnuI njalo IauIcI InIoimaco a ovazovaI lo za vyiosono. Poluu
so lo slano iI icI v sloIIu, nonI lo zun olioma. AIo oluu hy so lo slaIo u vasolo slulocnolo
yllonovslolo iogiamu, al hy za iouolIauu, zo vyjImlu nIc noohsIouzIIo, uosIo lo sliIavomu
zaslavonI jolo hlu. Mozn hy vm lo vylovovaIo, mozn no.
> V Pyllonu nomusI Iunlco uolIaioval, jalo vyjImly molou vyvoIal na iozuII ou jazyla Java.
RozlounulI o lom, jalo mozno vyjImly oliohujolo ouclylval, zIozI zcoIa na vs.
AIo vyjImla nomusI vosl l Inomu liaclu iogiamu. VyjImly molou hyl oI:ou2eny. Nluy jo vyjImla
oiavuu uusIoulom clyhy vo vasom iogiamu (luyz so naiIlIau olousIlo ouzIl iomnnou, lloi
nooxIslujo), aIo nluy jo vyjImla vysIoulom ncolo, co so uaIo iouvIual. Kuyz olvIilo souhoi, nomu-
sI lioha oxIsloval. Kuyz Imoilujolo mouuI, nomusoI hyl naInslaIovn. Kuyz so iIojujolo l ualahzI,
muzo hyl nouoslun noho l nI nomuzolo iIsluoval lvuII nouoslalocnym hozocnoslnIm oivnnIm.
Poluu vIlo, zo na njalom iulu muzo vznIlnoul vyjImla, mII hyslo jI ohsIouzIl omocI lonsliulco
try...except.
> Pyllon ouzIv hIoly try...except l ohsIuzo vyjImol. PiIlaz raise ouzIv l jojIcl gonoio-
vnI. Jazyly Java a c++ ouzIvajI l ohsIouzonI vyjImol hIoly try...catch. K jojIcl gonoiovnI
ouzIvajI iIlaz throw.
Iunlco approximate_size() vyvoIv vyjImly vo uvou iuznycl iIauocl: luyz jo zauan voIIlosl
(size) vlsI, noz io jalou hyIa Iunlco navizona, noho luyz jo zauan voIIlosl monsI noz nuIa.
if size < 0:
raise ValueError('number must be non-negative')
Synlaxo io vyvoInI vyjImly jo omin jounouucl. PouzIjomo iIlaz raise, za lloiym uvouomo
jmono vyjImly a noovInny, io cIovla siozumIloIny iolzoc usnauujIcI IaunI. ZIs so ouoh vo-
InI Iunlco. (Vo slulocnoslI jsou vyjImly ImIomonlovny jalo liIuy. PiIlaz iaIso zuo vylviI InslancI
liIuy ValueError a jojI InIcIaIIzacnI molou iouv iolzoc 'number must be non-negative' (cIsIo
nosmI hyl zoino). AIo noiouhIlojmo!)
> VyjImla nomusI hyl ohsIouzona vo IunlcI, lloi jI vyvoIaIa. Poluu jI jouna Iunlco noohsIouzI,
vyjImla huuo iouna voIajIcI IunlcI, al IunlcI, lloi vyvoIaIa zaso jI a lal uIo, ,naloiu o z-
sohnIlu. Poluu nonI vyjImla ohsIouzona vuhoc, iogiam zlavaiujo a Pyllon vyIso ,liacohacl
1.7. VyjImly
57
(liasovacI vyIs) na slanuaiunI clyhovy vyslu a lIm lo loncI. Znovu oalujI, mozn lalovo
clovnI ozauujomo. ZIozI lo na lom, l comu jo ns iogiam uicon.
1.7.1. OhsIula clyh Imoilu
Jounou zo zahuuovanycl vyjImol jazyla Pyllon jo ImportError. Ta jo vyvoIna v olamzIlu, luy so
olousImo o Imoil mouuIu a lalo ooiaco soIzo. Muzo l lomu uojIl z iuznycl uuvouu, aIo v nojjou-
nouussIm iIau mouuI nohyI naIozon vo vasI vylIouvacI cosl io Imoil. Tolo muzolo vyuzIl io
zahuuovnI noovInnycl vIaslnoslI svolo iogiamu. Tal naiIlIau lnIlovna chardet umozujo aulo-
uololcI znalovolo louovnI. Mozn hyslo cllII, ahy vs iogiam lulo lnIlovnu vyuzII v Iud6, 2e
ex:|uje. Poluu jI uzIvaloI nom naInslaIovanou, mI hy iogiam hoz milnulI ola oliacoval. Muzomo
lolo uoslnoul ouzIlIm hIolu try..except.
try:
import chardet
except ImportError:
chardet = None
PozujI muzolo olosloval, zua jo mouuI chardet iIlomon jounouuso, iIlazom if:
if chardet:
# do something
else:
# continue anyway
DaIsI hzny iIau ouzIlI vyjImly ImportError souvIsI so sIluacI, luy uva mouuIy ImIomonlujI
soIocno aIIlacnI iogiamovo iozlianI (API), aIo jouon z nIcl clcomo ouzIval iounosln. (Mozn jo
iyclIojsI noho ouzIv mon amlI.) Muzomo zlusIl Imoiloval jouon mouuI, aIo oluu Imoil soIzo,
vozmomo zavul lIm uiulym. Tal naiIlIau laIloIa o XML ojounv o uvou mouuIocl, lloio ImIo-
monlujI soIocno iozlianI zvano ElementTree. PivnIm z nIcl jo IxmI, coz jo mouuI liolI sliany, lloiy
sI musIlo samI sllnoul a naInslaIoval. TIm uiulym jo xmI.olioo.LIomonlTioo, lloiy jo sIco omaIojsI,
aIo jo soucslI slanuaiunI lnIlovny jazyla Pyllon 8.
try:
from lxml import etree
except ImportError:
import xml.etree.ElementTree as etree
Na loncI hIolu try..except mlo ziIslunny nlloiy z lcllo mouuIu a mlo joj ojmonovany
etree. Piolozo oha mouuIy ImIomonlujI slojno iozlianI (API), nomusIlo vo zhyllu svolo louu nousl-
Io losloval, lloiy mouuI so vIasln naImoilovaI. A iolozo so mouuI, lloiy so oiavuu naImoilovaI,
vzuy jmonujo etree, nomusI hyl zhylol vasolo louu zanoiuny iIlazy if, vo lloiycl so voIajI iuzn
ojmonovano mouuIy.
1.7. VyjImly
58
1.8. VoIno iomnno
PouIvojmo so znovu na nsIouujIcI iuol louu Iunlco approximate_size():
multiple = 1024 if a_kilobyte_is_1024_bytes else 1000
Piomnnou multiple (nsohol) jsmo nIluo nouolIaiovaII. Pouzo jsmo uo nI iIiauIII lounolu. To jo v o-
iulu, iolozo Pyllon vm lolIo uovoII. Co uz vm aIo Pyllon nedovo, jo olus o oulaz na iomnnou,
lloio nohyIa nIluy iIiazona lounola. Poluu so o lo olusImo, huuo vyvoIna vyjImla NameError.
>>> x
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
NameError: name 'x' is not defined
>>> x = 1
>>> x
1
Jounolo uno za lo Pyllonu oulujolo.
1.u. Vso jo cIlIIvo na voIIlosl Ismon
V jazyco Pyllon jo zIs vsocl jmon cIlIIvy na voIIlosl Ismon. Tyl so lo jmon iomnnycl, jmon
IunlcI, jmon liIu, jmon mouuIu, jmon vyjImol. Poluu lo muzolo ziIslunIl, naslavIl, zavoIal,
Imoiloval noho lo vyvoIal, jo lo cIlIIvo na voIIlosl Ismon.
>>> an_integer = 1
>>> an_integer
1
>>> AN_INTEGER
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
NameError: name 'AN_INTEGER' is not defined
>>> An_Integer
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
NameError: name 'An_Integer' is not defined
>>> an_inteGer
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
NameError: name 'an_inteGer' is not defined
A lal uIo.
1.8. VoIno iomnno
1.u. Vso jo cIlIIvo na voIIlosl Ismon
59
1.1u. SouslnI sliIlu
V Pyllonu jo ohjollom I mouuI a mouuIy uoIInujI nloIIl uzI-
locnycl aliIhulu. PiI sanI vasIcl mouuIu lolo muzomo vyuzIl
l jojIcl snaunomu loslovnI. VIozImo uo nIcl socIInI hIol
louu, lloiy so iovouo v iIau, luy yllonovsly souhoi
suslIlo z iIlazovolo iulu. PouIvojlo so na osIounI iuly
v souhoiu humansize.py:
if __name__ == '__main__':
print(approximate_size(1000000000000, False))
print(approximate_size(1000000000000))
> Pyllon slojn jalo jazyl c ouzIv == io oiovnnI a = io iIiazonI. Na iozuII
ou jazyla C aIo Pyllon noouoiujo iIiazovacI vyiaz, lalzo ouau moznosl nocllnolo
iIiazonI lounoly v sIluacI, luy jslo mII na mysII losl na iovnosl.
Talzo cIm jo vIasln lonlo iIlaz if zvIslnI Tal louy, mouuIy jsou ohjolly a vsoclny mouuIy majI
zahuuovany aliIhul __name__. Jolo lounola zvIsI na lom, jalym zusohom mouuI ouzIvlo. Poluu
iovuIlo Imoil mouuIu, al jo v aliIhulu __name__ zaclycono jmono jolo souhoiu hoz cosly
uo auiosio a hoz iIony.
>>> import humansize
>>> humansize.__name__
'humansize'
AIo mouuI muzolo suslIl lalo iImo, jalo samoslalny iogiam. V lalovom iIau huuo __name__
nahyval socIInI iounaslavono lounoly __main__. Pyllon lulo slulocnosl oloslujo iIlazom if,
zjIslI, zo vyiaz IalI, a iovouo hIol louu uvnIli if. V nasom iIau so vylIslnou uv lounoly.
c:\home\diveintopython3> c:\python31\python.exe humansize.py
1.0 TB
931.3 GiB
A lolIo vsoclno uI vs ivnI yllonovsly iogiam!
1.1u. SouslnI sliIlu
V Pythonu je objektem
vechno.
60
1.11. Piocllo sI
- PEP Z7: Dncstring Cnnvontinns. Najuolo zuo vysvlIonI, cIm so IIsI uohiy docstring
ou vynIlajIcIlo docstringu.
(lll:llvvv.yllon.oigluovloslo-u27l)
- Pythnn Tutnriul: Dncumontutinn Strings uolyl so slojnolo lomalu.
(lll:lluocs.yllon.oigly8llluloiIaIlconlioIIIov.llmI)
- PEP 8: Stylo Guido fnr Pythnn Cndo ojounv o vlounycl zusohocl ousazovnI.
(lll:llvvv.yllon.oigluovloslo-uuu8l)
- Pythnn Roforonco Munuul vysvlIujo co lo znamon, luyz so iolno, zo vso v Pyllonu jo ohjoll,
iolozo nlloiI IIuo jsou unlIcliI a iuI o lalovycl vcocl uIouzo uIslulujI.
(lll:lluocs.yllon.oigly8llioIoioncol)
1.11. Piocllo sI
61
2. Pirozen datov typy
2. KaIloIa
Wonder is the foundation of all philosophy,
inquiry its progress, ignorance its end.
(Zvuavosl jo zlIauom coIo IIIozoIIo,
lIounI ouovuI na olzly jI zono viou,
Ignoianco jI zahIjI.)
MIcloI uo MonlaIgno
62
2. Pirozen datov typy 61
2.1. Ponoimo so 63
2.2. BooIoovsly ly 63
2.8. CIsIa 64
2.8.1. VynuconI iovouu coIycl cIsoI na ioIn a naoal 65
2.8.2. Bzno ooiaco s cIsIy 66
2.8.8. ZIomly 67
2.8.4. TiIgonomoliIo 67
2.8.. CIsIa v hooIoovslom lonloxlu 68
2.4. Soznamy 69
2.4.1. VylvoionI soznamu 69
2.4.2. VylvionI ousoznamu 70
2.4.8. PiIuvnI oIozol uo soznamu 71
2.4.4. VylIouvnI lounoly v soznamu 73
2.4. OusliaovnI oIozol zo soznamu 74
2.4.6. OusliaovnI oIozol zo soznamu: Bonusovo loIo 75
2.4.7. Soznamy v hooIoovslom lonloxlu 75
2.. N-lIco 76
2..1. N-lIco v hooIoovslom lonloxlu 78
2..2. PiIiazonI vIco lounol najounou 78
2.6. MnozIny 79
2.6.1. VylvoionI mnozIny 79
2.6.2. Iiava mnozIny 81
2.6.8. OusliaovnI oIozol z mnozIny 82
2.6.4. Bzno mnozInovo ooiaco 83
2.6.. MnozIny v hooIoovslom lonloxlu 85
2.7. SIovnIly 86
2.7.1. VylvoionI sIovnIlu 86
2.7.2. Iiava sIovnIlu 87
2.7.8. SIovnIly so smIsonym ohsalom 87
2.7.4. SIovnIly v hooIoovslom lonloxlu 88
2.8. None 89
2.8.1. None v hooIoovslom lonloxlu 90
2.u. Piocllo sI 90
Ohsal laIloIy
63
2.1. Ponoimo so
Dalovo lyy. Pioslamo sI na clvIII vsImal nasolo ivnIlo yllonovslolo iogiamu a ojumo sI
oovIual o ualovycl lyocl. Kazu lounola v Pyllonu jo uicIlolo ualovolo lyu, aIo u iomnnycl
nomusImo ualovy ly uolIaioval. Jal lo louy Iungujo PiI lazuom iIiazonI lounoly uo iomnno sI
Pyllon zjIslI, jalolo lyu lounola jo, a vnIlin sI lo ovIuujo.
Pyllon ouzIv mnolo iIiozonycl ualovycl lyu (vo smysIu ,iIiozonycl io Pyllon). Ivoumo
zuo ly lIavnI:
1. Bnnloun (hooIoovsly ly) nahyv huu lounoly True noho False.
2. Cslu molou hyl coI (Inlogoi; 1 a 2), ioIn (IIoal; 1.1 a 1.2), zIomly (IiaclIon; 1/2 anu 2/3),
noho uolonco cIsIa lomIoxnI.
8. Rotzco jsou osIounoslI InIcouo znalu. Tulo ouohu muzo mIl naiIlIau HTML uolumonl.
4. Bu|ty u pnlo bu|t, naiIlIau souhoi s ohizlom vo Ioimlu JPEG.
. Soznumy jsou usoiuano osIounoslI lounol.
6. N-tico jsou usoiuano, nomnno osIounoslI lounol.
7. Mnnziny jsou nousoiuano loIolco lounol.
8. Slnvnky jsou nousoiuano loIolco uvojIc lIIc-lounola.
Tcl lyu jo samoziojm vIc. V Pyllonu jo vso ohjollom, iolo musI oxIsloval lalo lyy jalo modu,
[unLte, |Idu, me|odu, :ouIor, a uolonco Ieo2eny Lod. S nlloiymI z nIcl uz jsmo so sollaII: mouuIy
majI jmona, Iunlco majI uocsliIng alu. O liIucl so uozvIlo v laIloIo TiIuy a Iloiloiy, o souhoiocl
v laIloIo Souhoiy.
Rolzco a hajly jsou uuIozIlo uo lo mIiy a jsou lalo uosl lomIIlovano , zo jIm jo vnovna samo-
slaln laIloIa. NojuiIvo so ouIvojmo na ly zhyvajIcI.
2.2. BooIoovsly ly
Ohjoll hooIoovslolo lyu nahyv huu lounoly liuo (iavua) noho IaIso (noiavua). Pio iImo iIiazo-
nI hooIoovslycl lounol uoIInujo Pyllon uv lonslanly, iIloun ojmonovano True a False. BooIo-
ovsl lounola muzo vznIlnoul lalo vylounoconIm vyiazu. Na nlloiycl mIslocl (jalo u iIlazu if)
Pyllon uolonco iouolIu, zo so vyiaz vylounolI uo ouohy hooIoovslo lounoly. Tmlo mIslum
so iIl Iooeov:Ly Lon|ex|. V hooIoovslom lonloxlu muzomo
ouzIl lomi IIhovoIny vyiaz. Pyllon so olusI zIslal jolo
iavuIvoslnI lounolu. PiavIuIa, ouIo lloiycl so v hooIoov-
slom lonloxlu vysIouol clo jalo iavuIvy noho noiav-
uIvy (liuo noho IaIso), jsou io iuzno ualovo lyy iuzn.
(JalmIIo uvIuIlo uIo v lolo laIloIo lonliolnI iIlIauy, huuo
vm lo uval vlsI smysI.)
V booleovskm kontextu
mete pout tm
libovoln vraz.
2.1. Ponoimo so
2.2. BooIoovsly ly
Ka.
Ka.
64
Vozmmo sI naiIlIau nsIouujIcI iyvol z humansize.py:
if size < 0:
raise ValueError('number must be non-negative')
Piomnn size ohsalujo coIo cIsIo, 0 jo coIo cIsIo a < jo cIsoIny ooiloi. VysIouol vyiazu size < 0 m
vzuy hooIoovslou lounolu. V yllonovslom sloIIu sI vyzlousojlo nsIouujIcI:
>>> size = 1
>>> size < 0
False
>>> size = 0
>>> size < 0
False
>>> size = -1
>>> size < 0
True
V uusIoulu iohIomalIclolo uuIclvI z Pyllonu 2 so s hooIoovslymI lounolamI muzo zaclzol
jalo s cIsIy. True jo 1; False jo 0.
>>> True + True
2
>>> True - False
1
>>> True * False
0
>>> True / False
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ZeroDivisionError: int division or modulo by zero
Ajajaj! Talovo vcI nouIojlo. Zaomolo, zo jsom so o lom vuhoc zmInII.
2.8. CIsIa
CIsIa jsou ohuIvuloun. Muzolo sI jo vyhial z lal oliomnolo mnozslvI. Pyllon ouoiujo jal coI cIs-
Ia (Inlogoi), lal cIsIa ioIn (IIoalIng oInl). NoiozIIsujI so uolIaiacI ualovolo lyu. Pyllon jo ou soho
oznv ouIo iIlomnoslI noho noiIlomnoslI uosolInno locly.
2.8. CIsIa
65
>>> type(1) }1]
<class 'int'>
>>> isinstance(1, int) }2]
True
>>> 1 + 1 }8]
2
>>> 1 + 1.0 }4]
2.0
>>> type(2.0)
<class 'float'>
}1] Pio ovionI lyu IIhovoIno lounoly noho iomnno muzomo ouzIl IunlcI type(). Jal so uaIo
colal, lounola 1 jo lyu int.
}2] Pouohn muzomo voInIm Iunlco isinstance() oviIl, zua lounola cI iomnn ouovIu
zauanomu lyu.
}8] PiIunIm int l int vznIl vysIouol lyu int.
}4] PiIunIm int l float vznIl vysIouol lyu float. Ahy molI Pyllon iovosl scIlnI, vynulI sI
iovou lyu int na float. Polo vilI vysIouol lyu float.
2.8.1. VynuconI iovouu coIycl cIsoI na ioIn a naoal
Jal jslo ziovna vIuII, nlloio ooiloiy (naiIlIau scIlnI) molou ouIo oliohy vynulIl iovou coIo-
lo cIsIa na cIsIo ioIno. AIo l iovouu jo muzolo uonulIl laly vy samI.
>>> float(2) }1]
2.0
>>> int(2.0) }2]
2
>>> int(2.5) }8]
2
>>> int(-2.5) }4]
-2
>>> 1.12345678901234567890 }]
1.1234567890123457
>>> type(1000000000000000) }6]
<class 'int'>
}1] VoInIm Iunlco float() muzomo oxIIcIln vynulIl iovou int (ly io coIo cIsIo) na float
(ly io ioIno cIsIo).
}2] A nohuuo asI moc iolvaIvo, zo voInIm int() muzomo vynulIl iovou float na int.
}8] Iunlco int() nozaolioulIujo, aIo ousolv.
}4] Iunlco int() ousolv uosolInnou csl u zoinycl cIsoI smiom l nuIo. Juo o IunlcI
2.8. CIsIa
66
oiavuovolo ousolvnI, no o IunlcI floor (lj. u zoinycl cIsoI uojuo lo zvlsonI cIsIa, iolozo
naiIlIau -2.5 so zmnI na -2).
}] CIsIa lyu float jsou uIozona s iosnoslI na 1 uosolInnycl mIsl.
}6] CoI cIsIa molou hyl IIhovoIn voIl.
> Pyllon 2 mI ouuIono lyy int a long. Dalovy ly int hyI omozon lonslanlou sys.maxint, lloi
hyIa IalIoimov zvIsI, aIo ohvylIo nahyvaIa lounoly 2
32
-1. Pyllon 8 m ouzo jouon coIocIsoI-
ny ly, lloiy so clov vlsInou jalo uvounI ly long z Pyllonu 2. DolaIIy naIoznolo
v PEP 287.
2.8.2. Bzno ooiaco s cIsIy
S cIsIy muzolo uIal vsoclno mozno.
>>> 11 / 2 }1]
5.5
>>> 11 // 2 }2]
5
>>> 11 // 2 }8]
6
>>> 11.0 // 2 }4]
5.0
>>> 11 ** 2 }]
121
>>> 11 % 2 }6]
1
}1] Ooiloi / iovuI uIonI. ViacI vysIouol lyu float uolonco I v iIau, zo cInIloI I jmonovaloI
jsou lyu int.
}2] Ooiloi // iovuI svym zusohom ouIvno coIocIsoIno uIonI. Poluu jo vysIouol lIauny,
muzolo o nm uvazoval, zo vznIlI ousolnulIm uosolInnycl mIsl (louy nIloIIv zaolioulIonIm).
AIo ozoi na lo.
}8] PiI coIocIsoInom uIonI zoinycl cIsoI iovouo ooiloi // zaolioulIonI ,naloiu l nojhIIzsImu
coIomu cIsIu. Z malomalIclolo lIouIsla zaolioulIujo ,uoIu, iolozo -6 jo monsI noz -5.
AIo oluu hyslo ocolvaII, zo uojuo l ousolnulI na -5, lal hyslo so naclylaII.
}4] Ooiloi // noviacI coIo cIsIo vzuy. Poluu jo cIlaloI noho jmonovaloI lyu float, huuo vysIouol
sIco ol zaolioulIon na coIo cIsIo, aIo vysIoun lounola huuo lyu float.
}] Ooiloi ** znamon ,umocnno na. 11
2
jo 121.
}6] Ooiloi % viacI zhylol o coIocIsoInom uIonI. 11 uIono 2 jo 5 a zhylol jo 1. Talzo vysIoulom huuo 1.
> V Pyllonu 2 ohvylIo ooiloi / iovuI coIocIsoIno uIonI. AIo luyz jslo vo svom louu ouzIII
socIInI uIiollIvu, molII jslo jolo vyznam ionoul na ioIno uIonI. V Pyllonu 8 ooiloi /
2.8. CIsIa
67
vyjauiujo vzuy uIonI s ioInym vysIoulom (IIoalIng oInl uIvIsIon). Na uolaIIy so ouIvojlo
uo PEP 238.
2.8.8. ZIomly
Pyllon vs noomozujo jon na coI a ioIn cIsIa. ZvIuno coIou lu IanlaslIclou malIlu, lloiou jslo so
ucIII na sliounI sloIo a iyclIo jslo jI zaomnII.
>>> import fractions }1]
>>> x = fractions.Fraction(1, 3) }2]
>>> x
Fraction(1, 3)
>>> x * 2 }8]
Fraction(2, 3)
>>> fractions.Fraction(6, 4) }4]
Fraction(3, 2)
>>> fractions.Fraction(0, 0) }]
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "fractions.py", line 96, in __new__
raise ZeroDivisionError('Fraction(%s, 0)' % numerator)
ZeroDivisionError: Fraction(0, 0)
}1] PouzIvnI zIomlu zaljImo Imoilom mouuIu fractions.
}2] ZIomol uoIInujomo lal, zo vylvoiImo ohjoll liIuy Fraction a ioumo mu cIlaloIo a jmonovaloIo.
}8] So zIomly muzomo iovul ohvylIo malomalIclo ooiaco. Ty viacojI novy ohjoll liIuy
Fraction. 2 * (1/3) = (2/3)
}4] Ohjoll liIuy Fraction zIomly aulomalIcly lilI. (6/4) = (3/2)
}] Pyllon m uosl iozumu na lo, ahy novylvoiII zIomol s nuIovym jmonovaloIom.
2.8.4. TiIgonomoliIo
Pyllon zvIuno I zlIauy liIgonomoliIo.
>>> import math
>>> math.pi }1]
3.1415926535897931
>>> math.sin(math.pi / 2) }2]
1.0
>>> math.tan(math.pi / 4) }8]
0.99999999999999989
2.8. CIsIa
68
}1] MouuI math uoIInujo lonslanlu , cIII omi mozI ohvouom liuznIco a jojIm iumiom.
}2] MouuI math zvIu vsoclny zlIaunI liIgonomoliIclo Iunlco vcoln sin(), cos(), tan()
a vaiIanly jalo asin().
}8] AIo ozoi na lo, zo Pyllon nooIyv nolonocnou iosnoslI. Iunlco tan( / 4) hy mIa vilIl
1.0 a no 0.99999999999999989.
2.8.. CIsIa v hooIoovslom lonloxlu
CIsIa muzolo ouzIl v hooIoovslom lonloxlu naiIlIau
v iIlazu if. NuIovo lounoly so InloiiolujI jalo IaIso,
nonuIovo jalo liuo.
>>> def is_it_true(anything): }1]
... if anything:
... print("yes, it's true")
... else:
... print("no, it's false")
...
>>> is_it_true(1) }2]
yes, it's true
>>> is_it_true(-1)
yes, it's true
>>> is_it_true(0)
no, it's false
>>> is_it_true(0.1) }8]
yes, it's true
>>> is_it_true(0.0)
no, it's false
>>> import fractions
>>> is_it_true(fractions.Fraction(1, 2)) }4]
yes, it's true
>>> is_it_true(fractions.Fraction(0, 1))
no, it's false
}1] A lo vIlo, zo svo vIaslnI Iunlco muzolo uoIInoval I v yllonovslom InloiallIvnIm sloIIu SlacI
zmclnoul ENTER na loncI lazuolo iulu a vso uloncIl slIslom ENTER na izunom iulu.
}2] V hooIoovslom lonloxlu so nonuIov coI cIsIa clou jalo liuo a nuIa jalo IaIso.
}8] NonuIov ioIn cIsIa so clou jalo liuo, 0.0 so clo jalo IaIso. AIo hacla na lu osIou-
nI lounolu! Poluu uojuo l sohomonsI zaolioulIovacI clyh (coz nonI nomozno, jal jslo sI
2.8. CIsIa
Nulov hodnota se interpretuje
jako false, nenulov jako true.
69
molII vsImnoul v iouclozI oulaIloIo), al huuo Pyllon losloval mIslo nuIy naiIlIau
0.0000000000001 a vilI lounolu True.
}] ZIomly muzomo lalo ouzIl v hooIoovslom lonloxlu. Hounola Fraction(0, n) so io vsoclny
lounoly n vylounolI jalo IaIso. Vsoclny oslalnI zIomly so vylounolI jalo liuo.
2.4. Soznamy
Soznamy jsou v Pyllonu nojouzIvanjsImI ualovymI lyy. Kuyz iolnu ,soznam (angIIcly IIsl }IIsl]),
muzo vs naaunoul ,oIo, joloz voIIlosl musIm iouom uolIaioval, lloio muzo ohsaloval jon ivly
slojnolo lyu alu.. TImlo smiom nouvazujlo. Soznamy jsou mnolom IosI.
> Pyllonovsly soznam so ouoh oII (aiiay) v PoiI . Piomnno oII v jazyco PoiI vzuycly
zacInajI znalom @. Pyllonovslo iomnno muzou hyl ojmonovny zcoIa IIhovoIn. Pyllon
sI vnIlin ovIuujo jojIcl ualovy ly.
> Pyllonovsly soznam m vlsI moznoslI noz oIo (aiiay) v jazyco Java. (AcloIIv oluu jo
lo vso, co ou zIvola ocolvlo, muzolo joj lImlo zusohom ouzIval.) PouohnjsI jo mu liIua
ArrayList, lloi umozujo uclovvnI IIhovoInycl ohjollu a iI iIunI novycl oIozol
so muzo uynamIcly zvlsIl.
2.4.1. VylvoionI soznamu
Soznam muzomo vylvoiIl snauno. CilamI ouuIono lounoly uzaviomo uo lianalycl zvoiol.
>>> a_list = ['a', 'b', 'mpilgrim', 'z', 'example'] }1]
>>> a_list
['a', 'b', 'mpilgrim', 'z', 'example']
>>> a_list[0] }2]
'a'
>>> a_list[4] }8]
'example'
>>> a_list[-1] }4]
'example'
>>> a_list[-3] }]
'mpilgrim'
}1] NojuiIvo jsmo nauoIInovaII soznam s lI oIozlamI. VsImnlo sI, zo zaclovvajI svo uvounI
oiauI. NonI lo nloua. Soznam jo usoiuan loIolco oIozol.
}2] Soznam muzomo ouzIval jalo oIo s InuoxovnIm ou nuIy. PivnI ivol lazuolo noizunolo
soznamu ziIslunImo vzuy zIsom a_list[0].
}8] PosIounI ivol lololo lIivlovolo soznamu jo a_list[4], iolozo InuoxovnI zacIn nuIou.
2.4. Soznamy
70
}4] Zoinym Inuoxom ziIsluujomo oIozly vo smiu ou lonco soznamu l zacllu.
PosIounI ivol lazuolo noizunolo soznamu ziIslunImo vzuy zIsom a_list[-1].
}] Poluu so vm zu ouzIlI zoinolo Inuoxu maloucI, uvazujlo o nm lallo:
a_list[-n] == a_list[len(a_list) - n]. Talzo io ns soznam al IalI
a_list[-3] == a_list[5 - 3] == a_list[2].
2.4.2. VylvionI ousoznamu
JalmIIo mmo vylvoion soznam, muzomo zIslal jaloulo-
IIv jolo csl. AngIIcly so lomu iIl ,:tng llo IIsl, coz
muzomo ioIozIl jalo ,vyLrujov0n zo soznamu noho ,vy-
ioz zo soznamu noho z olIouu ahsliallnIlo zmiu
vylvionI ousoznamu.
>>> a_list
['a', 'b', 'mpilgrim', 'z', 'example']
>>> a_list[1:3] }1]
['b', 'mpilgrim']
>>> a_list[1:-1] }2]
['b', 'mpilgrim', 'z']
>>> a_list[0:3] }8]
['a', 'b', 'mpilgrim']
>>> a_list[:3] }4]
['a', 'b', 'mpilgrim']
>>> a_list[3:] }]
['z', 'example']
>>> a_list[:] }6]
['a', 'b', 'mpilgrim', 'z', 'example']
}1] Csl soznamu, vyioz (sIIco), muzomo zIslal zaunIm uvou Inuoxu. Nvialovou lounolou jo
novy soznam, lloiy ohsalujo oIozly ou ivnIlo Inuoxu vyiozu (v lomlo iIau a_list[1])
az o oIozlu (aIo vyjma) s uiulym Inuoxom vyiozu (v nasom iIau a_list[3]).
}2] Vyioz Iungujo I v iIau, luy jo lounola jounolo noho ohou Inuoxu vyiozu zoin. Muzolo
sI omocI nsIouujIcIm zusohom uvazovnI. Kuyz so na soznam uIvmo zIova uoiava, al
ivnI Inuox vyiozu uicujo ivnI oIozlu, lloiou clcomo, a uiuly Inuox vyiozu uicujo ivnI
oIozlu, lloiou noclcomo. ViacI so vso mozI lIm.
}8] Soznamy so InuoxujI ou nuIy, lalzo zIs a_list[0:3] viacI ivnI liI oIozly soznamu ocIna-
jo oIozlou a_list[0] az o a_list[3] vyjma (la uz so noviacI).
}4] Poluu jo Iovy Inuox vyiozu iovon nuIo, muzomo nuIu vynoclal a Pyllon sI jI lam uosauI. Talzo
zIs a_list[:3] vouo lo slojnomu vysIoulu jalo a_list[0:3], iolozo oclocnI nuIa so
uosauI jalo ImIIcIlnI lounola.
2.4. Soznamy
a_list[0] je vdy prvn polokou
seznamu a_list.
71
}] Pouohn, oluu hy iavy Inuox vyiozu mI mIl lounolu iovnou uoIco soznamu, muzomo
joj vynoclal. Piolozo ns soznam m l oIozol, vouo zIs a_list[3:] lo slojnomu vysIoulu
jalo a_list[3:5]. A najuomo zuo olsIloInou symoliII. V nasom lIivlovom soznamu
viacI zIs a_list[:3] ivnI liI oIozly a a_list[3:] viacI zhyvajIcI uv. Ohocn IalI,
zo a_list[:n] vzuy vilI ivnIcl n oIozol a a_list[n:] vilI zhylol nozvIsIo na uoIco
soznamu.
}6] Poluu vynoclmo oha Inuoxy vyiozu, jsou vo vysIoulu zalinuly vsoclny oIozly uvounIlo
soznamu. AIo nonI lo loloz jalo uvounI iomnn a_list. Juo o novy soznam, lloiy m slouou
oloInoslI slojno oIozly. ZIs a_list[:] jo louy zliallou io zIslnI Ino loIo soznamu.
2.4.8. PiIuvnI oIozol uo soznamu
PoIozlu muzomo uo soznamu iIual clyimI zusohy.
>>> a_list = ['a']
>>> a_list = a_list + [2.0, 3] }1]
>>> a_list }2]
['a', 2.0, 3]
>>> a_list.append(True) }8]
>>> a_list
['a', 2.0, 3, True]
>>> a_list.extend(['four', '1']) }4]
>>> a_list
['a', 2.0, 3, True, 'four', '1']
>>> a_list.insert(0, '1') }]
>>> a_list
['1', 'a', 2.0, 3, True, 'four', '1']
}1] Ooiloi + sojI soznamy a vylvoiI novy soznam. Soznam muzo ohsaloval IIhovoIny ocol o-
Iozol. NooxIslujo zuo zuny IImIl (ouzo voIIlosl uosluno amlI). AIo co so lyl amlI, mII
hyclom sI ul ozoi na lo, zo sojonIm soznamu vznIl v amlI uaIsI soznam. V nasom iIau
jo novy soznam Ilnou iIiazon uo oxIslujIcI iomnno a_list. Talzo lonlo iuol louu vo slu-
locnoslI iouslavujo uvouIzovy iocos sojonI (lonlalonaco) a iIiazonI , lloiy muzo
u iozslIycl soznamu (uocasn) soliohoval voIlo mnozslvI amlI.
}2] Soznam muzo ohsaloval oIozly IIhovoInolo ualovolo lyu a v jounom soznamu nomusI hyl vsocl-
ny oIozly slojnolo lyu. V nasom iIau mmo soznam ohsalujIcI iolzoc, ioIno cIsIo a coIo cIsIo.
}8] Moloua append() iIuv jounu oIozlu na lonoc soznamu. (Tou uz mmo v soznamu oIozly
so t|yIm iozuIInymI ualovymI lyy!)
}4] Soznamy jsou ImIomonlovny Ioimou liIuy. ,VylvoionI soznamu louy znamon vylvoionI
Inslanco liIuy. V lomlo smysIu majI soznamy molouy, lloio nau nImI iacujI. Moloua extend()
iohIi jouon aigumonl, lloiym jo soznam. Kazuy jolo ivol iIojI na lonoc uvounIlo
soznamu (aonu).
2.4. Soznamy
72
}] Moloua insert() vIozI uo soznamu jounu oIozlu. PivnIm aigumonlom jo Inuox ivnI oIozly
soznamu, lloi huuo z lolo ozIco ousunula. PoIozly soznamu nomusI hyl jouInocno. NaiIlIau
v nasom iIau lou soznam ohsalujo uv samoslalno oIozly s lounolou '1': ivnI oIozlu
(a_list[0]) a osIounI oIozlu (a_list[6]).
> VoInI molouy a_list.insert(0, value) so ouoh ouzIlI Iunlco unshift() v jazyco PoiI.
VIozI ivol na zaclol soznamu a Inuox vsocl oslalnIcl oIozol so zvysI, ahy vznIlIo oliohno
mIslo.
PouIvojmo so ouiohnjI na iozuIIy mozI append() a extend().
>>> a_list = ['a', 'b', 'c']
>>> a_list.extend(['d', 'e', 'f']) }1]
>>> a_list
['a', 'b', 'c', 'd', 'e', 'f']
>>> len(a_list) }2]
6
>>> a_list[-1]
'f'
>>> a_list.append(['g', 'h', 'i']) }8]
>>> a_list
['a', 'b', 'c', 'd', 'e', 'f', ['g', 'h', 'i']]
>>> len(a_list) }4]
7
>>> a_list[-1]
['g', 'h', 'i']
}1] Moloua extend() iohIi jouon aigumonl, lloiym jo vzuy soznam, a iIu lazuy jolo ivol
uo soznamu a_list.
}2] Poluu zacnolo so soznamom o liocl oIozlcl a iozsIiIlo joj voInIm extend() o soznam
s uaIsImI liomI oIozlamI, uoslanolo soznam s soslI oIozlamI.
}8] Vo siovnnI s lIm moloua append() iohIi jouon aigumonl, lloiy muzo hyl IIhovoInolo ualovo-
lo lyu. Na lomlo iulu iouvmo molou append() soznam s liomI oIozlamI.
}4] Poluu jsmo zacaII so soznamom o soslI oIozlcl a iouany soznam iIojImo na lonoc, uo-
slanomo soznam so soumI oIozlamI. Pioc so soumI Piolozo osIounI oIozlou (lloiou jsmo
iv iIojIII) jo tey :eznum. Soznam muzo ohsaloval uala IIhovoInolo lyu, vcoln soznamu.
Muzo lo hyl iv lo, co jslo cllII. Noho mozn nocllII. Kazuoun jslo sI o lo iolII, a iolo
jslo lo uoslaII.
2.4. Soznamy
73
2.4.4. VylIouvnI lounoly v soznamu
>>> a_list = ['a', 'b', 'new', 'mpilgrim', 'new']
>>> a_list.count('new') }1]
2
>>> 'new' in a_list }2]
True
>>> 'c' in a_list
False
>>> a_list.index('mpilgrim') }8]
3
>>> a_list.index('new') }4]
2
>>> a_list.index('c') }]
Traceback (innermost last):
File "<interactive input>", line 1, in ?
ValueError: list.index(x): x not in list
}1] Moloua count() viacI ocol vyslylu uicIlo lounoly v soznamu (coz so uaIo colal).
}2] Poluu so clcolo uozvul jon lo, joslII njal lounola v soznamu jo noho no, al jo ouzIlI oo-
iloiu in o nco iyclIojsI noz voInI molouy count(). Ooiloi In vzuy viacI True noho False.
Noiolno vm, loIIlil so uan lounola v soznamu vyslylujo.
}8] AnI ooiloi In anI moloua count() vm aIo noiolnou, luo so v soznamu lounola vyslylu-
jo. Poluu clcolo zjIslIl, Lde so lounola v soznamu naclzI, ouzIjlo molouu index(). Poluu
noiolnolo jInal, huuo iolIouval coIy soznam. AIo noovInnym uiulym aigumonlom muzolo
zaual Inuox (ou nuIy), na lloiom m lIounI zacIl. A muzomo uolonco zaual noovInny liolI
aigumonl s Inuoxom mIsla, luo m lIounI sloncIl.
}4] Moloua index() najuo rvn vyslyl zauano lounoly v soznamu. V lomlo iIau so lounola
'new' vyslylujo v soznamu uvalil: a_list[2] a a_list[4]. AIo moloua index() vilI jon
Inuox ivnIlo vyslylu.
}] Co hyslo aIo mozn neteLu, jo lo, zo v iIau nonaIozonI lounoly v soznamu vyvoI moloua
index() vyjImlu.
Poclal! Co Jo lo lal. Poluu moloua index() nonajuo v soznamu zauanou lounolu, vyvoI vyjImlu.
Juo o zjovn ouIIsno clovnI vo siovnnI s jInymI jazyly, lloio viacojI njalou noIalnou lounolu
Inuoxu (jalo naiIlIau -1). Zo zacllu so vm lo muzo zul iolIvno, aIo mysIIm, zo lo casom oconIlo.
Znamon lo, zo iogiam zlavaiujo v mIsl vznIlu iohIomu mIslo lolo, ahy olIclu a uIvn soIlaI
o clvIII ozujI. Vzomolo sI, zo lounola -1 jo Ialnym Inuoxom ivlu v soznamu. Kuyhy moloua
index() mIslo vyjImly viacoIa lounolu -1, molIo hy lo vosl l omin nozhavnym zzIllum
iI IaunI.
2.4. Soznamy
74
2.4. OusliaovnI oIozol zo soznamu
Soznamy so molou aulomalIcly naIuloval a smisloval.
JojIcl oxanzI uz jsmo sI ulzaII. OusliaovnI oIozol
zo soznamu muzomo lalo iovosl nloIIla zusohy.
>>> a_list = ['a', 'b', 'new', 'mpilgrim', 'new']
>>> a_list[1]
'b'
>>> del a_list[1] }1]
>>> a_list
['a', 'new', 'mpilgrim', 'new']
>>> a_list[1] }2]
'new'
}1] Pio ousliannI uicono oIozly zo soznamu muzomo ouzIl iIlaz del.
}2] Poluu so olousImo o iIslu l oIozco s Inuoxom 1 olo, co jsmo oIozlu s Inuoxom 1 ouslia-
nIII, nedojde l clyh. PozIcnI Inuox vsocl oIozol, lloio nsIouujI za iusonou oIozlou, huuo
osunul lal, ahy hyIa vznIlI mozoia zaInna.
Zo noznlo lon sivny ozIcnI Inuox Zuny iohIom. OusliannI oIozol muzolo iouosal lalo
jojIcl lounolou.
>>> a_list.remove('new') }1]
>>> a_list
['a', 'mpilgrim', 'new']
>>> a_list.remove('new') }2]
>>> a_list
['a', 'mpilgrim']
>>> a_list.remove('new')
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ValueError: list.remove(x): x not in list
}1] K ousliannI oIozly zo soznamu muzolo ouzIl molouu remove(). Moloua remove() iohIi
zauanou hodno|u a ouslianI zo soznamu jojI ivnI vyslyl. A ol. Vsoclny oIozly, lloio n-
sIouujI za iusonou oIozlou, huuou osunuly lal, ahy hyIa vznIlI mozoia zaInna. V sozna-
mocl nIluy novznIlajI uIiy.
}2] Molouu remove() muzolo voIal, luyloIIv so vm lo louI. AIo oluu so olusIlo o ousliannI
oIozly s lounolou, lloi so v soznamu novyslylujo, huuo vyvoIna vyjImla.
2.4. Soznamy
V seznamech nikdy
nevznikaj dry.
75
2.4.6. OusliaovnI oIozol zo soznamu: Bonusovo loIo
DaIsI zajImavou molouou soznamu jo pop(). Moloua pop() iouslavujo uaIsI zusoh ousliaovnI
oIozol zo soznamu, aIo s maIou IInlou.
>>> a_list = ['a', 'b', 'new', 'mpilgrim']
>>> a_list.pop() }1]
'mpilgrim'
>>> a_list
['a', 'b', 'new']
>>> a_list.pop(1) }2]
'b'
>>> a_list
['a', 'new']
>>> a_list.pop()
'new'
>>> a_list.pop()
'a'
>>> a_list.pop() }8]
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
IndexError: pop from empty list
}1] Poluu voImo molouu pop() hoz aigumonlu, ouslianI osIounI oIozlu soznamu a vr0|
hodno|u, lloi hyIa ouslianna.
}2] Molouou pop() muzomo zo soznamu ouslianIl IIhovoInou oIozlu. Jounouuso jI ioumo
ozIcnI Inuox. OuslianI ozauovanou oIozlu, osuno nsIouujIcI oIozly lal, ahy zaInIIa
mozoiu, a vilI ousliannou lounolu.
}8] Poluu voImo pop() io izuny soznam, vznIlno vyjImla.
> VoInI molouy soznamu pop() hoz aigumonlu so ouoh voInI Iunlco pop() v jazyco PoiI. Ou-
slianI osIounI oIozlu soznamu a vilI lounolu, lloi hyIa ouslianna. V jazyco PoiI oxIslujo
lalo Iunlco shift(), lloi ouslianI ivnI oIozlu a vilI jojI lounolu. Juo o olvIvaIonl yllo-
novslolo voInI a_list.pop(0).
2.4.7. Soznamy v hooIoovslom lonloxlu
Soznam muzomo ouzIl lalo v hooIoovslom lonloxlu,
jalo naiIlIau v iIlazu if.
2.4. Soznamy
Przdn seznamy se
vyhodnocuj jako false,
ostatn seznamy jako true.
76
>>> def is_it_true(anything):
... if anything:
... print("yes, it's true")
... else:
... print("no, it's false")
...
>>> is_it_true([]) }1]
no, it's false
>>> is_it_true(['a']) }2]
yes, it's true
>>> is_it_true([False]) }8]
yes, it's true
}1] Pizuny soznam so v hooIoovslom lonloxlu vylounocujo jalo IaIso.
}2] LIhovoIny soznam, lloiy ohsalujo aso jounu oIozlu, so vylounocujo jalo liuo.
}8] LIhovoIny noizuny soznam so vylounocujo jalo liuo. Hounola oIozol jo noouslaln.
2.. N-lIco
N-lIco (angIIcly luIo) so clov jalo nomnIloIny soznam. JalmIIo jo n-lIco jounou vylvoiona, nou so
nIjal zmnIl.
>>> a_tuple = ("a", "b", "mpilgrim", "z", "example") }1]
>>> a_tuple
('a', 'b', 'mpilgrim', 'z', 'example')
>>> a_tuple[0] }2]
'a'
>>> a_tuple[-1] }8]
'example'
>>> a_tuple[1:3] }4]
('b', 'mpilgrim')
}1] N-lIco so uoIInujo slojnym zusohom jalo soznam. JouIny iozuII socIv v lom, zo osIounosl
ivlu nouzaviomo uo lianalycl zvoiol, aIo uo luIalycl.
}2] Pivly n-lIco majI uoIInovano oiauI, slojn jalo u soznamu. N-lIco so InuoxujI ou nuIy (jalo
soznam), lalzo ivnI oIomonl noizuno n-lIco so zaIsujo vzuy a_tuple[0].
}8] Zoino Inuoxy so vylounocujI ou lonco n-lIco, slojn jalo u soznamu.
}4] DajI so z nIcl zIslval vyiozy (sIIco), slojn jalo u soznamu. Kuyz zIsllo vyioz so soznamu, m
ouohu novolo soznamu. Kuyz iouoIsolo vyioz z n-lIco, uoslanolo novou n-lIcI.
HIavnI iozuII mozI n-lIcomI a soznamy jo lon, zo n-lIco nomolou hyl zmnny. Z loclnIclolo olIouu
iIlmo, zo n-lIco jsou nomnIloIno (angIIcly ImmulahIo). PiallIcly so lo iojovujo lal, zo nooslylu-
2.. N-lIco
77
jI zunou molouu, lloi hy nm jo uovoIIIa zmnIl. Soznamy majI molouy jalo append(), extend(),
insert(), remove() a pop(). N-lIco zunou z lcllo molou nomajI. Z n-lIco muzomo vylvoiIl vyioz
(iolozo so vylviI nov n-lIco), muzomo zjIsloval, zua n-lIco ohsalujo uicIlou lounolu (iolozo lIm lo
zmn n-lIco nouoclzI) a... lo jo vsoclno.
# Pokraovn pedchozho pkladu
>>> a_tuple
('a', 'b', 'mpilgrim', 'z', 'example')
>>> a_tuple.append("new") }1]
Traceback (innermost last):
File "<interactive input>", line 1, in ?
AttributeError: 'tuple' object has no attribute 'append'
>>> a_tuple.remove("z") }2]
Traceback (innermost last):
File "<interactive input>", line 1, in ?
AttributeError: 'tuple' object has no attribute 'remove'
>>> a_tuple.index("example") }8]
4
>>> "z" in a_tuple }4]
True
}1] Do n-lIco nomuzomo iIuval uaIsI ivly. N-lIco nomajI anI molouu append() anI extend().
}2] Z n-lIco nomuzomo ivly ouslianIl. N-lIco nomajI zunou z molou remove() noho pop().
}8] V n-lIcI m2eme ivly vylIouval, iolozo lIm nouoclzI l jojI zmn.
}4] Muzomo lalo ouzIl ooiloi in io loslovnI, zua n-lIco ohsalujo zauany ivol.
Talzo na co jsou n-lIco uohio
- N-lIco jsou iyclIojsI noz soznamy. Poluu oliohujolo nauoIInoval lonslanlnI sauu lounol
a vso, co s nImI huuolo luy cllIl uIal, huuo jojIcl ioclzonI, ouzIjlo mIslo soznamu n-lIcI.
- Poluu uala nooliohujolo mnIl a ucInIlo jo ,clinnymI iolI zIsu, huuo vs lou hozoc-
njsI. Poluu ouzIjolo mIslo soznamu n-lIcI, jo lo, jalo luyhyslo ouzIII iIlaz assert, lloiy
hy lonlioIovaI, zua jsou uala lonslanlnI. Piolonal lo muzomo jon zmin (a s vyuzIlIm
socIIIclo Iunlco).
- Nlloio n-lIco molou hyl ouzIly jalo sIovnIlovo lIIco (iosnjI iocono, n-lIco, lloio ohsalujI
nem6n|en6 (ImmulahIo) lounoly jalo jsou iolzco, cIsIa a jIno n-lIco). V ioII sIovnIlovycl
lIIcu nomuzou nIluy vysluoval soznamy, iolozo soznamy nojsou nomnIloIno (ImmulahIo).
> N-lIco molou hyl iovouony na soznamy a naoal. Zahuuovan Iunlco tuple() muzo iovzIl
soznam a viacI n-lIcI so slojnymI ivly. A naoal Iunlco list() muzo iovzIl zauanou n-lIcI
a viacI soznam. Z olIouu cInlu louy Iunlco tuple() soznam zmiazI a Iunlco naoal list()
iozuslI n-lIcI.
2.. N-lIco
78
2..1. N-lIco v hooIoovslom lonloxlu
N-lIco muzomo ouzIl v hooIoovslom lonloxlu, jalo naiIlIau v iIlazu if.
>>> def is_it_true(anything):
... if anything:
... print("yes, it's true")
... else:
... print("no, it's false")
...
>>> is_it_true(()) }1]
no, it's false
>>> is_it_true(('a', 'b')) }2]
yes, it's true
>>> is_it_true((False,)) }8]
yes, it's true
>>> type((False)) }4]
<class 'bool'>
>>> type((False,))
<class 'tuple'>
}1] Pizun n-lIco so v hooIoovslom lonloxlu vylounocujo jalo IaIso.
}2] LIhovoIn n-lIco s aIoso jounou oIozlou so vylounocujo jalo liuo.
}8] LIhovoIn n-lIco s aIoso jounou oIozlou so vylounocujo jalo liuo. Hounola oIozol jo
noouslaln. AIo co lauy uI la cila
}4] Poluu clcomo vylvoiIl n-lIcI s jouInou oIozlou, al musImo za lounolu iIsal cilu.
Poluu hyclom cilu noiIuaII, Pyllon hy sI mysIoI, zo jsmo jounouuso iIuaII nauhylocnou
uvojIcI zvoiol. Jo lo sIco noslouno, aIo n-lIco so lIm novylvoiI.
2..2. PiIiazonI vIco lounol najounou
NsIouujo aiunI iogiamloisl zlialla. V Pyllonu muzolo n-lIcI ouzIl io iIiazonI vIco lounol najounou.
>>> v = ('a', 2, True)
>>> (x, y, z) = v }1]
>>> x
'a'
>>> y
2
>>> z
True
2.. N-lIco
79
}1] v jo n-lIco o liocl ivcIcl a (x, y, z) jo n-lIco s liomI iomnnymI. PiIiazonI jouno uo uiulo
vouo l iIiazonI lazuo z lounol n-lIco v uo jounolIIvycl iomnnycl v uvouonom oiauI.
VyuzIl so lolo u vsomoznymI zusohy. Dojmo lomu, zo clcolo ojmonoval iauu lounol. K iyclIomu
iIiazonI o soh juoucIcl lounol muzolo vyuzIl zahuuovanou IunlcI range() a vIconsohno iIiazonI.
>>> (MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY, SUNDAY) = range(7) }1]
>>> MONDAY }2]
0
>>> TUESDAY
1
>>> SUNDAY
6
}1] Zahuuovan Iunlco range() vylviI osIounosl coIycl cIsoI. (Z loclnIclolo lIouIsla noviacI
Iunlco range() soznam anI n-lIcI, aIo itortnr. OuIIsnoslI so naucImo ozujI.) MONDAY, TUESDAY,
WEDNESDAY, THURSDAY, FRIDAY, SATURDAY, a SUNDAY jsou iomnno, lloio uoIInujomo. (Tonlo
iIlIau oclzI z mouuIu calendar, coz jo maIy zhavny mouuI, lloiy lIslno laIonui ouohn
jalo unIxovy iogiam cal. MouuI calendar uoIInujo io uny v lyunu coIocIsoIno lonslanly.)
}2] V lomlo olamzIlu m lazu z iomnnycl svou lounolu: Piomnn MONDAY jo iovna 0,
TUESDAY m lounolu 1 a lal uIo.
Soucasnolo iIiazonI vIco iomnnym muzomo vyuzIl lalo io vylvionI IunlcI, lloio viacojI vIco
lounol najounou. Jounouuso v nIcl vilImo n-lIcI so vsomI ozauovanymI lounolamI. Vo voIajIcIm
louu so l vysIoulu muzomo cloval jalo l jouno n-lIcI, noho joj muzomo iIiauIl uo vIco jounolIIvycl
iomnnycl. Tonlo ohial ouzIv iaua slanuaiunIcl yllonovslycl lnIlovon, vcoln mouuIu os.
O nm sI nco iolnomo v nsIouujIcI laIloIo.
2.6. MnozIny
MnozIna (sol) jo nousoiuanou loIolcI jouInocnycl lounol. Jouna mnozIna muzo ohsaloval lounoly
IIhovoInolo nomnIloInolo (ImmulahIo) ualovolo lyu. Poluu mmo l uIsozIcI uv mnozIny, muzo-
mo s nImI iovul slanuaiunI mnozInovo ooiaco, jalo jo sjounoconI, iunIl a iozuII mnozIn.
2.6.1. VylvoionI mnozIny
AIo nojuiIvo iohoimo zlIauy. MnozInu vylvoiImo snauno.
2.6. MnozIny
80
>>> a_set = {1} }1]
>>> a_set
{1}
>>> type(a_set) }2]
<class 'set'>
>>> a_set = {1, 2} }8]
>>> a_set
{1, 2}
}1] Poluu clcomo vylvoiIl mnozInu s jounou lounolou, uzaviomo lounolu uo sIozonycl zvoiol ({}).
}2] MnozIny jsou vo slulocnoslI ImIomonlovny jalo liIuy, aIo lIm so lou nohuuomo zalzoval.
}8] Poluu clcomo vylvoiIl mnozInu s vIco lounolamI, ouuIImo lounoly cilamI a vso uzaviomo
uo sIozonycl zvoiol.
MnozInu muzomo vylvoiIl I zo soznamu.
>>> a_list = ['a', 'b', 'mpilgrim', True, False, 42]
>>> a_set = set(a_list) }1]
>>> a_set }2]
{'a', False, 'b', True, 'mpilgrim', 42}
>>> a_list }8]
['a', 'b', 'mpilgrim', True, False, 42]
}1] K vylvoionI mnozIny zo soznamu ouzIjomo Iunlco set(). (PunlIcliI, lloiI vuI, jal jsou mno-
zIny ImIomonlovny, hy zuo ouollII, zo vo slulocnoslI nojuo o voInI Iunlco, aIo o vylvionI
Inslanco liIuy. J vm :Iuj, zo so o lomlo iozuIIu uozvIlo v lolo lnIzo ozujI. PiozalIm nm
huuo slacIl vul, zo set() so clov jalo Iunlco a zo viacI mnozInu.)
}2] Jal uz jsom so zmInII uiIvo, jouna mnozIna muzo ohsaloval lounoly IIhovoInolo ualovolo
lyu. A zmInII jsom so lalo, zo mnozIny jsou neu:oI0dun6. Talo mnozIna sI noamalujo u-
vounI oiauI ivlu v soznamu, lloiy hyI ouzIl l jojImu vylvoionI. Poluu hyslo uo mnozIny
iIuvaII uaIsI ivly, nohuuo sI mnozIna amaloval oiauI, v jalom jslo jo vlIuaII.
}8] PuvounI soznam zuslv nozmnn.
Zo zalIm nomlo l uIsozIcI zuno lounoly Zuny iohIom. Muzomo vylvoiIl izunou mnozInu.
>>> a_set = set() }1]
>>> a_set }2]
set()
>>> type(a_set) }8]
<class 'set'>
>>> len(a_set) }4]
0
>>> not_sure = {} }]
2.6. MnozIny
81
>>> type(not_sure)
<class 'dict'>
}1] K vylvoionI izuno mnozIny zavoImo set() hoz aigumonlu.
}2] Zohiazon ioiozonlaco izuno mnozIny vyau lioclu uIvn. OcolvaII jslo sIs nco jalo {}
TImlo zusohom so vyjauiujo izuny sIovnIl a no mnozIna. O sIovnIcIcl so uozvImo ozujI,
aIo josl v lolo laIloIo.
}8] Navzuoiy ouIvnoslI zohiazono ioiozonlaco lo slulocn je mnozIna...
}4] ...a lalo mnozIna noohsalujo zuno ivly.
}] Pizunou mnozInu noIzo vylvoiIl zIsom uvou sIozonycl zvoiol lvuII lIsloiIclym zuso-
hum ionosonym z Pyllonu 2. TImlo zusohom so vyjauiujo izuny sIovnIl a no mnozIna.
2.6.2. Iiava mnozIny
Do oxIslujIcI mnozIny muzomo iIuval lounoly uvma iuznymI zusohy: molouou add() a molouou
update().
>>> a_set = {1, 2}
>>> a_set.add(4) }1]
>>> a_set
{1, 2, 4}
>>> len(a_set) }2]
3
>>> a_set.add(1) }8]
>>> a_set
{1, 2, 4}
>>> len(a_set) }4]
3
}1] Moloua add() iohIi jouon aigumonl, lloiy muzo hyl IIhovoInolo ualovolo lyu, a iIuv
zauanou lounolu uo mnozIny.
}2] MnozIna lou m liI cIony.
}8] MnozIny jsou loIolcomI jouInocnycl lounol. Poluu uo mnozIny zlusImo iIual lounolu,
lloi so v nI jIz naclzI, nouuI lo nIc. NovznIlno clyha. Juo zlilla o izunou ooiacI.
}4] MnozIna m oI0d jon liI cIony.
>>> a_set = {1, 2, 3}
>>> a_set
{1, 2, 3}
>>> a_set.update({2, 4, 6}) }1]
>>> a_set }2]
{1, 2, 3, 4, 6}
2.6. MnozIny
82
>>> a_set.update({3, 6, 9}, {1, 2, 3, 5, 8, 13}) }8]
>>> a_set
{1, 2, 3, 4, 5, 6, 8, 9, 13}
>>> a_set.update([10, 20, 30]) }4]
>>> a_set
{1, 2, 3, 4, 5, 6, 8, 9, 10, 13, 20, 30}
}1] Moloua update() iohIi jouon aigumonl, iovnz mnozInu, a iIu vsoclny jojI cIony
uo uvounI mnozIny. Jo lo, jalo luyhyclom voIaII molouu add() io vsoclny cIony
mnozIny iouano aigumonlom.
}2] Piolozo cIIov mnozIna nomuzo ohsaloval jounu lounolu uvalil, uuIIcIlnI lounoly so IgnoiujI.
}8] Vo slulocnoslI muzolo molouu update() voIal s IIhovoInym oclom aigumonlu. Poluu jI zavo-
Ilo s uvma mnozInamI, moloua update() iIu vsoclny cIony z lazuo z iouanycl mnozIn
uo uvounI mnozIny (uuIIcIlnI lounoly so ioslocI).
}4] Moloua update() umI ziacoval ohjolly iuznycl ualovycl lyu, vcoln soznamu. Poluu jI
ioulo soznam, al moloua update() iIu uo uvounI mnozIny vsoclny cIony soznamu.
2.6.8. OusliaovnI oIozol z mnozIny
JounolIIvo lounoly Izo z mnozIny ouslianIl liomI zusohy. PivnI uva, discard() a remove(), so IIsI
v jouno maIo uiohnoslI.
>>> a_set = {1, 3, 6, 10, 15, 21, 28, 36, 45}
>>> a_set
{1, 3, 36, 6, 10, 45, 15, 21, 28}
>>> a_set.discard(10) }1]
>>> a_set
{1, 3, 36, 6, 45, 15, 21, 28}
>>> a_set.discard(10) }2]
>>> a_set
{1, 3, 36, 6, 45, 15, 21, 28}
>>> a_set.remove(21) }8]
>>> a_set
{1, 3, 36, 6, 45, 15, 28}
>>> a_set.remove(21) }4]
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
KeyError: 21
}1] Moloua discard() iohIi jouon aigumonl a zauanou lounolu ouohoio z mnozIny.
}2] Poluu molouu discard() voImo s lounolou, lloi v mnozIn nooxIslujo, noiovouo so nIc.
NovznIlno clyha. Juo o izunou ooiacI.
2.6. MnozIny
83
}8] Moloua remove() lalo iohIi lounolu jouInolo aigumonlu a lalo ousliaujo lounolu
z mnozIny.
}4] OuIIsnosl so iojovI v iIau, luy so zauan lounola v mnozIn nonaclzI. V lalovom
iIau moloua remove() vyvoI vyjImlu KeyError.
MnozIny, slojn jalo soznamy, ouoiujI molouu pop().
>>> a_set = {1, 3, 6, 10, 15, 21, 28, 36, 45}
>>> a_set.pop() }1]
1
>>> a_set.pop()
3
>>> a_set.pop()
36
>>> a_set
{6, 10, 45, 15, 21, 28}
>>> a_set.clear() }2]
>>> a_set
set()
>>> a_set.pop() }8]
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
KeyError: 'pop from an empty set'
}1] Moloua pop() ouslianI jouon ivol z mnozIny a vilI jolo lounolu. AIo mnozIny jsou nouso-
iuano a nooxIslujo u nIcl nIc lalovolo jalo ,osIounI lounola. Piolo lalo nooxIslujo moznosl
ovIIvnIl, lloi lounola huuo ouslianna. Jo lo zcoIa nlouno.
}2] Moloua clear() od:|run vsoclny ivly mnozIny a mnozIna so slano izunou. Vo vysIoulu jo
lo slojno jalo iovouonI iIlazu a_set = set(), lloiy vylvoiI novou izunou mnozInu
a ioIso uvounI lounolu iomnno a_set.
}8] Polus o voInI molouy pop() io izunou mnozInu vouo l vyvoInI vyjImly KeyError.
2.6.4. Bzno mnozInovo ooiaco
Pyllonovsly ualovy ly set ouoiujo nloIIl hznycl mnozInovycl ooiacI.
>>> a_set = {2, 4, 5, 9, 12, 21, 30, 51, 76, 127, 195}
>>> 30 in a_set }1]
True
>>> 31 in a_set
False
>>> b_set = {1, 2, 3, 5, 6, 8, 9, 12, 15, 17, 18, 21}
2.6. MnozIny
84
>>> a_set.union(b_set) }2]
{1, 2, 195, 4, 5, 6, 8, 12, 76, 15, 17, 18, 3, 21, 30, 51, 9, 127}
>>> a_set.intersection(b_set) }8]
{9, 2, 12, 5, 21}
>>> a_set.difference(b_set) }4]
{195, 4, 76, 51, 30, 127}
>>> a_set.symmetric_difference(b_set) }]
{1, 3, 4, 6, 8, 76, 15, 17, 18, 195, 127, 30, 51}
}1] Poluu clcomo olosloval, zua jo uan lounola ivlom mnozIny, ouzIjomo ooiloi in. Iungujo
slojnym zusohom jalo u soznamu.
}2] Moloua union() (sjounoconI) viacI novou mnozInu, lloi ohsalujo vsoclny ivly jal z jouno,
lal z uiulo mnozIny.
}8] Moloua intersection() (iunIl) viacI novou mnozInu, lloi ohsalujo vsoclny ivly naclzo-
jIcI so v ohou mnozIncl soucasn.
}4] Moloua difference() (iozuII) viacI novou mnozInu ohsalujIcI vsoclny ivly, lloio so nacl-
zojI v mnozIn a_set, aIo nonaclzojI so v mnozIn b_set.
}] Moloua symmetric_difference() (symoliIcly iozuII) viacI novou mnozInu ohsalujIcI vsoclny
ivly, lloio so naclzojI iv v jouno z mnozIn.
TiI z lcllo molou jsou symoliIclo.
# Pokraovn pedchozho pkladu
>>> b_set.symmetric_difference(a_set) }1]
{3, 1, 195, 4, 6, 8, 76, 15, 17, 18, 51, 30, 127}
>>> b_set.symmetric_difference(a_set) == a_set.symmetric_difference(b_set) }2]
True
>>> b_set.union(a_set) == a_set.union(b_set) }8]
True
>>> b_set.intersection(a_set) == a_set.intersection(b_set) }4]
True
>>> b_set.difference(a_set) == a_set.difference(b_set) }]
False
}1] SymoliIcly iozuII mnozIn a_set ou b_set vyud0 jInal noz symoliIcly iozuII mnozIn b_set
ou a_set. AIo amalujlo na lo, zo mnozIny jsou nousoiuano. JaloloIIv uv mnozIny, jojIclz
vsoclny lounoly so slouujI (zun nosmI hyl vynoclna), so ovazujI za slouno.
}2] A iosn lonlo iIau naslaI zuo. Nonocllo so zmsl ioiozonlacomI lcllo mnozIn zohiazony-
mI yllonovslym sloIIom. OhsalujI slojno lounoly, lalzo jsou slouno.
}8] SjounoconI uvou mnozIn jo lalo symoliIclo.
}4] PiunIl uvou mnozIn jo iovnz symoliIcly.
}] RozuII uvou mnozIn symoliIcly nonI. Ono lo uv smysI. Pouoh so lo oucIlnI jounolo cIsIa
ou uiulolo. Na oiauI ooianuu zuo zIozI.
2.6. MnozIny
85
A nalonoc lu mmo nloIIl olzol, lloio muzomo mnozInm oIozIl.
>>> a_set = {1, 2, 3}
>>> b_set = {1, 2, 3, 4}
>>> a_set.issubset(b_set) }1]
True
>>> b_set.issuperset(a_set) }2]
True
>>> a_set.add(5) }8]
>>> a_set.issubset(b_set)
False
>>> b_set.issuperset(a_set)
False
}1] MnozIna a_set jo oumnozInou mnozIny b_set vsoclny ivly mnozIny a_set jsou soucas-
n ivly mnozIny b_set.
}2] Slojnou olzlu muzomo oIozIl ohicon. MnozIna h_sol jo naumnozInou mnozIny a_sol, io-
lozo vsoclny ivly mnozIny a_set jsou soucasn ivly mnozIny b_set.
}8] JalmIIo uo mnozIny a_set iIumo lounolu, lloi so v mnozIn b_set nonaclzI, oha losly
vilI lounolu False.
2.6.. MnozIny v hooIoovslom lonloxlu
MnozIny muzomo ouzIl v hooIoovslom lonloxlu, naiIlIau v iIlazu if.
>>> def is_it_true(anything):
... if anything:
... print("yes, it's true")
... else:
... print("no, it's false")
...
>>> is_it_true(set()) }1]
no, it's false
>>> is_it_true({'a'}) }2]
yes, it's true
>>> is_it_true({False}) }8]
yes, it's true
}1] Pizun mnozIna so v hooIoovslom lonloxlu vylounocujo jalo IaIso.
}2] LIhovoIn mnozIna s aIoso jounIm ivlom so vylounocujo jalo liuo.
}8] LIhovoIn mnozIna s aIoso jounIm ivlom so vylounocujo jalo liuo.
Hounola ivlu jo noouslaln.
2.6. MnozIny
86
2.7. SIovnIly
SIovnIl (uIclIonaiy) jo nousoiuan loIolco uvojIc lIIc-lounola. Kuyz uo sIovnIlu iIumo lIIc,
musImo uo nj soucasn iIual I lounolu, lloi lo lIIcI aliI. (Hounolu muzomo v huuoucnu luyloIIv
zmnIl.) Pyllonovslo sIovnIly jsou olImaIIzovano io zIslvnI lounoly l zauanomu lIIcI, aIo no
naoal.
> Pyllonovsly sIovnIl so clov jalo lasl (clI }los]; vylIouvacI lahuIla) v PoiI . V jazyco PoiI
zacInajI iomnno lyu lasl vzuy znalom %. Pyllonovslo iomnno molou hyl ojmonovny
zcoIa IIhovoIn. Pyllon sI vnIlin ovIuujo jojIcl ualovy ly.
2.7.1. VylvoionI sIovnIlu
SIovnIl vylvoiImo snauno. Synlaxo so ouoh mnozInovo, aIo mIslo oulo lounoly zauvmo uvojIco
lIIc-lounola. JalmIIo sIovnIl oxIslujo, muzomo v nm vylIouval lounoly ouIo jojIcl lIIco.
>>> a_dict = {'server': 'db.diveintopython3.org', 'database': 'mysql'} }1]
>>> a_dict
{'server': 'db.diveintopython3.org', 'database': 'mysql'}
>>> a_dict['server'] }2]
'db.diveintopython3.org'
>>> a_dict['database'] }8]
'mysql'
>>> a_dict['db.diveintopython3.org'] }4]
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
KeyError: 'db.diveintopython3.org'
}1] NojuiIvo vylvoiImo sIovnIl s uvma oIozlamI a iIiauImo lo uo iomnno a_dict.
Kazu oIozla jo lvoiona uvojIcI lIIc-lounola a coIy vycol oIozol jo uzavion
vo sIozonycl zvoilcl.
}2] Rolzoc 'server' jo zuo lIIcom a l nmu iIuiuzonou lounolou, na lloiou so oulzomo
zIsom a_dict['server'], jo 'db.diveintopython3.org'.
}8] Rolzoc 'database' jo zuo lIIcom. K nmu iIuiuzonou lounolou, na lloiou so oulzomo
zIsom a_dict['database'], je 'mysql'.
}4] Hounoly muzomo zIslal na zlIau lIIco, aIo lIIco nomuzomo zIslal na zlIau
znaIoslI lounoly. Talzo a_dict['server'] ohsalujo 'db.diveintopython3.org', aIo
a_dict['db.diveintopython3.org'] vyvoI vyjImlu, iolozo 'db.diveintopython3.org'
nonI lIIcom.
2.7. SIovnIly
87
2.7.2. Iiava sIovnIlu
SIovnIly nomajI zuno iouom uicono omozonI voIIloslI. DvojIcI lIIc-lounola muzomo uo sIovnIlu
iIual luyloIIv. Noho muzomo mnIl lounolu iIsIusojIcI lo lIIcI. PoliacovnI iouclozIlo iIlIauu:
>>> a_dict
{'server': 'db.diveintopython3.org', 'database': 'mysql'}
>>> a_dict['database'] = 'blog' }1]
>>> a_dict
{'server': 'db.diveintopython3.org', 'database': 'blog'}
>>> a_dict['user'] = 'mark' }2]
>>> a_dict }8]
{'server': 'db.diveintopython3.org', 'user': 'mark', 'database': 'blog'}
>>> a_dict['user'] = 'dora' }4]
>>> a_dict
{'server': 'db.diveintopython3.org', 'user': 'dora', 'database': 'blog'}
>>> a_dict['User'] = 'mark' }]
>>> a_dict
{'User': 'mark', 'server': 'db.diveintopython3.org', 'user': 'dora', 'database': 'blog'}
}1] Vo sIovnIlu so nomolou naclzol uuIIcIlnI lIIco. Poluu iIiauImo lounolu l oxIslujIcImu
lIIcI, uojuo l iosnI uvounI lounoly.
}2] DvojIcI lIIc-lounola muzomo iIual luyloIIv. Talo synlaxo so slouujo s iIauom zmny
oxIslujIcIcl lounol.
}8] Nov oIozla sIovnIlu (lIIc 'user', lounola 'mark') so ohjovIIa uiosliou. To, zo so u ivnIlo
iIlIauu oIozly ohjovIIy soiazono, hyIa oul nloua. Slojn nloua jo lo, zo so nynI jovI
jalo iozlzono.
}4] PiIiazonI lounoly l oxIslujIcImu lIIcI sIovnIlu vouo l ioslo nliau slaio lounoly novou.
}] ZmnI so lImlo iIlazom lounola lIIco user zl na ,mail NIloIIv! PiolIounlo sI lIIc
oiun. V iolzcI User jo nasno voIlo U. KIIco sIovnIlu jsou cIlIIvo na voIIlosl Ismon,
lalzo lonlo iIlaz vylviI novou uvojIcI lIIc-lounola a oxIslujIcI lounolu noioIso. KIIc
so vm sIco muzo zul ouohny, aIo z olIouu Pyllonu jo In jIny.
2.7.8. SIovnIly so smIsonym ohsalom
SIovnIly nojsou uicony jon io iolzco. Hounoly vo sIovnIlu molou hyl IIhovoInolo ualovolo lyu
vcoln coIycl cIsoI, hooIoovslycl lounol, IIhovoInycl ohjollu noho uolonco sIovnIlu. IvnIli jounolo
sIovnIlu nomusI hyl vsoclny lounoly slojnolo lyu. Muzomo jo mIclal ouIo oliohy. KIIco sIovnIlu
majI vlsI omozonI, aIo molou hyl lyu iolzoc, coIo cIsIo a nloIIla uaIsIcl lyu. Dalovo lyy lIIcu
v jounom sIovnIlu muzomo lalo mIclal.
2.7. SIovnIly
88
So sIovnIly s noiolzcovymI lIIcI a lounolamI jsmo so vIasln uz sollaII v laIloIo Vs ivnI yllo-
novsly iogiam.
SUFFIXES = {1000: ['KB', 'MB', 'GB', 'TB', 'PB', 'EB', 'ZB', 'YB'],
1024: ['KiB', 'MiB', 'GiB', 'TiB', 'PiB', 'EiB', 'ZiB', 'YiB']}
Tou lo v InloiallIvnIm sloIIu iozluclmo.
>>> SUFFIXES = {1000: ['KB', 'MB', 'GB', 'TB', 'PB', 'EB', 'ZB', 'YB'],
... 1024: ['KiB', 'MiB', 'GiB', 'TiB', 'PiB', 'EiB', 'ZiB', 'YiB']}
>>> len(SUFFIXES) }1]
2
>>> 1000 in SUFFIXES }2]
True
>>> SUFFIXES[1000] }8]
['KB', 'MB', 'GB', 'TB', 'PB', 'EB', 'ZB', 'YB']
>>> SUFFIXES[1024] }4]
['KiB', 'MiB', 'GiB', 'TiB', 'PiB', 'EiB', 'ZiB', 'YiB']
>>> SUFFIXES[1000][3] }]
'TB'
}1] Iunlco len(), ouohn jalo u soznamu a mnozIn, viacI ocol lIIcu vo sIovnIlu.
}2] A slojn jalo u soznamu a mnozIn muzomo ouzIl ooiloi in l loslovnI, zua jo zauany lIIc
vo sIovnIlu uoIInovn.
}4] CIsIo 1000 je lIIcom vo sIovnIlu SUFFIXES. Jolo lounolou jo soznam osmI oIozol (osmI iolz-
cu, ahyclom hyII iosnI).
}] A ouohn I cIsIo 1024 jo lIIcom vo sIovnIlu SUFFIXES. Jolo lounolou jo lalo soznam
s osmI oIozlamI.
}6] A iolozo SUFFIXES[1000] ohsalujo soznam, muzomo jolo jounolIIvo ivly ziIsluoval
iosliounIclvIm Inuoxu (ou nuIy).
2.7.4. SIovnIly v hooIoovslom lonloxlu
SIovnIl muzomo ouzIl v hooIoovslom lonloxlu,
jalo naiIlIau v iIlazu if.
2.7. SIovnIly
Przdn slovnky se vyhodnocuj
jako false, vechny ostatn
slovnky jako true.
89
>>> def is_it_true(anything):
... if anything:
... print("yes, it's true")
... else:
... print("no, it's false")
...
>>> is_it_true({}) }1]
no, it's false
>>> is_it_true({'a': 1}) }2]
yes, it's true
}1] Pizuny sIovnIl so v hooIoovslom lonloxlu vylounocujo jalo IaIso.
}2] SIovnIl s aIoso jounou uvojIcI lIIc-lounola so vylounocujo jalo liuo.
2.8. None
Nono }nan] jo socIInI yllonovslou lonslanlou. Vyjauiujo zunou lounolu. AIo Nono nonI loloz
co False. Nono nonI nuIa. Nono nonI izuny iolzoc. Poluu oiovnmo None s cImloIIv jInym
noz s None, vzuycly uoslanomo False.
None jo jouInou ,zunou lounolou. M svuj vIaslnI ualovy ly (NoneType). Hounolu None muzomo
iIiauIl uo IIhovoIno iomnno, aIo nomuzomo vylvoiIl jIny ohjoll lyu NoneType. Vsoclny iomnno,
jojIclz lounola jo None, jsou vzjomn slouno.
>>> type(None)
<class 'NoneType'>
>>> None == False
False
>>> None == 0
False
>>> None == ''
False
>>> None == None
True
>>> x = None
>>> x == None
True
>>> y = None
>>> x == y
True
2.8. None
90
2.8.1. None v hooIoovslom lonloxlu
V hooIoovslom lonloxlu so None vylounocujo jalo false a not None jalo liuo.
>>> def is_it_true(anything):
... if anything:
... print("yes, it's true")
... else:
... print("no, it's false")
...
>>> is_it_true(None)
no, it's false
>>> is_it_true(not None)
yes, it's true
2.u. Piocllo sI
- Bnnloun nporutinns (hooIoovslo ooiaco)
- Numoric typos (cIsoIno lyy)
- Soquonco typos (lyy osIounoslI)
- Sot typos (mnozInovo lyy)
- Mupping typos (maovacI lyy, vylIouvacI lahuIly)
(vso na lll:lluocs.yllon.oigly8llIIhiaiylslulyos.llmI)
- mndul fractions (zIomly)
(lll:lluocs.yllon.oigly8llIIhiaiylIiaclIons.llmI)
- mndul math (malomalIcly)
(lll:lluocs.yllon.oigly8llIIhiaiylmall.llmI)
- PEP Z87: Unifying Lnng Intogors und Intogors (sjounoconI voIlycl coIycl cIsoI a coIycl cIsoI)
(lll:llvvv.yllon.oigluovloslo-u287l)
- PEP Z88: Chunging tho Divisinn Oporutnr (zmna ooiloiu uIonI)
(lll:llvvv.yllon.oigluovloslo-u288l)
2.u. Piocllo sI
91
3. Genertorov notace
8. KaIloIa
Our imagination is stretched to the utmost, not, as in
fiction, to imagine things which are not really there,
but just to comprehend those things which are.
(Naso iouslavIvosl jo najal uo liajnoslI. No jalo
u IIlco, ahyclom sI iouslavIII vcI, lloio zuo nojsou,
aIo iolo, ahyclom jon ohslII vcI, lloio jsou zuo.)
RIclaiu Ioynman
92
3. Genertorov notace 91
8.1. Ponoimo so 93
8.2. Pico so souhoiy a s auiosiI 93
8.2.1. AlluInI iacovnI auiosi 93
8.2.2. Pico so jmony souhoiu a auiosiu 94
8.2.8. VyIs auiosiu 96
8.2.4. ZIslnI uaIsIcl InIoimacI o souhoiu 97
8.2.. Jal vylvoiIl ahsoIulnI cosly 98
8.8. Gonoiloiov nolaco soznamu 98
8.4. Gonoiloiov nolaco sIovnIlu 100
8.4.1. DaIsI Iogicly s gonoiloiovou
nolacI sIovnIlu 102
8.. Gonoiloiov nolaco mnozIn 103
8.6. Piocllo sI 103
Ohsal laIloIy
93
8.1. Ponoimo so
V lazuom iogiamovacIm jazyco najuomo uicIly iys, lloiy zmin zjounouusujo njalou lomIIlo-
vanou vc. Poluu iIclzIlo so zlusonoslmI z jInolo jazyla, muzolo lo snauno iolIounoul, iolozo
vs slaiy jazyl iv lu uicIlou vc nozjounouusovaI (iolozo uaIo icI mIslo lolo zjounouusIl nco
jInolo). V lolo laIloIo so soznmImo s gonoiloiovou nolacI soznamu (IIsl comiolonsIons), s gono-
iloiovou nolacI sIovnIlu (uIclIonaiy comiolonsIons) a s gonoiloiovou nolacI mnozIn (sol comio-
lonsIons). Juo o liI souvIsojIcI loncoly, jojIclz juiom jo jouna voImI mocn loclnIla. AIo nojuiIvo sI
uuImo maIou ouhoclu lo uvma mouuIum, lloio vm usnaunI oiIonlacI vo vasom IolInIm souhoio-
vom syslomu.
8.2. Pico so souhoiy a s auiosiI
Pyllon 8 so uouv s mouuIom zvanym os, coz jo zlialla io ,ooiacnI syslom. MouuI os ohsalujo
souslu IunlcI io zIslvnI InIoimacI o IolInIcl auiosiIcl, souhoiocl, iocosocl a iomnnycl
iosliouI a v nlloiycl iIauocl s nImI umozujo manIuIoval. Pyllon so snazI co nojIoo, ahy
io vsoclny ouoiovano ooiacnI syslomy nahIzoI jounolno API (aIIlacnI iogiamovo iozlianI).
CIIom jo, ahy vaso iogiamy hzoIy na IIhovoInom ocIlacI a ahy iIlom ohsalovaIy co nojmon louu,
lloiy hy hyI zvIsIy na IalIoim.
8.2.1. AlluInI iacovnI auiosi
Poluu s Pyllonom iv zacInlo, slivIlo josl loun casu v yllonovslom sloIIu. V coIo lnIzo so
huuolo sollval s iIlIauy, jalo jo lonlo:
1. Imoilujlo jouon z mouuIu naclzojIcIcl so v auiosiI examples (iIlIauy).
2. ZavoIojlo IunlcI z lololo mouuIu.
8. VysvlIolo vysIouly.
Poluu o alluInIm iacovnIm auiosiI nIc novIlo,
al liol 1 iavuouohn soIzo a ohjovI so vyjImla
ImportError. Pioc Piolozo Pyllon so huuo o mouuIu
uIval vo vylIouvacI cosl io Imoil, aIo nonajuo
joj, iolozo auiosi examples so v zunom auiosiI
z vylIouvacI cosly nonaclzI. Ahy lo iosIo, muzolo
uuIal jounu zo uvou vcI:
1. Auiosi examples iIulo uo vylIouvacI cosly io Imoil.
2. ZmnIlo alluInI iacovnI auiosi na examples.
8.1. Ponoimo so
8.2. Pico so souhoiy a s auiosiI
Vdy existuje to, emu se k
aktuln pracovn adres.
94
AlluInI iacovnI auiosi jo novIuIloIny uaj, lloiy sI Pyllon nouslIo uuizujo v amlI. AlluInI
iacovnI auiosi oxIslujo vzuy al uz jslo v yllonovslom sloIIu, souslIlo svuj vIaslnI yllonovsly
sliIl z iIlazovolo iulu noho souslIlo yllonovsly CGI sliIl na njalom vohovom soivoiu.
Pio vyoiunI so s alluInIm iacovnIm auiosiom nahIzI mouuI os uv Iunlco.
>>> import os }1]
>>> print(os.getcwd()) }2]
C:\Python31
>>> os.chdir('/Users/pilgrim/diveintopython3/examples') }8]
>>> print(os.getcwd()) }4]
C:\Users\pilgrim\diveintopython3\examples
}1] MouuI os jo soucslI Pyllonu. Muzolo joj Imoiloval luyloIIv a luoloIIv.
}2] InIoimacI o alluInIm iacovnIm auiosiI zIsllo ouzIlIm Iunlco os.getcwd(). Poluu ouzIvlo
giaIIcly yllonovsly sloII, al so alluInI iacovnI auiosi zocllu naclzI v auiosiI,
vo lloiom jo umIsln suslIloIny iogiam yllonovslolo sloIIu. PiI icI ou WInuovs lo
zIozI na lom, lam jslo Pyllon naInslaIovaII. VyclozI auiosi jo c:\Python31. Poluu ouzIvlo
lonzoIovy yllonovsly sloII, al so alluInI iacovnI auiosi zocllu naclzI v auiosiI,
vo lloiom jslo suslIII python3.
}8] AlluInI iacovnI auiosi muzomo mnIl ouzIlIm Iunlco os.chdir().
}4] PiI voInI Iunlco os.chdir() jsom ouzII coslu v IInuxovom slyIu (noimInI IomIlla, zuno
Ismono uIslu), I luyz iacujI ou WInuovs. To jo iv jouno z mIsl, luo so Pyllon snazI
zamasloval iozuIIy mozI ooiacnImI syslomy.
8.2.2. Pico so jmony souhoiu a auiosiu
Kuyz uz so havImo o auiosiIcl, cllI hycl vs uozoinIl na mouuI os.path. Ton ohsalujo Iunlco
io manIuIaco so jmony souhoiu a auiosiu.
>>> import os
>>> print(os.path.join('/Users/pilgrim/diveintopython3/examples/', 'humansize.py')) }1]
/Users/pilgrim/diveintopython3/examples/humansize.py
>>> print(os.path.join('/Users/pilgrim/diveintopython3/examples', 'humansize.py')) }2]
/Users/pilgrim/diveintopython3/examples\humansize.py
>>> print(os.path.expanduser('~')) }8]
c:\Users\pilgrim
>>> print(os.path.join(os.path.expanduser('~'), 'diveintopython3', 'examples', 'humansize.py')) }4]
c:\Users\pilgrim\diveintopython3\examples\humansize.py
}1] Iunlco os.path.join() soslavI coslu z jouno noho vIco cslI cosly.
V lomlo iIau jounouuso sojI iolzco.
8.2. Pico so souhoiy a s auiosiI
95
}2] Tonlo iIlIau uz nonI lal jounouucly. Iunlco os.path.join() iou naojonIm jmona souhoiu
navIc iIu l cosl jouno IomIllo. MIslo ohycojnolo IomIlla ouzIIa zlno IomIllo, iolozo
jsom lonlo iIlIau ouslI ou WInuovs. Poluu hyslo slojny iIlIau zlousoII na syslomocl
LInux noho Mac OS X, ouzIIo hy so noimInI IomIllo. Noiojlo so s IomIlly. PouzIvojlo vzuy
os.path.join() a noclojlo na Pyllonu, ahy uuIaI, co jo sivno.
}8] Iunlco os.path.expanduser() iozoIso coslu, lloi io vyjuionI uomcIlo auiosio alluI-
nIlo uzIvaloIo ouzIv znal ~. Iungujo lo na IIhovoIno IalIoim, luo majI uzIvaloIo iIuIony
svuj uomcI auiosi, louy na LInuxu, Mac OS X a vo WInuovs. Vicon cosla noohsalujo lon-
covo IomIllo, aIo lo IunlcI os.path.join() novauI.
}4] KomhInovnIm lcllo loclnIl muzomo snauno lonsliuoval cosly uo auiosiu a l souhoium,
lloio so naclzojI v uzIvaloIov uomcIm auiosiI. Iunlco os.path.join() iohIi IIhovoIny
ocol aigumonlu. JalmIIo jsom lo zjIslII, sllaI jsom iauoslI, iolozo iI iIiav mycl nslioju
v njalom novom jazyco jo addSlashIfNecessary() (iIuojLomIlloPoluuJoToNulno) jounou
z lcl oliavnycl maIycl IunlcI, lloio sI musIm vzuy znovu nasal. V Pyllonu lalovou IunlcI
ne:|e. ClyliI IIuo uz so o lo oslaiaII za vs.
MouuI os.path ohsalujo lalo Iunlco, lloio umI iozuIIl Ino cosly, jmona auiosiu a souhoiu na jojIcl
ouslalno cslI.
>>> pathname = '/Users/pilgrim/diveintopython3/examples/humansize.py'
>>> os.path.split(pathname) }1]
('/Users/pilgrim/diveintopython3/examples', 'humansize.py')
>>> (dirname, filename) = os.path.split(pathname) }2]
>>> dirname }8]
'/Users/pilgrim/diveintopython3/examples'
>>> filename }4]
'humansize.py'
>>> (shortname, extension) = os.path.splitext(filename) }]
>>> shortname
'humansize'
>>> extension
'.py'
}1] Iunlco split iozuII Inou coslu a vilI n-lIcI, lloi ohsalujo zvIsl coslu a zvIsl jmono souhoiu.
}2] Pamalujolo sI, zo jsmo so havIII o moznoslI viacol vIco lounol z Iunlco iIiazonIm lounol vIco
iomnnym najounou Iunlco os.path.split() uI iosn lolIo. VysIouol Iunlco split
iIiauImo uo n-lIco s uvma iomnnymI. Kazu z iomnnycl zIsl lounolu ouovIuajIcIlo
ivlu viacono uvojIco.
}8] PivnI iomnn, uIinamo, ohuizI lounolu ivnIlo ivlu n-lIco, lloiou viacI Iunlco os.all.
split(), a sIco coslu l souhoiu.
}4] Diul iomnn, filename, ohuizI lounolu uiulolo ivlu n-lIco viacono IunlcI os.path.
split(), jmono souhoiu.
8.2. Pico so souhoiy a s auiosiI
96
}] MouuI os.path ohsalujo lalo IunlcI os.path.splitext(), lloi iozuII jmono souhoiu a viacI
uvojIcI ohsalujIcI jmono souhoiu hoz iIony a iIonu. Pio jojIcl iIiazonI uo ouuIonycl
iomnnycl ouzIjomo slojnou loclnIlu.
8.2.8. VyIs auiosiu
DaIsIm nsliojom z yllonovslo slanuaiunI lnIlovny jo
mouuI glob. ImoznI nm z iogiamu snauno zIslal ohsal
njalolo auiosio. PouzIv ly zslunycl znalu (vIIu-
caius), lloio uz asI znlo z ico na iIlazovom iulu.
>>> os.chdir('/Users/pilgrim/diveintopython3/')
>>> import glob
>>> glob.glob('examples/*.xml') }1]
['examples\\feed-broken.xml',
'examples\\feed-ns0.xml',
'examples\\feed.xml']
>>> os.chdir('examples/') }2]
>>> glob.glob('*test*.py') }8]
['alphameticstest.py',
'pluraltest1.py',
'pluraltest2.py',
'pluraltest3.py',
'pluraltest4.py',
'pluraltest5.py',
'pluraltest6.py',
'romantest1.py',
'romantest10.py',
'romantest2.py',
'romantest3.py',
'romantest4.py',
'romantest5.py',
'romantest6.py',
'romantest7.py',
'romantest8.py',
'romantest9.py']
}1] MouuI glob ziacovv maslu so zslunym znalom a viacI cosly lo vsom souhoium a auios-
ium, lloio masco so zslunym znalom ouovIuajI. V lomlo iIlIauu jo masla sIozona z cosly
uo auiosio a z *.xml. Buuou jI ouovIual vsoclny .xml souhoiy v ouauiosiI oxamIos.
8.2. Pico so souhoiy a s auiosiI
Modul glob pouv shellovsk
zstupn znaky.
97
}2] Tou jalo alluInI iacovnI auiosi zvoIImo ouauiosi oxamIos. Iunlco os.chdir() umI
iacoval I s ioIalIvnImI coslamI.
}8] Vo vzoilu io IunlcI glob muzomo ouzIl vIco zslunycl znalu. Tonlo iIlIau naIozno
v alluInIm iacovnIm auiosiI vsoclny souhoiy, lloio loncI iIonou .py a luoloIIv
vo jmon souhoiu ohsalujI sIovo test.
8.2.4. ZIslnI uaIsIcl InIoimacI o souhoiu
Kazuy mouoinI souhoiovy syslom ulIu o lazuom souhoiu molauala, jalo jsou: ualum vylvoionI,
ualum osIounI mouIIIlaco, voIIlosl souhoiu alu. Pio ziIslunnI lcllo molaual oslylujo Pyllon
jounolno API. Souhoi so nomusI olovIial. Vso, co oliohujolo znl, jo jolo jmono.
>>> import os
>>> print(os.getcwd()) }1]
c:\Users\pilgrim\diveintopython3\examples
>>> metadata = os.stat('feed.xml') }2]
>>> metadata.st_mtime }8]
1247520344.9537716
>>> import time }4]
>>> time.localtime(metadata.st_mtime) }]
time.struct_time(tm_year=2009, tm_mon=7, tm_mday=13, tm_hour=17,
tm_min=25, tm_sec=44, tm_wday=0, tm_yday=194, tm_isdst=1)
}1] AlluInIm iacovnIm auiosiom jo sIozla examples.
}2] feed.xml jo souhoi vo sIozco oxamIos. VoInIm Iunlco os.stat() zIslmo ohjoll, lloiy ohsa-
lujo nloIIl iuznycl lyu InIoimacI o souhoiu (molaual).
}8] st_mtime zaclycujo cas osIounI mouIIIlaco, aIo nonI uIozon vo lvaiu, lloiy hy hyI moc ou-
zIloIny. (Z loclnIclolo olIouu jo lo ocol solunu ou Locly, luo Locla jo uoIInovna jalo
ivnI solunua 1. Iouna 1u7u. Vzn!)
}4] MouuI time jo soucslI slanuaiunI yllonovslo lnIlovny. Ohsalujo Iunlco io iovouy mozI
iuznymI ioiozonlacomI casu, io IoimlovnI casu uo iolzcovo ouohy a io lianI sI s caso-
vymI zonamI.
}] Iunlco time.localtime() iovuI lounolu casu zo solunu-ou-Locly (z oIozly st_mtime
ohjollu viaconolo IunlcI os.stat()) na ouzIloInjsI sliulluiu ohsalujIcI iol, msIc, uon,
louInu, mInulu, solunuu alu. Tonlo souhoi hyI naosIouy zmnn 18. coivonco 2uuu iIhIIzn
v 17 louIn a 2 mInul.
8.2. Pico so souhoiy a s auiosiI
98
# pokraovn pedchozho pkladu
>>> metadata.st_size }1]
3070
>>> import humansize
>>> humansize.approximate_size(metadata.st_size) }2]
'3.0 KiB'
}1] Iunlco os.stat() viacI lalo voIIlosl souhoiu, a lo v oIozco st_size. Souhoi feed.xml ohsa-
lujo 3070 hajlu.
}2] PoIozlu st_size muzomo ioual IunlcI approximate_size().
8.2.. Jal vylvoiIl ahsoIulnI cosly
V iouclzojIcI oulaIloIo jsmo voInIm Iunlco glob.glob() zIslaII soznam s ioIalIvnImI coslamI.
V ivnIm iIlIauu jsmo zIslaII cosly jalo 'examples\feed.xml'. V uiulom iIlIauu jsmo zIslaII
uolonco josl lialsI ioIalIvnI cosly jalo 'romantest1.py'. Za iouolIauu, zo zuslanomo vo slojnom
iacovnIm auiosiI, muzomo lylo ioIalIvnI cosly ouzIval io olovionI souhoiu noho io zIslvnI
jojIcl molaual. AIo oluu clcomo vylvoiIl ahsoIulnI coslu lj. lalovou, lloi ohsalujo jmona
vsocl auiosiu az o loionovy auiosi noho vcoln jmona uIslu , huuomo oliohoval IunlcI
os.path.realpath().
>>> import os
>>> print(os.getcwd())
c:\Users\pilgrim\diveintopython3\examples
>>> print(os.path.realpath('feed.xml'))
c:\Users\pilgrim\diveintopython3\examples\feed.xml
8.8. Gonoiloiov nolaco soznamu
Gonoiloiov nolaco soznamu (angIIcly IIsl comiolonsIon }IIsl lomiIlonsn]) umozujo sliucny z-
Is vylvoionI soznamu z jInolo soznamu aIIlovnIm Iunlco na vsoclny ivly zuiojovolo soznamu.
(Poznmla iolIaualoIo: Pojom ,IIsl comiolonsIon jo znm z uolIaialIvnIcl jazylu a m claialloi
synlallIclo lonsliulco. V jazyco Pyllon so ,vnIlilu
uolIaialIvnIlo zIsu ouoh gonoiloiovy vyiaz. TImlo
zusohom hyI ouvozon cosly ojom ,gonoiloiov nola-
co. Nluy jo ojom ,IIsl comiolonsIon ouzIl v ioco-
uuiInIm, uynamIclom smysIu. V lalovo sIluacI muzomo
uvazoval o ojmu ,gonoiloi soznamu. Poluu so havImo
o jolo vysIoulu, muzomo uvazoval I o ojmu ,gonoiovany
8.8. Gonoiloiov nolaco soznamu
V genertorov notaci seznamu
meme pout libovoln
pythonovsk vraz.
99
soznam. VzlIouom l lomu, zo zavouony cosly ojom io lulo lonsliulcI asI nooxIslujo sluuonlum
iIsIusnycl ohoiu vysolycl sloI iIjuo o lillo clvIII angIIcly ojom siozumIloIny , huuu voInjI
ouzIval nlloiou z uvouonycl vaiIanl. Nluy huuu onluu uIouly ojom ,gonoiloiov nolaco
soznamu zliacoval. KiIloiIom voIhy huuo uohi siozumIloInosl.)
>>> a_list = [1, 9, 8, 4]
>>> [elem * 2 for elem in a_list] }1]
[2, 18, 16, 8]
>>> a_list }2]
[1, 9, 8, 4]
>>> a_list = [elem * 2 for elem in a_list] }8]
>>> a_list
[2, 18, 16, 8]
}1] Ahy nm lo zacaIo uval smysI, ouIvojmo so na zIs ziava uoIova. Soznam a_list jo zuo
zuiojom zohiazonI. Inloiiol jazyla Pyllon ioclzI soznam a_list o jounom ivlu a uocas-
n iIiazujo jolo lounolu uo iomnno elem. Polo Pyllon aIIlujo IunlcI elem * 2 a iIojI
vysIouol na lonoc cIIovolo soznamu.
}2] Gonoiloiov nolaco iouulujo novy soznam. PuvounI soznam zuslv nozmnny.
}8] VysIouol gonoiloiu soznamu muzomo hozocn iIiauIl uo iomnno, lloi zaclycovaIa
uvounI soznam. Pyllon nojuiIvo vylvoiI novy soznam v amlI a loivo o uolonconI jolo
gonoiovnI iIiauI vysIouol uo uvounI iomnno.
V gonoiloiovo nolacI soznamu muzomo vyuzIl IIhovoIny yllonovsly vyiaz, vcoln IunlcI z mouuIu
os, lloio sIouzI l manIuIacI so souhoiy a auiosiI.
>>> import os, glob
>>> glob.glob('*.xml') }1]
['feed-broken.xml', 'feed-ns0.xml', 'feed.xml']
>>> [os.path.realpath(f) for f in glob.glob('*.xml')] }2]
['c:\\Users\\pilgrim\\diveintopython3\\examples\\feed-broken.xml',
'c:\\Users\\pilgrim\\diveintopython3\\examples\\feed-ns0.xml',
'c:\\Users\\pilgrim\\diveintopython3\\examples\\feed.xml']
}1] Tolo voInI viacI soznam vsocl .xml souhoiu v alluInIm iacovnIm auiosiI.
}2] Talo gonoiloiov nolaco iohIi iouclozI soznam .xml souhoiu a liansIoimujo joj na soznam
jmon s Inou coslou.
Gonoiloiov nolaco soznamu muzo navIc iouoIsoval I IIIliacI oIozol. To znamon, zo muzo vyio-
uuloval vysIouol, lloiy huuo lialsI noz uvounI soznam.
8.8. Gonoiloiov nolaco soznamu
100
>>> import os, glob
>>> [f for f in glob.glob('*.py') if os.stat(f).st_size > 6000] }1]
['pluraltest6.py',
'romantest10.py',
'romantest6.py',
'romantest7.py',
'romantest8.py',
'romantest9.py']
}1] IIIliacI soznamu iovouomo vIozonIm oumInly if na lonoc gonoiloiovo nolaco. Pio lazuou
oIozlu soznamu huuo vylounocon vyiaz za lIIcovym sIovom if. Poluu jo vysIoulom vyiazu
True, al huuo oIozla zalinula uo vysluu. Talo gonoiloiov nolaco soznamu iouoIsujo
ziacovnI vsocl souhoiu s iIonou .py v alluInIm auiosiI. Vyiaz za if zajIslujo IIIliacI
soznamu loslovnIm, zua jo voIIlosl lazuolo souhoiu vlsI noz 6000 hajlu. Talovycl souhoiu
jo sosl, lalzo gonoiloiov nolaco iouulujo soznam so soslI jmony souhoiu.
Vsoclny iouclozI iIlIauy gonoiloiovo nolaco soznamu ouzIvaIy jon jounouuclo vyiazy nsoho-
nI cIsIa lonslanlou, voInI jouno Iunlco, noho jounouuso viacoIy uvounI oIozly soznamu (o IIIlia-
cI). AIo gonoiloiov nolaco soznamu muzo hyl IIhovoIn sIozIl.
>>> import os, glob
>>> [(os.stat(f).st_size, os.path.realpath(f)) for f in glob.glob('*.xml')] }1]
[(3074, 'c:\\Users\\pilgrim\\diveintopython3\\examples\\feed-broken.xml'),
(3386, 'c:\\Users\\pilgrim\\diveintopython3\\examples\\feed-ns0.xml'),
(3070, 'c:\\Users\\pilgrim\\diveintopython3\\examples\\feed.xml')]
>>> import humansize
>>> [(humansize.approximate_size(os.stat(f).st_size), f) for f in glob.glob('*.xml')] }2]
[('3.0 KiB', 'feed-broken.xml'),
('3.3 KiB', 'feed-ns0.xml'),
('3.0 KiB', 'feed.xml')]
}1] Talo gonoiloiov nolaco naIozno v alluInIm iacovnIm auiosiI vsoclny souhoiy s iIonou
.xml, zjIslI voIIlosl lazuolo z nIcl (voInIm Iunlco os.stat()) a vylvoiI uvojIco ohsalujIcI
jmono souhoiu a ahsoIulnI coslu l souhoiu (voInIm Iunlco os.path.realpath()).
}2] Tonlo gonoiloiovy zIs soznamu vyclzI z iouclozIlo. Pio voIIlosl lazuolo .xml souhoiu
so voI Iunlco approximate_size().
8.4. Gonoiloiov nolaco sIovnIlu
Gonoiloiov nolaco sIovnIlu (angIIcly uIclIonaiy comiolonsIon }uIlsoniI lomiIlonsn]) so ouoh
gonoiloiovo nolacI soznamu, aIo mIslo soznamu oIsujo vylvoionI sIovnIlu.
8.4. Gonoiloiov nolaco sIovnIlu
101
>>> import os, glob
>>> metadata = [(f, os.stat(f)) for f in glob.glob('*test*.py')] }1]
>>> metadata[0] }2]
('alphameticstest.py', nt.stat_result(st_mode=33206, st_ino=0, st_dev=0,
st_nlink=0, st_uid=0, st_gid=0, st_size=2509, st_atime=1247520344,
st_mtime=1247520344, st_ctime=1247520344))
>>> metadata_dict = {f:os.stat(f) for f in glob.glob('*test*.py')} }8]
>>> type(metadata_dict) }4]
<class 'dict'>
>>> list(metadata_dict.keys()) }]
['romantest8.py', 'pluraltest1.py', 'pluraltest2.py', 'pluraltest5.py',
'pluraltest6.py', 'romantest7.py', 'romantest10.py', 'romantest4.py',
'pluraltest6.py', 'romantest7.py', 'romantest10.py', 'romantest4.py',
'romantest3.py', 'romantest5.py', 'romantest6.py', 'alphameticstest.py',
'pluraltest4.py']
>>> metadata_dict['alphameticstest.py'].st_size }6]
2509

}1] Tolo nonI gonoiloiov nolaco sIovnIlu, aIo gonoiloiov nolaco soznamu. NaIozno vsoclny
souhoiy s iIonou .py, lloio vo svom jmon ohsalujI ouiolzoc test. Pal so vylvoiI uvojIco
ohsalujIcI jmono souhoiu a jolo molauala (voInIm Iunlco os.stat()).
}2] Kazu oIozla vysIounolo soznamu jo uvojIco.
}8] AIo lolo uz jo gonoiloiov nolaco sIovnIlu. Az na uva iozuIIy so synlaxo ouoh gonoiloiovo
nolacI soznamu. Zaivo, mIslo uo lianalycl zvoiol jo coI uzaviona uo sIozonycl zvoiol.
Zauiulo, io lazuou oIozlu mIslo jounolo vyiazu ohsalujo uva vyiazy ouuIono uvojloclou.
Vyiaz iou uvojloclou (v nasom iIau f) iouslavujo lIIc sIovnIlu. Vyiaz za uvojloclou
(v nasom iIau os.stat(f)) jo lounola.
}4] Gonoiloiov nolaco sIovnIlu iouulujo sIovnIl.
}] KIIco uvouonolo sIovnIlu zaclycujI jmona souhoiu, lloi so vilIIa z voInI
glob.glob('*test*.py').
}6] Hounolou iIuiuzonou lo lazuomu lIIcI jo lounola vicon IunlcI os.stat(). To znamon,
zo v lomlo sIovnIlu muzomo na zlIau jmona souhoiu ,vylIoual jolo molauala. Jounou
z cslI molaual jo st_size, zaclycujIcI voIIlosl souhoiu. Souhoi alphameticstest.py
ohsalujo 2509 hajlu.
Talo u gonoiloiovo nolaco sIovnIlu (ouohn jalo u gonoiloiovo nolaco soznamu) muzomo iIual
oumInlu if, lloi zajIslI IIIliacI vylounoconIm vyiazu io lazuou oIozlu vslunI osIounoslI.
8.4. Gonoiloiov nolaco sIovnIlu
102
>>> import os, glob, humansize
>>> metadata_dict = {f:os.stat(f) for f in glob.glob('*')} }1]
>>> humansize_dict = {os.path.splitext(f)[0]:humansize.approximate_size(meta.st_size) \
... for f, meta in metadata_dict.items() if meta.st_size > 6000} }2]
>>> list(humansize_dict.keys()) }8]
['romantest9', 'romantest8', 'romantest7', 'romantest6', 'romantest10', 'pluraltest6']
>>> humansize_dict['romantest9'] }4]
'6.5 KiB'
}1] Talo gonoiloiov nolaco lonsliuujo soznam vsocl souhoiu v alluInIm iacovnIm auiosiI
(glob.glob('*')), zIslv molauala lazuolo souhoiu (os.stat(f)) a vylviI sIovnIl, joloz lIIcI
jsou jmona souhoiu a l nIm iIiazono lounoly jsou molauala lazuolo souhoiu.
}2] Talo gonoiloiov nolaco vyclzI z iouclozI. OuIIIliovv souhoiy monsI noz 6000 hajlu
(if meta.st_size > 6000) a lallo ioIIIliovany soznam ouzIv l vylvoionI sIovnIlu. Jolo lIIco
lvoiI jmona souhoiu hoz iIony (os.path.splitext(f)[0]) a lounolamI jsou iIhIIzno voIIloslI
lcllo souhoiu (humansize.approximate_size(meta.st_size)).
}8] V iouclozIm iIlIauu jsmo sI ulzaII, zo lcllo souhoiu jo sosl. Z lolo vyIyv, zo sIovnIl huuo
mIl sosl oIozol.
}4] Hounolou lazuolo lIIco jo iolzoc vicony IunlcI approximate_size().
8.4.1. DaIsI Iogicly s gonoiloiovou nolacI sIovnIlu
NsIouujIcI liIl vyuzIvajIcI gonoiloiovo nolaco sIovnIlu so nm jounolo uno muzo louIl. Juo o vzjom-
nou zmnu lIIcu a lounol sIovnIlu.
>>> a_dict = {'a': 1, 'b': 2, 'c': 3}
>>> {value:key for key, value in a_dict.items()}
{1: 'a', 2: 'b', 3: 'c'}
Buuo lo samoziojm Iungoval jon v iIau, luy jsou lounoly vo sIovnIlu nomnIloInolo lyu (Immu-
lahIo), jalo jsou iolzco noho n-lIco. Poluu loloz zlusIlo so sIovnIlom, lloiy ohsalujo soznamy, uojuo
l voIloIoo laviII.
>>> a_dict = {'a': [1, 2, 3], 'b': 4, 'c': 5}
>>> {value:key for key, value in a_dict.items()}
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "<stdin>", line 1, in <dictcomp>
TypeError: unhashable type: 'list'
8.4. Gonoiloiov nolaco sIovnIlu
103
8.. Gonoiloiov nolaco mnozIn
NomII hyclom oomonoul, zo I synlaxo io mnozIny zalinujo gonoiloiovou nolacI. Pozoiuloun so
ouoh synlaxI io gonoiloiovy zIs sIovnIlu. JouIny iozuII socIv v lom, zo mnozIny majI mIslo
iu Lt: hodno|u jon lounoly.
>>> a_set = set(range(10))
>>> a_set
{0, 1, 2, 3, 4, 5, 6, 7, 8, 9}
>>> {x ** 2 for x in a_set} }1]
{0, 1, 4, 81, 64, 9, 16, 49, 25, 36}
>>> {x for x in a_set if x % 2 == 0} }2]
{0, 8, 2, 4, 6}
>>> {2**x for x in range(10)} }8]
{32, 1, 4, 2, 64, 8, 16, 128, 256, 512}
}1] Vsluom gonoiloiovo nolaco mnozIny muzo hyl mnozIna. Talo gonoiloiov nolaco mnozIny
vylounocujo uiulo mocnIny ivlu z mnozIny cIsoI ou 0 uo 9.
}2] Gonoiloiovo nolaco mnozIn (slojn jalo gonoiloiovo nolaco soznamu a sIovnIlu) molou
ohsaloval oumInlu if, lloi vslunI oIozly iou zaiazonIm uo vysIouno mnozIny IIIliujo.
}8] Vsluom gonoiloiovo nolaco mnozIny aIo nomusI hyl mnozIna. Muzo jI hyl jalloIIv
osIounosl.
8.6. Piocllo sI
- mndul os (slanuaiunI uolumonlaco)
(lll:lluocs.yllon.oigly8llIIhiaiylos.llmI)
- os - Pnrtublo uccoss tn nporuting systom spocific fouturos
(ionosIloIno ziIslunnI socIIIclycl vIaslnoslI vzanycl na ooiacnI syslom)
(lll:llvvv.uougloIImann.comlPyMOTWlosl)
- mndul os.path (slanuaiunI uolumonlaco)
(lll:lluocs.yllon.oigly8llIIhiaiylos.all.llmI)
- os.path - Plutfnrm-indopondont munipulutinn nf filo numos
(IalIoimov nozvIsI manIuIaco so jmony souhoiu)
(lll:llvvv.uougloIImann.comlPyMOTWlosalll)
- mndul glob (slanuaiunI uolumonlaco)
(lll:lluocs.yllon.oigly8llIIhiaiylgIoh.llmI)
- glob - Filonumo puttorn mutching (vylIouvnI souhoiu ouIo vzoilu)
(lll:llvvv.uougloIImann.comlPyMOTWlgIohl)
- mndul time (slanuaiunI uolumonlaco)
(lll:lluocs.yllon.oigly8llIIhiaiyllImo.llmI)
8.. Gonoiloiov nolaco mnozIn
8.6. Piocllo sI
104
- time - Functinns fnr munipuluting clnck timo (Iunlco io manIuIacI casu louIn)
(lll:llvvv.uougloIImann.comlPyMOTWllImol)
- List cnmprohonsinns (slanuaiunI luloiIaI)
- Nostod list cnmprohonsinns (vnoion gonoiloiov nolaco soznamu; slanuaiunI luloiIaI)
- Lnnping tochniquos (loclnIly zIsu cylIu; slanuaiunI luloiIaI)
(vso na lll:lluocs.yllon.oigly8llluloiIaIlualasliucluios.llmI)
8.6. Piocllo sI
105
4. etzce
4. KaIloIa
Im telling you this cause youre one of my friends.
My alphabet starts where your alphabet ends!
(Piolozo jounIm z mycl iloI jsI, lal iIlm lI:
M ahocoua zacIn lam, luo lv loncI!)
Di. Souss, On Boyonu Zohia!
106
4. etzce 105
4.1. Pi nuunycl vcI, lloiym musImo iozuml uiIvo,
noz so huuomo mocI onoiIl 107
4.2. InIcouo 109
4.8. Ponoimo so 111
4.4. IoimlovacI iolzco 111
4.4.1. SIozon jmona ohIaslI 113
4.4.2. SocIIIlloiy Ioimlu 114
4.. DaIsI hzno molouy iolzcu 115
4..1. VyliajovnI ouiolzcu 117
4.6. Rolzco vs. hajly 117
4.7. Zviocn oznmla: KouovnI znalu
v yllonovslom zuiojovom loxlu 120
4.8. Piocllo sI 121
Ohsal laIloIy
107
4.1. Pi nuunycl vcI, lloiym musIlo iozuml uiIvo,
noz so huuomo mocI onoiIl
PiomysII o lom jon mIo IIuI, aIo loxl jo nouviIloIn lomIIlovany. Zacnmo s ahocouou. OhyvaloIo
BougaInvIIIo ouzIvajI nojmonsI ahocouu na svl. JojIcl ahocoua Rololas so slIu z oulycl 12
Ismon: A, L, G, I, K, O, P, R, S, T, I a V. Na oacnom loncI sollia najuomo jazyly, jalo jsou cInslIna,
jaonslIna a loiojslIna, lloio ouzIvajI lIsIco znalu. AngIIclIna ouzIv 26 Ismon noho 2, oluu
ocIllo zvIsl maI a voIl Ismona a l lomu i InloiunlcnIcl znalu, jalo jsou !@#$%&.
Poluu v souvIsIoslI s ocIlacI mIuvIlo o ,loxlu, al iavuouohn mysIIlo ,znaly a symhoIy
na ocIlacovo ohiazovco. AIo ocIlaco noiacujI so znaly a symhoIy. PiacujI s hIly a hajly. Kazuy
lousol loxlu, lloiy jslo luy saliIII na ocIlacovo ohiazovco, hyI vo slulocnoslI uIozon v uicIlom
znuLov6m Lodov0n. Zliuha iocono, louovnI znalu zaclycujo vzlal mozI lIm, co vIuIlo na ohiazovco,
a lIm, co jo vo slulocnoslI uIozono v amlI ocIlaco a na uIslu. Znalovycl louovnI so ouzIv
voImI mnolo. Nlloi jsou olImaIIzovna io lonliolnI jazyl, jalym jo iuslIna, cInslIna noho
angIIclIna. JIn louovnI so molou ouzIval io vIco jazylu.
Vo slulocnoslI jo lo josl mnolom lomIIlovanjsI. Raua znalu jo soIocn io vIco iuznycl louo-
vnI, aIo lazuo louovnI muzo io jojIcl uIozonI v amlI noho na uIslu ouzIval jInou osIounosl
hajlu. Talzo o znalovom louovnI muzolo uvazoval jalo o uosIIiovacIm lIIcI. KuyloIIv vm nluo
oslylno osIounosl hajlu souhoi, vohovou slinlu, coloIIv a huuo lviuIl, zo lo jo ,loxl,
huuolo l ssnomu uolouovnI hajlu na znaly cllIl vul lalo lo, jalo louovnI znalu hyIo ouzIlo.
Poluu vm nluo oslylno salny lIIc noho vm uolonco nou zuny, oslavI vs iou novylnuloIny
loI iozIouslnoul lou samI. Muzo so sll, zo iI lom uuIlo clyhu a vysIouol huuo zmalony.
IicIl uz jslo vIuII vohovo slinly s ouIvnymI znaly
ouohnymI olaznIlu na mIslocl, luo mIy hyl aoslio-
Iy. OhvylIo lo znamon, zo auloi slinly nouvouI jojIcl
sivno louovnI a vs iolIIzoc musoI lual. VysIou-
lom hyIa sms ocolvanycl a noocolvanycl znalu.
I angIIclolo loxlu lo vnImmo sIs jon iusIv, aIo
v jInycl jazycIcl muzo hyl vysIouol zcoIa nocIloIny.
Kazuy vyznacny jazyl na svl m uoIInovno svo znalovo louovnI. Kazuo louovnI znalu hyIo
lvuII iozuIIum v jazycIcl olImaIIzovno io lonliolnI jazyl, iolozo amlovy a uIslovy iosloi
hyIy v mInuIoslI voImI uialo. Mm lIm na mysII lo, zo io ioiozonlacI znalu jazyla ouzIvaIo lazuo
louovnI slojny InloivaI cIsoI (u2). Piavuouohn znlo naiIlIau louovnI ascII, lloio ulIu
angIIclo znaly jalo cIsIa z InloivaIu u az 127. (6 jo voIlo ,A, u7 jo maIo ,a alu.) AngIIclIna m voI-
mI jounouuclou ahocouu, lloi muzo hyl In vyjuiona mon noz 128 cIsIy. Pio ly z vs, lloiI umI
ocIlal vo uvojlovo souslav, na lo slacI 7 z 8 hIlu v hajlu.
4.1. Pi nuunycl vcI, lloiym musImo iozuml
uiIvo, noz so huuomo mocI onoiIl
Ve, co jste si mysleli, e
o etzcch vte, je vm
k niemu.
108
Zauoovioslo jazyly, jalou jsou IiancouzslIna, sanIslIna a nmcIna, ouzIvajI vIco znalu noz ang-
IIclIna. PiosnjI iocono, najuolo v nIcl Ismona lomhInovan s iuznymI uIaliIlIclymI znaclamI, jalo
naiIlIau u znalu ouzIvanolo vo sanIslIn. NojhznjsIm louovnIm jo u lcllo jazylu CP-122.
Oznacujo so lalo ,vInuovs-122, iolozo so sIioco ouzIv v MIciosoIl WInuovs. KouovnI CP-122
suIII znaly v InloivaIu u127 s ASCII, aIo iozIn so I uo InloivaIu 1282. NaIoznomo v nm lalovo
znaly jalo n-s-vInlou (241), u-s-iolIslou (22) alu. Poiu aIo juo o jounohajlovo louovnI. NojvlsI
mozno cIsIo (2) so oiu vojuo uo jounolo hajlu.
Pal lu aIo mmo jazyly, jalo jo cInslIna, jaonslIna a loiojslIna, lloio ouzIvajI lalovo mnozslvI
znalu, zo vyzauujI vIcohajlovo znalovo sauy. Kazuy jojIcl ,znal jo vyjuion uvouhajlovym cIsIom
v InloivaIu u68. AIo u iuznycl vIcohajlovycl louovnI so oiu sollvmo so slojnym iohIo-
mom, jalo u iuznycl jounohajlovycl louovnI. Kazuo z nIcl ouzIv slojn cIsIa io vyjuionI
iuznycl vcI. PouzIvajI jon sIisI InloivaI cIsoI, iolozo musI vyjuiIl mnolom vIco znalu.
Vo svl, lloiy josl nohyI ioojon sIlI a luo ,loxl hyIo nco, co jslo sI samI nasaII a iIIozIlosln
vylIslII, lo vlsInou hyIo iIjaloIno. ,Pioslolo loxlu jslo aIo moc nonasII. Zuiojovo loxly hyIy v ASCII
a vsIclnI oslalnI ouzIvaII loxlovo iocosoiy, lloio uoIInovaIy svo vIaslnI (noloxlovo) Ioimly. Ty sI
soIu s InIoimacomI o slyIu ulIuaIy lalo InIoimacI o znalovom louovnI. LIuo lylo uolumonly colII
iosliounIclvIm slojnycl loxlovycl iocosoiu, jalo ouzII uvounI auloi, lalzo vsoclno vIcomon
IungovaIo.
Tou sI iouslavlo vzoslu gIohInIcl sIlI s oIollionIclou oslou a s vohom. Sously ,ioslycl loxlu
IolajI loIom zomlouIo hyIy nasny na jounom ocIlacI, ionosony ios uiuly a zohiazovny
na liolIm ocIlacI. PocIlaco vIuI jon cIsIa. AIo cIsIa molou znamonal iuzno vcI. Acl no! Co huuomo
uIal Talzo syslom musoI hyl navizon lal, ahy sI lazuy ,iosly loxl s sohou nosI InIoimacI o louov-
nI. PiIomomo sI, zo juo o uosIIiovacI lIIc, lloiy iovuI cIsIa siozumIloIn ocIlacI na znaly cIloIno
cIovlom. ClyhjIcI uosIIiovacI lIIc vouo lo zliosIonomu loxlu, zmallum noho l ncomu loisImu.
Tou sI iouslavlo, zo hyclom vIco lusu loxlu cllII uIozIl na slojnom mIsl, jalo naiIlIau vo slojno
ualahzovo lahuIco uclovvajIcI uoiuconou oIollionIclou oslu. Pio lazuy lousol musImo slojn
uIozIl I znalovo louovnI, ahyclom loxl uolzaII sivn zohiazIl. MysIIlo sI, zo jo lo iIIIs lviuy o-
zauavol Zluslo vo svo o-maIIovo ualahzI vylIouval. To znamon, zo huuolo musol za hlu iovul
iovouy mozI iuznymI louovnImI. Tauy ioslv Iogiaco, zo
Tou sI iouslavlo, zo hyslo mII vIcojazycno uolumonly, vo lloiycl so znaly z iuznycl jazylu vyslylu-
jI vouIo soho, v lom samom uolumonlu. (Novua: Piogiamy, lloio so o lo olousoIy, lyIcly ouzI-
vaIy omocno louy (oscao) io ioInnI ,iozImu. Pisl, lou jslo v iuslom iozImu loI8-i, lalzo 241
znamon ; hum, lou jslo ioclom iozImu io Mac, lalzo 241 znamon .) I v |uLovyth uolumonlocl
hyslo samoziojm cllII uml vylIouval.
Tal a lou Iaclo, iolozo vso, co jslo sI mysIoII, zo o iolzcIcl vIlo, jo vm l nIcomu. NIc lalovolo jalo
,iosly loxl nooxIslujo.
4.1. Pi nuunycl vcI, lloiym musImo iozuml
uiIvo, noz so huuomo mocI onoiIl
109
4.2. InIcouo
V:|u|e do :v6|u Untode.
InIcouo jo syslom navizony lal, ahy hyIo mozno vyjuiIl Lu2dy znal z Lu2d6ho jazyla. Kazuo Ismono,
znal noho Iuoogiam so v InIcouo vyjauiujI jalo 4hajlovo cIsIo. Kazuo cIsIo vyjauiujo jouInocny znal,
lloiy so ouzIv aIoso v jounom jazyco nasolo svla. (No vsoclna cIsIa jsou vyuzIla, aIo lcl ou-
zIlycl jo vIco noz 68. To znamon, zo uva hajly noslacI.) Znaly, lloio so ouzIvajI vo vIco jazycIcl,
majI ohvylIo slojno cIsIo oluu nooxIslujo uohiy olymoIogIcly uuvou, ahy lomu lal nohyIo. Boz
olIouu na uaIsI oloInoslI jo aIo io lazuy znal vyliazono jouno cIsIo a io lazuo cIsIo jon jouon znal.
Jouno cIsIo vzuy znamon jouInou vc. NoouzIvajI so zuno uiIvo zmInno ,iozImy. U+0041 znamon
vzuy 'A', a lo I v iIauocl, oluu hy vs jazyl 'A' noouzIvaI.
Na ivnI olIou lo vyau jalo vyhoin mysIonla. Jouno louovnI vIuno vsom. VIco jazylu v jounom
uolumonlu. Iz nIluy vIco ,ioInnI iozImu uiosliou loxlu jon lvuII ionulI louovnI. AIo uz
v lolo clvIII hy vs mIa naaunoul zjovn olzla. ClyiI hajly Pio lazuy jouon znal To vyau jalo
liozno IylvnI. OhzvIsl io jazyly, jalo jsou angIIclIna noho sanIslIna, lloio l vyjuionI lazuolo
ouzIvanolo znalu oliohujI mon noz jouon hajl (26 cIsoI). Vo slulocnoslI jo lo IylvnI I io jazyly
zaIozono na Iuoogiamocl (jalo jo cInslIna), lloio na jouon znal nooliohujI nIluy vIco noz uva hajly.
LxIslujo louovnI InIcouo, lloio ouzIv clyiI hajly na znal. Nazyv so ITI-82, ouIo oclu 82 hIlu,
coz jsou 4 hajly. ITI-82 jo iImocaio louovnI. Kazuo cIsIo uIozono na clyiocl hajlocl so ioiozonlujo
jalo InIcouo znal so slojnym cIsIom. M lo svo vylouy. NojuuIozIljsI z nIcl jo la, zo N-ly znal iolzco
muzomo ziIslunIl v lonslanlnIm caso. N-ly znal lolIz zacIn na 4N-lom hajlu. AIo m lo I novylouy.
Ta nojzjovnjsI jo, zo na lazuy ouIany znal oliohujomo clyiI hajly.
Znalu jo v InIcouo voImI mnolo, aIo ulazujo so, zo vlsIna IIuI noouzIjo nIluy zuny, lloiy hy IozoI
mImo ivnIcl 68. Talzo lu mmo uaIsI louovnI InIcouo. Nazyv so ITI-16 (iolozo 16 hIlu jsou
2 hajly). V ITI-16 so lazuy znal s cIsIom z InloivaIu u68 louujo uo uvou hajlu. Poluu oiavuu
oliohujomo vyjuiIl ziIula ouzIvano InIcouo znaly z ,asliInI iovIny (iosalujIcI 68), ouzIv
ITI-16 jIslo sInavo liIly. NojzjovnjsI vyloua: ITI-16 jo iosloiov uvalil oIollIvnjsI noz ITI-82,
iolozo io uIozonI lazuolo znalu oliohujomo jon uva hajly mIslo clyi (s vyjImlou lcl, io lloio lo
noIalI). A oluu huuomo iouolIual, zo iolzoc noohsalujo zuno znaly z asliInI iovIny, muzomo
snauno najIl N-t znal v lonslanlnIm caso. Ton iouolIau jo uocoIa uohiy, aIo jon uo uohy, luy lo
ioslano IalIl.
AIo jal ITI-82, lal ITI-16 majI lalo mon ziojmo novylouy. Ruzno ocIlacovo syslomy ulIuajI jou-
nolIIvo hajly iuznym zusohom. Tal naiIlIau znal U+4E2D hy molI hyl v ITI-16 uIozon huu jalo
4E 2D noho 2D 4E. ZvIsI lo na lom, zua syslom ouzIv iIslu hIg-onuIan (na monsI auioso vyznam-
njsI hajl) noho IIllIo-onuIan (na monsI auioso mon vyznamny hajl). (Pio ITI-82 oxIslujI uolonco
josl uaIsI moznoslI usoiunI hajlu.) Poluu vs uolumonl nIluy noouslI vs ocIlac, jo lo v suclu
iuzno aIIlaco huuou na slojnom ocIlacI ouzIval slojno oiauI hajlu. AIo v olamzIlu, luy huuolo
cllIl uolumonl ionsol mozI syslomy, lioha iosliounIclvIm vohu noho ncolo lalovolo, huuomo
4.2. InIcouo
110
oliohoval zusoh, jal vyjuiIl nmI ouzIvano oiauI uIozonycl hajlu. V oacnom iIau hy cIIovy
syslom noumI zjIslIl, zua uvouhajlov osIounosl 4E 2D znamon U+4E2D noho U+2D4E.
VIcohajlov louovnI InIcouo io vyiosonI lololo iohIomu uoIInujI ,Bylo Oiuoi Mail (znacla
oiauI hajlu; zlicon BOM). Juo o socIInI nolIslnuloIny znal, lloiy muzolo vIozIl na zaclol svolo
uolumonlu, ahyslo uaII najovo, v jalom oiauI jsou vaso hajly uvouony. Pio ITI-16 jo Bylo Oiuoi
Mail iovon U+FEFF. Poluu ohuizIlo uolumonl v utf-16 zacInajIcI hajly FF FE, al vIlo, zo juo o jouno
z moznycl oiauI hajlu. Poluu zacIn hajly FE FF, al vIlo, zo oiauI hajlu jo ohicono.
Pioslo ITI-16 nonI zcoIa IuoInI. PIalI lo zvIsl v iIauocl, luy ouzIvlo voIlo mnozslvI ASCII
znalu. Kuyz o lom oiomysIIlo, uolonco I cInslo vohovo slinly huuou ohsaloval voIlo mnozslvI
ASCII znalu vsoclny ly znacly a aliIhuly, lloio ohlIoujI lIslnuloIno cInslo znaly. Poluu umImo
najIl N-t znal v lonslanlnIm caso, jo lo Iajn. AIo oiu lu mmo noiIjomny iohIom s lmI znaly
z asliInI iovIny. To znamon, zo nomuzolo zurut|, zo lazuy znal jo uIozon iosn na uvou hajlocl.
Talzo vo slulocnoslI nomuzolo N-t znal najIl v lonslanlnIm caso oluu sI ovsom nouuizujolo
ouuIony Inuox. A mozI nmI, vo svl so naclzI oliomno mnozslvI ASCII loxlu...
TmIlo olzlamI so uz zahyvaII jInI a iIsII s iosonIm:
UTF-8 jo louovacI syslom : rom6nnou d6Lou. To znamon, zo iuzno InIcouo znaly zahIiajI iuzny
ocol hajlu. Pio ASCII znaly (A-Z alu.) ouzIv UTF-8 jon jouon hajl na znal. Vo slulocnoslI ouzIv
iosn lonlyz hajl. PivnIcl 128 znalu (u127) so v UTF-8 nou iozIIsIl ou ASCII. Znaly z ,iozsIiono
IalInly, jalo jsou a , huuou zahIial uva hajly. (Bajly zuo novyjauiujI lou z InIcouo lal jounouu-
clym zusohom, jalo jo lomu u UTF-16. Jo uo lolo zalazono lioslu sIozIljsI lianI sI s hIly.) CInslo
znaly jalo zahIiajI liI hajly. ZiIula ouzIvano znaly z ,asliInI iovIny zahIiajI clyiI hajly.
Novyhndy: Piolozo lazuy znal zahIi iuzny ocol hajlu, jo naIozonI N-lolo znalu ooiacI o sIozIloslI
O(N). To znamon, zo cIm jo iolzoc uoIsI, lIm uoIo huuomo znal na uicono ozIcI vylIouval. PiI louo-
vnI znalu na hajly a uolouovnI hajlu na znaly so musImo navIc zahyval uaIsImI manIuIacomI s hIly.
Vyhndy: KouovanI hznycl ASCII znalu jo oxliomn oIollIvnI. PiI louovnI znalu z iozsIiono IalInly
nonI loisI noz ITI-16. Pio cInslo znaly jo IosI noz ITI-82. A uIly jounoznacnomu zusohu ma-
nIuIaco s hIly zuo nooxIslujI zuno iohIomy s oiauIm hajlu. (To mI musIlo viIl, iolozo lo lauy
nohuuu malomalIcly zuuvouoval.) Dolumonl louovany v UTF-8 ouzIv na lazuom ocIlacI iosn
slojnou osIounosl hajlu.
UTF-8
4.2. InIcouo
111
4.8. Ponoimo so
V Pyllonu 8 jsou vsoclny iolzco osIounoslmI znalu v InIcouo. Nonajuomo zuo nIc lalovolo jalo
yllonovsly iolzoc louovany v UTF-8 noho yllonovsly iolzoc louovany v CP-122. ,Jo lonlo iol-
zoc v UTF-8 lolo jo nosmysIn olzla. UTF-8 iouslavujo zusoh louovnI znalu uo osIounoslI
hajlu. Poluu clcolo vzIl iolzoc a iomnIl joj na osIounosl hajlu v uicIlom znalovom louovnI,
muzo vm v lom Pyllon 8 omocI. Poluu clcolo vzIl osIounosl hajlu a iomnIl jI na iolzoc,
omuzo vm s lIm Pyllon 8 lalo. AIo hajly nojsou znaly. Bajly jsou iosl hajly. Znal jo ahslialco.
A iolzco jsou osIounoslmI lcllo ahslialcI.
>>> s = ' Python' }1]
>>> len(s) }2]
9
>>> s[0] }8]
''
>>> s + ' 3' }4]
' Python 3'
}1] Rolzoc vylvoiImo lal, zo osIounosl znalu uzaviomo uo uvozovacIcl znalu. Pyllonovslo
iolzco molou hyl uoIInovny uzavionIm huu uo aoslioIu ('; sIngIo quolos) noho uo uvozo-
vol ("; uouhIo quolos).
}2] Zahuuovan Iunlco len() viacI uoIlu iolzco, lj. ocol znalu. Jo lo slojn Iunlco, jalou
ouzIvmo io naIozonI uoIly soznamu, n-lIco, mnozIny noho sIovnIlu. Rolzoc iIomIn
n-lIcI znalu.
}8] S vyuzIlIm Inuoxovo nolaco muzomo zIslal jounolIIvo znaly iolzco, ouohn jalo u soznamu.
}4] Ooiloi + iovuI lonlalonacI iolzcu (ziolzonI, sojonI), slojn jalo u soznamu.
4.4. IoimlovacI iolzco
PouIvojmo so znovu na humansize.py:
SUFFIXES = {1000: ['KB', 'MB', 'GB', 'TB', 'PB', 'EB', 'ZB', 'YB'], }1]
1024: ['KiB', 'MiB', 'GiB', 'TiB', 'PiB', 'EiB', 'ZiB', 'YiB']}
def approximate_size(size, a_kilobyte_is_1024_bytes=True):
'''Convert a file size to human-readable form. }2]
4.8. Ponoimo so
4.4. IoimlovacI iolzco
etzce definujeme uzavenm
do apostrof nebo do uvozovek.
112
Keyword arguments:
size -- file size in bytes
a_kilobyte_is_1024_bytes -- if True (default), use multiples of 1024
if False, use multiples of 1000
Returns: string
''' }8]
if size < 0:
raise ValueError('number must be non-negative') }4]
multiple = 1024 if a_kilobyte_is_1024_bytes else 1000
for suffix in SUFFIXES[multiple]:
size /= multiple
if size < multiple:
return '{0:.1f} {1}'.format(size, suffix) }]
raise ValueError('number too large')
}1] 'KB', 'MB', 'GB'. lo vsoclno jsou iolzco.
}2] DolumonlacnI iolzco IunlcI jsou iolzco. Tonlo uolumonlacnI iolzoc so iozioslIi
ios nloIIl iulu. Piolo jo ouzIla liojIco aoslioIu na zacllu I na loncI iolzco.
}8] Talo liojIco aoslioIu uloncujo uolumonlacnI iolzoc.
}4] Zuo mmo uaIsI iolzoc, lloiy iouvmo ohjollu vyjImly jalo IIusly cIloInou ouohu clyho-
volo lIsonI.
}] A lauy mmo. loj, co jo salia lolIo
Pyllon 8 ouoiujo IoimlovnI lounol uo iolzcu. Mozno jsou I voImI lomIIlovano vyiazy,
aIo nojzlIaunjsI ouzIlI socIv vo vIozonI lounoly uo iolzco s jounou ohIaslI nliau.
>>> username = 'mark'
>>> password = 'PapayaWhip' }1]
>>> "{0}'s password is {1}".format(username, password) }2]
"mark's password is PapayaWhip"
}1] No, mojo losIo uooiavuy noznI PapayaWhip.
}2] Tauy so ujo sousla vcI. Zaivo, voImo zuo molouu iolzcovolo IIloiIu. Rolzco jsou ohjol-
ly a ohjolly majI molouy. Zauiulo, vylounoconIm coIolo vyiazu vznIlno iolzoc. ZaliolI, {0}
a {1} jsou oIu:| n0hrud (ioIacomonl IIoIus), uo lloiycl huuou uosazony aigumonly iouano
molou format().
4.4. IoimlovacI iolzco
113
4.4.1. SIozon jmona ohIaslI
PiouclozI iIlIau ulazovaI nojjounouussI iIau, luy jsou v ohIaslocl nliau ouzIla ouzo coI
cIsIa. CoI cIsIa so v ohIaslocl nliau ovazujI za Inuoxy uo soznamu aigumonlu molouy format().
To znamon, zo {0} jo naliazona ivnIm aigumonlom (v nasom iIau username), {1} jo naliazona
uiulym aigumonlom (password) alu. Muzomo ouzIl loIIl ozIcnIcl Inuoxu, loIIl mmo aigumonlu.
A aigumonlu muzomo mIl loIIl, loIIl clcomo. AIo ohIaslI nliau jsou josl mnolom mocnjsI.
>>> import humansize
>>> si_suffixes = humansize.SUFFIXES[1000] }1]
>>> si_suffixes
['KB', 'MB', 'GB', 'TB', 'PB', 'EB', 'ZB', 'YB']
>>> '1000{0[0]} = 1{0[1]}'.format(si_suffixes) }2]
'1000KB = 1MB'
}1] MIslo voInI Iunlco z mouuIu humansize sI ujcImo jounu z ualovycl sliullui, lloi jo v nm
uoIInovna: soznam iIon jounolol ,SI (mocnIny cIsIa 1uuu).
}2] Vyau lo sIozIl, aIo nonI lo sIozIlo. {0} so oulazujo na ivnI aigumonl iouany molou
format(), louy na si_suffixes. AIo si_suffixes m ouohu soznamu. Talzo {0[0]} oulazujo
na ivnI oIozlu soznamu, lloiy jo ivnIm aigumonlom iouanym molou format(): 'KB'.
Pouohn {0[1]} oulazujo na uiulou oIozlu slojnolo soznamu: 'MB'. Vsoclno vn sIozonycl
zvoiol vcoln 1000, iovnIlla a mozoi zuslv nouolcono. Konocnym vysIoulom jo
iolzoc '1000KB = 1MB'.
Tonlo iIlIau ulazujo, zo :et[L0|ory [orm0|u mohou
ro zI:|un6n oo2eL u vu:|no:| du|ovyth :|ruL|ur
ou2vu| /|6m6I) y|honov:Lou :yn|ux. RIl so lomu
:o2en0 jm6nu oIu:| (comounu IIoIu namos).
IunlcnI jsou nsIouujIcI sIozon jmona ohIaslI:
- PiounI soznamu a ziIslunnI oIozly soznamu Inuoxom (jalo v iouclozIm iIlIauu).
- PiounI sIovnIlu a ziIslunnI jolo lounoly uvouonIm lIIco.
- PiounI mouuIu a ziIslunnI jolo iomnnycl a IunlcI jmonom.
- PiounI Inslanco liIuy a ziIslunnI jojIcl vIaslnoslI a molou jmonom.
- LIhovoIn lomhInaco vyso uvouonolo.
Ahycl vs oliomII, lauy mlo iIlIau, lloiy vso lomhInujo:
4.4. IoimlovacI iolzco
{0} je nahrazena prvnm
argumentem metody format().
{1} je nahrazena druhm
argumentem.
114
>>> import humansize
>>> import sys
>>> '1MB = 1000{0.modules[humansize].SUFFIXES[1000][0]}'.format(sys)
'1MB = 1000KB'
A lou sI oIsomo, jal lo Iungujo:
- MouuI sys v soh uuizujo InIoimaco o momonlIn hzIcI yllonovslo InslancI. Piolozo
jsmo iovouII jolo Imoil, muzomo coIy mouuI sys ioual jalo aigumonl molouy format().
Talzo oIo nliau {0} oulazujo na mouuI sys.
- sys.modules jo sIovnIl vsocl mouuIu, lloio hyIy Imoilovny loulo InslancI Pyllonu.
V ioII lIIcu vysluujI jmona mouuIu uvouon jalo iolzco. HounolamI jsou vIaslnI ohjolly
mouuIu. Talzo ohIasl nliau {0.modules} oulazujo na sIovnIl Imoilovanycl mouuIu.
- sys.modules['humansize'] oulazujo na mouuI lumansIzo mouuIo, lloiy jsmo iv
ImoilovaII. OhIasl nliau {0.modules[humansize]} oulazujo na mouuI lumansIzo. PovsIm-
nlo sI zuo maIolo iozuIIu v synlaxI. Vo slulocnom yllonovslom louu jsou lIIcI sIovnIlu
sys.modules iolzco. Ahyclom so jImI molII oulzal, musImo jmono mouuIu uzaviIl
uo aoslioIu (jalo naiIlIau 'humansize'). Jonzo uvnIli ohIaslI nliau aoslioIy loIom
sIovnIlovolo lIIco vynoclvmo (lj. humansize). CIlujmo PLP 81u1: Auvancou SliIng
IoimallIng, ,PiavIuIa io iouvnI lIIcu oIozol jsou voImI jounouucl. Poluu lIIc
zacIn cIsIIcI, huuo cln jalo cIsIo. V oslalnIcl iIauocl huuo ouzIl jalo iolzoc.
- sys.modules['humansize'].SUFFIXES jo sIovnIl uoIInovany na zacllu mouuIu lumansIzo.
Oulazujo so na nj ohIasl nliau {0.modules[humansize].SUFFIXES}.
- sys.modules['humansize'].SUFFIXES[1000] jo soznam iIon jounolol sI:
}'KB', 'MB', 'GB', 'TB', 'PB', 'EB', 'ZB', 'YB']. Talzo ohIasl nliau
{0.modules[humansize].SUFFIXES[1000]} so oulazujo na zmInny soznam.
- sys.modules['humansize'].SUFFIXES[1000][0] jo ivnI oIozlou soznamu iIon jounolol
sI: 'KB'. Z lolo Iyno, zo coI ohIasl nliau {0.modules[humansize].SUFFIXES[1000][0]}
jo naliazona uvojznalovym iolzcom KB.

4.4.2. SocIIIlloiy Ioimlu
AIo oclal! Ono jo lolo josl vIc! PouIvojmo so josl jounou na lonlo uIvny iuol louu zo souhoiu
humansize.py:
if size < multiple:
return '{0:.1f} {1}'.format(size, suffix)
{1} jo naliazona uiulym aigumonlom iouanym molou format(), a lIm jo suffix. AIo co znamon
{0:.1f} Juo o uv vcI: vyznam {0} uz znlo, aIo vyznam :.1f josl no. Diul csl (uvojlocla a lo,
co nsIouujo) uoIInujo :et[L0|or [orm0|u (Ioimal socIIIoi), lloiy uiosujo, jal m hyl uosazovan
lounola Ioimlovna.
4.4. IoimlovacI iolzco
115
> SocIIIlloiy Ioimlu vm uovoII uiavIl vysIouny loxl uo iauy uzIlocnycl ouoh ouohn
jalo Iunlco printf() v jazyco C. Muzolo iIual vycvlu z nuI noho z mozoi, zaiovnal iolzco,
iIuIl ocol uosolInnycl mIsl a uolonco lonvoiloval cIsIa uo soslncllovo souslavy.
Dvojlocla (:) uvnIli ohIaslI nliau oznacujo zaclol socIIIlloiu Ioimlu. SocIIIlloi ,.1 znamon
,zaolioulII na nojhIIzsI uosolIny (lj. zohiaz jon jouno mIslo za uosolInnou loclou). SocIIIlloi ,f
znamon ,cIsIo s ovnou iuovou cilou (jalo oal l oxononcIInImu zIsu noho l jInym zuso-
hum ioiozonlaco cIsIa). Talzo oluu m size lounolu 698.24 a suffix lounolu 'GB', al naIoim-
lovany iolzoc huuo mIl ouohu '698.2 GB'. Hounola 698.24 huuo zaolioulIona na jouno uosolInno
mIslo a lounola suffix huuo iIojona za cIsIo.
>>> '{0:.1f} {1}'.format(698.24, 'GB')
'698.2 GB'
DolaIIy loIom socIIIlloiu Ioimlu naIoznolo v oIIcIInI yllonovslo uolumonlacI, v cslI Ioimal
SocIIIcalIon MInI-Languago.
4.. DaIsI hzno molouy iolzcu
S iolzcI muzomo, liom IoimlovnI, iovul iauu uaIsIcl uzIlocnycl louslu.
>>> s = '''Finished files are the re- }1]
... sult of years of scientif-
... ic study combined with the
... experience of years.'''
>>> s.splitlines() }2]
['Finished files are the re-',
'sult of years of scientif-',
'ic study combined with the',
'experience of years.']
>>> print(s.lower()) }8]
finished files are the re-
sult of years of scientif-
ic study combined with the
experience of years.
>>> s.lower().count('f') }4]
6
}1] V InloiallIvnIm yllonovslom sloIIu muzomo zaual I vIcoiulovo iolzco. Poluu zaljImo vI-
coiulovy iolzoc uvouonIm liojIlolo uvozovacIlo znalu, muzomo jounouuso slIslnoul ENTER
a InloiallIvnI sloII ns vyzvo l zaunI oliacovnI iolzco. ZasnIm uzavIiacI liojIco uvozo-
vacIlo znalu oznacImo lonoc iolzco. Po nsIounom slIslu ENTER so iIlaz iovouo.
4.. DaIsI hzno molouy iolzcu
116
(V lomlo iIau huuo iolzoc iIiazon uo iomnno s).
}2] Moloua splitlines() iohIi jouon vIcoiulovy iolzoc a viacI soznam iolzcu, vo lloiom
lazu oIozla ioiozonlujo jouon iuol z oiIgInIu. VsImnlo sI, zo znaly loncu iulu nojsou
uo jounolIIvycl iulu zalinuly.
}8] Moloua lower() iovuI coIy iolzoc na maI Ismona. (Pouohn zaso moloua upper()
iovuI iolzoc na voIl Ismona.)
}4] Moloua count() viacI ocol vyslylu zauanolo ouiolzco. Ano, v uvouono vl jo oiavuu
sosl ,f!
Vozmmo sI uaIsI hzny iIau. Dojmo lomu, zo mmo soznam uvojIc lIIc-lounola vo lvaiu
key1=value1&key2=value2 a my hyclom jo cllII iozuIIl a vylvoiIl z nIcl sIovnIl v ouoh
{key1: value1, key2: value2}.
>>> query = 'user=pilgrim&database=master&password=PapayaWhip'
>>> a_list = query.split('&') }1]
>>> a_list
['user=pilgrim', 'database=master', 'password=PapayaWhip']
>>> a_list_of_lists = [v.split('=', 1) for v in a_list if '=' in v] }2]
>>> a_list_of_lists
[['user', 'pilgrim'], ['database', 'master'], ['password', 'PapayaWhip']]
>>> a_dict = dict(a_list_of_lists) }8]
>>> a_dict
{'password': 'PapayaWhip', 'user': 'pilgrim', 'database': 'master'}
}1] Rolzcovo molou split() jsmo zauaII jouon aigumonl, lounolu ouuIovaco. Moloua v mIslocl
zauanolo ouuIovaco iozuII iolzoc na soznam iolzcu. Zuo jo jalo ouuIovac ouzIl znal
ampersand, aIo muzo lo hyl coloIIv.
}2] Tou mmo soznam iolzcu, luo lazuy ohsalujo lIIc, nsIouujo znal iovnIlla a olo lounola.
K iuclouu lImlo soznamom a l iozuIonI lazuolo iolzco na uva v mIsl iovnIlla muzomo
ouzIl gonoiloiovou nolacI soznamu (IIsl comiolonsIon). Diuly noovInny aigumonl molouy
split() iIl, loIIlil clcomo uIonI iolzco iovosl. Hounola 1 znamon ,iozuIIl jon jounou,
lalzo moloua sIIl() vilI uvouivlovy soznam. (Hounola hy looiolIcly molIa lalo ohsaloval
znal iovnIlla. Poluu hyclom ouzIII ouzo 'key=value=foo'.split('='), uoslaII hyclom
soznam s liomI ivly ['key', 'value', 'foo'].)
}8] A nalonoc noclmo Pyllonu iovosl lonlo soznam soznamu na sIovnIl jounouuso lIm, zo joj
ioumo IunlcI dict().
> PiouclozI iIlIau so loun ouoh zIslvnI aiamoliu uolazu uvouonolo v URL, aIo iozlIau
oiavuu ouzIvanycl URL jo vo slulocnoslI sIozIljsI. Poluu so mlo zahyval aiamoliy uolazu
v URL, al io vs huuo mnolom IosI, luyz ouzIjolo IunlcI urllib.parse.parse_qs(). Ta jo
sclon zvIunoul I nlloio no iIIIs ziojmo lianIcnI iIauy.
4.. DaIsI hzno molouy iolzcu
117
4..1. VyliajovnI ouiolzcu
JalmIIo mmo vylvoion iolzoc, muzomo zIslal jalouloIIv jolo csl v ouoh novolo iolzco. AngIIcly
so lomu iIl ,:tng llo sliIng, coz muzomo ioIozIl jalo ,vyliajovnI z iolzco noho ,vyioz z iolz-
co. VyliajovnI ouiolzcu Iungujo naioslo slojn jalo vyliajovnI ousoznamu. Ono lo uv smysI,
iolozo iolzco jsou ioslo osIounoslI znalu.
>>> a_string = 'My alphabet starts where your alphabet ends.'
>>> a_string[3:11] }1]
'alphabet'
>>> a_string[3:-3] }2]
'alphabet starts where your alphabet en'
>>> a_string[0:2] }8]
'My'
>>> a_string[:18] }4]
'My alphabet starts'
>>> a_string[18:] }]
' where your alphabet ends.'
}1] Csl iolzco, vyioz (sIIco), muzomo zIslal zaunIm uvou Inuoxu. Nvialovou lounolou jo novy
iolzoc, lloiy ohsalujo vsoclny znaly (iI zaclovnI oiauI) ocInajo ivnIm Inuoxom vyiozu
a lonco znalom iou uiulym Inuoxom.
}2] PiI vyliajovnI z iolzcu muzomo iovnz ouzIl zoino Inuoxy vyiozu, slojn jalo u soznamu.
}8] Rolzco so InuoxujI ou nuIy, lalzo zIs a_string[0:2] viacI ivnI uva znaly iolzco ocInajo
znalom a_string[0] az o a_string[2] vyjma (lon uz vo vysIoulu nohuuo).
}4] Poluu jo Iovy Inuox vyiozu iovon nuIo, muzomo nuIu vynoclal. Buuo uosazona ImIIcIln.
Talzo zIs a_string[:18] jo slojny jalo a_string[0:18]. PoclocnI nuIa so uosauI jalo
ImIIcIlnI lounola.
}] Pouohn, oluu hy iavy Inuox vyiozu mI mIl lounolu iovnou uoIco iolzco, muzomo joj vy-
noclal. Talzo a_string[18:] jo loloz jalo a_string[18:44], iolozo v lomlo iolzcI so naclzI
44 znalu. A najuomo zuo ol olsIloInou symoliII. Pio lonlo 44znalovy iolzoc viacI zIs
a_string[:18] ivnIcl 18 znalu a a_string[18:] viacI vso liom ivnIcl 18 znalu. Ohocn
IalI, zo a_string[:n] vzuy vilI ivnIcl n znalu a a_string[n:] vilI zhylol nozvIsIo na
uoIco iolzco.
4.6. Rolzco vs. hajly
Bajly jsou hajly, znaly jsou ahslialco. NomnIloIn osIounosl InIcouo znalu so nazyv Ie|6zet.
NomnIloIn osIounosl cIsoI z InloivaIu u2 so nazyv ohjoll lyu Iy|e:.
4.6. Rolzco vs. hajly
118
>>> by = b'abcd\x65' }1]
>>> by
b'abcde'
>>> type(by) }2]
<class 'bytes'>
>>> len(by) }8]
5
>>> by += b'\xff' }4]
>>> by
b'abcde\xff'
>>> len(by) }]
6
>>> by[0] }6]
97
>>> by[0] = 102 }7]
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: 'bytes' object does not support item assignment
}1] Ohjoll lyu bytes uoIInujomo ouzIlIm b'', louy synlaxo io ,hajlovy IIloiI . Kazuy hajl uvnIli hajlo-
volo IIloiIu muzo hyl huu ASCII znal, noho zalouovano soslncllovo cIsIo ou \x00 uo \xff (u2).
}2] Bajlovy ohjoll jo lyu bytes.
}8] DoIlu ohsalu ohjollu lyu bytes muzomo zIslal zahuuovanou IunlcI len(), louy slojn jalo
u soznamu a iolzcu.
}4] A slojn jalo u soznamu a iolzcu, io lonlalonacI (ziolzonI, sojonI) ohjollu lyu bytes muzo-
mo ouzIl ooiloi +. VysIoulom jo novy ohjoll lyu bytes.
}] ZiolzonIm hajlovolo ohjollu a jounohajlovolo ohjollu lyu bytes vznIlno 6hajlovy ohjoll lyu bytes.
}6] Slojn jalo u soznamu a iolzcu muzomo jounolIIvo hajly z ohjollu lyu bytes ziIslunIl Inuo-
xovou nolacI. PoIozlamI iolzcu jsou znaly, oIozlamI ohjollu lyu bytes jsou cIsIa. Konlioln
jsou lo coI cIsIa z InloivaIu u2.
}7] Ohjoll lyu bytes jo nomnIloIny (ImmulahIo). JounolIIvym hajlum nomuzomo nIc iIiauIl. Poluu
oliohujolo mnIl jounolIIvo hajly, muzolo huu ouzIl vyiozy (sIIcIng) a ooiloi lonlalonaco (Iungu-
jI slojn jalo u iolzcu), noho muzolo ohjoll lyu bytes lonvoiloval na ohjoll lyu bytearray.
>>> by = b'abcd\x65'
>>> barr = bytearray(by) }1]
>>> barr
bytearray(b'abcde')
>>> len(barr) }2]
5
>>> barr[0] = 102 }8]
>>> barr
bytearray(b'fbcde')
4.6. Rolzco vs. hajly
119
}1] Pio lonvoizI ohjollu lyu bytes na ohjoll mnIloInolo lyu bytearray ouzIjlo zahuuovanou
IunlcI bytearray().
}2] Vsoclny molouy a ooiaco, lloio muzolo iovul s ohjollom lyu bytes, muzolo iovul
I s ohjollom lyu bytearray.
}8] JounIm z iozuIIu jo lo, zo ohjollu lyu bytearray muzolo iI vyuzIlI Inuoxovo nolaco iIiazoval
lounoly jounolIIvym hajlum. PiIiazovan lounola musI hyl coIo cIsIo v InloivaIu u2.
Jounou z vcI, lloio nLdy nem2e|e ud6u|, jo mIclnI hajlu s iolzcI.
>>> by = b'd'
>>> s = 'abcde'
>>> by + s }1]
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: can't concat bytes to str
>>> s.count(by) }2]
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: Can't convert 'bytes' object to str implicitly
>>> s.count(by.decode('ascii')) }8]
1
}1] Bajly a iolzco noIzo sojoval. Jsou iuznycl ualovycl lyu.
}2] Nomuzolo socIlal vyslyl hajlu v iolzcI, iolozo v iolzcI zuno hajly nojsou. Rolzoc jo o-
sIounoslI znalu. Mozn jslo mII na mysII ,socIloj vyslyly iolzco, lloiy hyclom zIslaII
o uolouovnI lolo osIounoslI hajlu iI ouzIlI uicIlolo znalovolo louovnI V oiulu,
aIo huuolo lo musol zasal oxIIcIln. Pyllon 8 noiovuI ImIIcIlnI lonvoizI hajlu na iolzco
a iolzcu na hajly.
}8] PiolvaIvou slouou oloInoslI lonlo iuol louu iIl ,socIloj vyslyly iolzco, lloiy hyclom
zIslaII o uolouovnI lolo osIounoslI hajlu iI uicIlom znalovom louovnI.
A lauy mmo sojonI mozI iolzcI a hajly: ohjoll lyu bytes m molouu decode(), lloi iohIi zna-
lovo louovnI a viacI iolzoc. A iolzco zaso majI molouu encode(), lloi iohIi znalovo louovnI
a viacI ohjoll lyu bytes. V iouclozIm iIau hyIo uolouovnI omin iImocaio co so lyl
lonvoizo osIounoslI hajlu v louovnI ASCII na iolzoc znalu. AIo slojny oslu Iungujo io IIhovoI-
no louovnI, lloio ouovIu znalum iolzco. PIalI lo uolonco I io lIsloiIcl (no InIcouo) louovnI.
>>> a_string = ' Python' }1]
>>> len(a_string)
9
>>> by = a_string.encode('utf-8') }2]
>>> by
b'\xe6\xb7\xb1\xe5\x85\xa5 Python'
4.6. Rolzco vs. hajly
120
>>> len(by)
13
>>> by = a_string.encode('gb18030') }8]
>>> by
b'\xc9\xee\xc8\xeb Python'
>>> len(by)
11
>>> by = a_string.encode('big5') }4]
>>> by
b'\xb2`\xa4J Python'
>>> len(by)
11
>>> roundtrip = by.decode('big5') }]
>>> roundtrip
' Python'
>>> a_string == roundtrip
True
}1] Tolo jo iolzoc. M uovl znalu.
}2] Tolo jo ohjoll lyu bytes. Ohsalujo 18 hajlu. PosIounosl hajlu vznIlIa zalouovnIm iolzco
a_string uo UTF-8.
}8] Tonlo ohjoll lyu bytes ohsalujo 11 hajlu. VznIlI zalouovnIm iolzco a_string v louovnI
GB18030.
}4] Tolo jo ohjoll lyu bytes. M 11 hajlu. Juo o zteu jnou o:ouno:| Iuj|, lloi vznIlIa
zalouovnIm iolzco a_string v louovnI Big5.
}] Tolo jo iolzoc. M uovl znalu. Juo o osIounosl znalu, lloiou jsmo zIslaII, luyz jsmo ohjoll
hy uolouovaII aIgoiIlmom Big5. Slouujo so s uvounIm iolzcom.
4.7. Zviocn oznmla: KouovnI znalu v yllonovslom zuiojovom loxlu
Pyllon 8 iouolIu, zo vs zuiojovy lou lj. lazuy souhoi s iIonou .py jo uIozon
v louovnI UTF-8.
> V Pyllonu 2 hyIo u souhoiu s iIonou .py vyclozIm louovnIm ASCII.
V Pyllonu 8 jo vyclozIm louovnIm UTF-8.
Poluu hyslo vo svycl zuiojovycl loxlocl cllII ouzIval jIno louovnI, muzolo na ivnI iuol souhoiu
vIozIl uolIaiacI ouzIlolo louovnI. Talo uolIaiaco iIl, zo souhoi .py ouzIv louovnI vInuovs-122:
# -*- coding: windows-1252 -*-
4.7. Zviocn oznmla: KouovnI znalu
v yllonovslom zuiojovom loxlu
121
Z loclnIclolo olIouu muzolo uolIaiacI ouzIlolo louovnI umIslIl I na uiuly iuol. Na ivnIm
iulu so muzo vyslyloval UNIXovsly magIcly iIlazovy lomonli (lasl-hang commanu).
#!/usr/bin/python3
# -*- coding: windows-1252 -*-
VIco InIoimacI naIoznolo v PEP Z8: Dofining Pythnn Snurco Cndo Fncndings.
(vvv.yllon.oigluovloslo-u268l)
4.8. Piocllo sI
O InIcouo v jazyco Pyllon:
- Pythnn Unicndo HOWTO
(lll:lluocs.yllon.oigly8lllovlolunIcouo.llmI)
- Whut's Now In Pythnn 8: Toxt vs. Dutu Instoud Of Unicndo vs. 8-bit
(lll:lluocs.yllon.oiglioIoasol8.u.1lvlalsnovl8.u.llmI)
- PEP Z1 vysvlIujo, jal Pyllon zaclzI s asliInImI znaly mImo ZlIaunI vIcojazycnou iovInu
(BasIc MuIlIIInguaI PIano), lj. so znaly s oiuInInI lounolou vlsI noz 68.
(vvv.yllon.oigluovloslo-u261l)
O InIcouo ohocn:
- Tho Absnluto Minimum Fvory Snftwuro Dovolnpor Absnlutoly, Pnsitivoly Must Knnw Abnut
Unicndo und Chuructor Sots (Nn Fxcusos!}
(vvv.jooIonsoIlvaio.comlailIcIoslInIcouo.llmI)
- On tho Gnndnoss nf Unicndo
(vvv.lhiay.oiglongoInglWlonl2uuxl2uu8lu4lu6lInIcouo)
- On Chuructor Strings
(vvv.lhiay.oiglongoInglWlonl2uuxl2uu8lu4l18lSliIngs)
- Chuructors vs. Bytos
(vvv.lhiay.oiglongoInglWlonl2uuxl2uu8lu4l26lITI)
O znalovom louovnI v jInycl Ioimlocl:
- Chuructor oncnding in XML
(lll:llIoouaisoi.oigluocslclaiacloi-oncouIng.llmI)
- Chuructor oncnding in HTML
(lll:llhIog.vlalvg.oiglllo-ioau-lo-llmI--claiacloi-oncouIng)
4.8. Piocllo sI
122
O iolzcIcl a jojIcl IoimlovnI:
- string - Cnmmnn string nporutinns
- Fnrmut String Syntux
- Fnrmut Spocificutinn Mini-Lunguugo
(vso na lll:lluocs.yllon.oigly8llIIhiaiylsliIng.llmI)
- PEP 8101: Advuncod String Fnrmutting
(vvv.yllon.oigluovloslo-81u1l)
4.8. Piocllo sI
123
5. Regulrn vrazy
. KaIloIa
Some people, when confronted with a problem,
think I know, Ill use regular expressions.
Now they have two problems.
(Kuyz so nlloiI IIuo sollajI s iohIomom,
omysII sI: ,J vIm! PouzIjI ioguIinI vyiazy.
V lom olamzIlu majI iohIomy uva.)
JamIo ZavInslI
124
5. Regulrn vrazy 123
.1. Ponoimo so 125
.2. PiIauov sluuIo: Auiosa uIIco 125
.8. PiIauov sluuIo: RImsl cIsIa 128
.8.1. KonlioIa lIsIcovol 128
.8.2. KonlioIa slovol 129
.4. VyuzIlI synlaxo {n,m} 131
.4.1. KonlioIa uosIlol a jounolol 132
.. VIcosIovno ioguIinI vyiazy 134
.6. PiIauov sluuIo:
AnaIyza loIoIonnIcl cIsoI 136
.7. SlinulI 141
Ohsal laIloIy
125
.1. Ponoimo so
ZIslvnI maIycl louslu loxlu z voIlycl hIolu loxlu iouslavujo vyzvu. Pyllonovslo iolzcovo oh-
jolly oslylujI molouy io vylIouvnI a nliauy: index(), find(), split(), count(), replace() alu.
AIo ouzIlI lcllo molou jo omozono na nojjounouussI iIauy. Tal naiIlIau moloua index() lIou
jouIny, ovn zauany iolzoc a vylIouvnI jo vzuy cIlIIvo na voIIlosl Ismon. Poluu clcomo iolzoc
s vylIoual hoz olIouu na voIIlosl Ismon, musImo zavoIal s.lower() (iovou na maI Ismona) noho
s.upper() (iovou na voIl Ismona) a zajIslIl ouovIuajIcI iovou iolIouvanycl iolzcu. Molouy
replace() anu split() majI slojn omozonI.
Poluu svolo cIIo muzolo uoslnoul molouamI iolzcovolo ohjollu, mII hyslo jo ouzIl. Jsou iyclIo,
jounouuclo a snauno cIloIno. O iyclIom, jounouuclom a cIloInom louu hyclom so molII havIl josl
uIoulo. AIo oluu so iIslIlnolo, zo ouzIvlo voIlo mnozslvI iuznycl iolzcovycl IunlcI a iIlazu
if, ahyslo zvIuII socIInI iIauy, noho oluu musIlo lomhInoval voInI split() a join(), ahyslo
iolzco iozsolvaII na lously a zaso jo sIoovaII, v lalovycl iIauocl muzo hyl vlouno iojIl l iogu-
IinIm vyiazum.
RoguIinI vyiazy iouslavujI mocny a (vlsInou) slanuaiuIzovany zusoh vylIouvnI, nliau a ioz-
lIauu loxlu so sIozIlymI vzoicI znalu. Synlaxo ioguIinIcl vyiazu jo sIco ohlIzn a noouohn noimI-
nImu louu, aIo vysIouol muzo hyl nalonoc t|en6j: noz iosonI ouzIvajIcI mnolo iolzcovycl IunlcI.
LxIslujI uolonco zusohy, jal Izo uo ioguIinIcl vyiazu vlIual lomonlio. To znamon, zo jojIcl
soucslI muzo hyl ouiohn uolumonlaco.
> Poluu uz jslo ioguIinI vyiazy ouzIvaII v jInycl jazycIcl (jalo jsou PoiI, JavaSciIl noho PHP),
huuo vm yllonovsl synlaxo iIaual uuvin znm. Ahyslo zIslaII iolIou o uoslunycl
IunlcIcl a jojIcl aigumonlocl, iocllo sI slinulI v uolumonlacI mouuIu re.
.2. PiIauov sluuIo: Auiosa uIIco
NsIouujIcI soiIo iIlIauu hyIa InsIiovna iohIomom, lloiy jsom iou nloIIla Ioly iosII v icI.
PoliohovaI jsom vycIslIl a slanuaiuIzoval auiosy uIIc, lloio hyIy vyoxoilovano z uvounIlo syslomu,
josl iou jojIcl Imoilom uo novolo syslomu. (VIuIlo J sI ly vcI jon lal novymysIIm. Ony jsou
vo slulocnoslI uzIlocno.) Tonlo iIlIau ulazujo, jal jsom na lo soI.
>>> s = '100 NORTH MAIN ROAD'
>>> s.replace('ROAD', 'RD.') }1]
'100 NORTH MAIN RD.'
>>> s = '100 NORTH BROAD ROAD'
>>> s.replace('ROAD', 'RD.') }2]
'100 NORTH BRD. RD.'
>>> s[:-4] + s[-4:].replace('ROAD', 'RD.') }8]
'100 NORTH BROAD RD.'
.1. Ponoimo so
.2. PiIauov sluuIo: Auiosa uIIco
126
>>> import re }4]
>>> re.sub('ROAD$', 'RD.', s) }]
'100 NORTH BROAD RD.'
}1] Mym cIIom hyIo slanuaiuIzoval auiosu uIIco lal, ahy so 'ROAD' vzuycly zlilIIo na 'RD.'.
Na ivnI olIou jsom sI mysIoI, zo jo lo uosl jounouuclo, lalzo iosl ouzIjI iolzcovou molo-
uu replace(). Konocloncu, vsoclna uala uz hyIa iovouona na voIl Ismona, lalzo iohIom
cIlIIvoslI na voIIlosl Ismon ouauI. A vylIouvany iolzoc 'ROAD' jo lonslanlnI. A v lomlo
lIamn jounouuclom iIau s.replace() samoziojm Iungujo.
}2] ZIvol jo aIo, nanoslslI, Iny iolIiIlIauu a na jouon lalovy jsom lnou naiazII. PiohIom nsIo-
uujIcI auiosy socIv v uvojIm vyslylu 'ROAD'. Jounou juo o csl jmona uIIco 'BROAD' a jounou
o samoslalno sIovo. Moloua replace() lylo uva vyslyly najuo a sIo jo oha naliauI. A j jon
ozoiujI, jal so mo auiosy lazI.
}8] Ahyclom iohIom auios s vIco noz jounIm vyslylom ouiolzco 'ROAD' vyiosIII, muzomo so
uclyIIl l ncomu lalovomu: lIounI a nliauu 'ROAD' huuomo iovul jon v osIounIcl
clyiocl znacIcl auiosy (s[-4:]) a zhylol iolzco onoclmo hozo zmny (s[:-4]). AIo uz samI
vIuIlo, zo lo zacIn hyl lzlouno. NaiIlIau uz jon lo, zo iosonI zvIsI na uoIco iolzco, lloiy
naliazujomo. (Poluu hyclom cllII naliauIl 'STREET' zliallou 'ST.', musoII hyclom nasal
s[:-6] a s[-6:].replace(...).) LIhIIo hy so vm, luyhyslo so l lomu musoII za sosl msIcu
vilIl a lIoual clyhu Jsom sI jIsly, zo no.
}4] NaslaI cas, ahyclom iosII l ioguIinIm vyiazum. Vosloi Iunlcnosl sojon s ioguIinImI
vyiazy so v Pyllonu naclzI v mouuIu re.
}] PouIvojmo so na ivnI aiamoli: 'ROAD$'. Juo o jounouucly ioguIinI vyiaz, lo lloiomu 'ROAD'
asujo jon v iIau, luyz so vyslylno na loncI iolzco. Znal $ vyjauiujo ,lonoc iolzco.
(LxIslujo lalo ouovIuajIcI znal, sliIsla ^, lloi znamon ,zaclol iolzco.) VoInIm Iunlco
re.sub() lIoumo v iolzcI s ioguIinI vyiaz 'ROAD$' a naliauImo joj iolzcom 'RD.'. NaIozno
so lIm ROAD na loncI iolzco s, aIo nonaIozno so ouiolzoc ROAD, lloiy jo soucslI sIova BROAD.
To so lolIz naclzI uiosliou iolzco s.
Poliacujmo v mom iIhlu o cIslnI auios. Bizy jsom
zjIslII, zo iouclozI iosonI, luy 'ROAD' IIcujo s loncom
auiosy, nonI uosl uohio. No vsoclny auiosy lolIz ohsalujI
uaj, zo so joun o uIIcI. Nlloio auiosy jounouuso loncI
jmonom uIIco. VlsInou lo vysIo, aIo oluu hy so uIIco
jmonovaIa 'BROAD', al hy ioguIinI vyiaz asovaI
na 'ROAD', lloio so naclzI na loncI iolzco, aIo jo soucs-
lI sIova 'BROAD'. A lo nonI lo, co hycl oliohovaI.
.2. PiIauov sluuIo: Auiosa uIIco
^ odpovd zatku etzce.
$ odpovd konci etzce.
127
>>> s = '100 BROAD'
>>> re.sub('ROAD$', 'RD.', s)
'100 BRD.'
>>> re.sub('\\bROAD$', 'RD.', s) }1]
'100 BROAD'
>>> re.sub(r'\bROAD$', 'RD.', s) }2]
'100 BROAD'
>>> s = '100 BROAD ROAD APT. 3'
>>> re.sub(r'\bROAD$', 'RD.', s) }8]
'100 BROAD ROAD APT. 3'
>>> re.sub(r'\bROAD\b', 'RD.', s) }4]
'100 BROAD RD. APT 3'
}1] To, co jsom oruvdu cllI, hyIo vylIounI ouiolzco 'ROAD', lloiy so naclzoI na loncI iolzco
u nuvt |voI :umo:|u|n6 :ovo (a no csl njalolo uoIsIlo sIova). V ioguIinIm vyiazu lo vy-
juiImo zIsom \b, lloiy m vyznam ,lianIco sIova so musI vyslylnoul iv lauy (h jalo
hounuaiy). V Pyllonu jo lo lomIIlovano slulocnoslI, zo znal '\' musImo v iolzcI vyjuiIl
zvIslnIm zusohom. (Tonlo znal so angIIcly nazyv loz ,oscao claiacloi a ouzIv so io
zIs zvIslnIcl osIounoslI. M louy zvIslnI vyznam. Poluu joj clcomo ouzIl v ioslom
vyznamu, musImo joj lalo zasal jalo ,oscao solvoncI. PiallIcly lo znamon, zo joj musI-
mo zuvojIl.) Nluy so lo oznacujo jalo moi zlnycl IomIlol. Jo lo jouon z uuvouu, ioc so
sanI ioguIinIcl vyiazu v PoiIu jovI snaunjsI noz v jazyco Pyllon. NogalIvnI slinlou PoiIu
jo mIclnI vIaslnIcl ioguIinIcl vyiazu a ouIIsnoslI iI jojIcl zIsu. Talzo oluu so nluo
iojovujo clyha, u so nluy ohlIzn oulaunoul, zua jo lo clyha synlaxo noho clyha vo vasom
ioguIinIm vyiazu.
}2] Moi zlnycl IomIlol muzomo ohojIl lIm, zo uvouonIm Ismono r iou uvozovacIm znalom
ouzIjomo lo, comu so iIl :urovy Ie|6zet (vo smysIu iIiounI, noziacovany; angIIcly iav
sliIng). TIm Pyllonu iIlmo, zo so v lomlo iolzcI noouzIvajI socIInI osIounoslI (oscao
soquonco). ZIs '\t' vyjauiujo lahuIacnI znal, aIo r'\t' so oiavuu clo jalo znal \ nsIo-
uovany Ismonom l. Poluu huuolo iacoval s ioguIinImI vyiazy, uooiucujI vm vzuy ouzI-
val suiovo iolzco. V oacnom iIau uosjolo voImI iyclIo l voIlym zmallum. (RoguIinI
vyiazy jsou uz I lal uosl maloucI.)
}8] Ath jo. NanoslslI jsom hizy nasoI iIauy, lloio ouoiovaIy momu iIsluu. V lomlo iIau
ohsalovaIa auiosa sIovo 'ROAD' jalo samoslalno sIovo, aIo lo so nonaclzoIo na loncI. Za ozna-
conIm uIIco so lolIz naclzoIo cIsIo hylu. A iolozo so 'ROAD' nonaclzoIo na Inom loncI
iolzco, noasovaIo lo s ioguIinIm vyiazom, lalzo coIo voInI re.sub() noiovouIo vuhoc
zunou nliauu a vilII so uvounI iolzoc, coz nohyIo lo, co jsom cllI.
}4] Ahycl lonlo iohIom vyiosII, ouslianII jsom znal $ a iIuaI jsom uaIsI \b. Tou uz ioguIinI
vyiaz muzomo cIsl ,vylIouoj samoslalno sIovo 'ROAD' luoloIIv v iolzcI, al uz jo lo na loncI,
na zacllu noho nluo uiosliou.
.2. PiIauov sluuIo: Auiosa uIIco
128
.8. PiIauov sluuIo: RImsl cIsIa
RImsl cIsIa uz jslo uicIl vIuII, I luyz jslo jo mozn noiozoznaII. MolII jslo jo vIul u slaiycl IIImu
noho loIovIznIcl oiauu jalo ,CoyiIgll MCMXLVI mIslo ,CoyiIgll 1946, noho na slncl lnIlovon
a unIvoizIl (,zaIozono MDCCCLXXXVIII mIslo ,zaIozono 1888 ). MolII jslo jo vIul v iuznycl cIsIovnIcl
a oulazocl na IIloialuiu. Juo o syslom zIsu cIsoI, lloiy so oiavuu ualujo uo uoh slaiolo iImslolo
ImoiIa (iolo lon nzov).
I iImslycl cIsoI so ouzIv soum znalu, lloio so oalujI a lomhInujI iuznymI zusohy, ahy vyjuiIIy
cIsoInou lounolu.
I = 1
V = 5
X = 10
L = 50
C = 100
D = 500
M = 1000
NsIouujI zlIaunI iavIuIa io lonsliulcI iImslycl cIsoI:
- V nlloiycl iIauocl so znaly scIlajI. I jo 1, II jo iovno 2 a III znamon 3. VI so iovn 6 (uosIo-
va ,5 a 1), VII jo 7 a VIII jo 8.
- DosIllovo znaly (I, X, C a M) so molou oaloval nanojvys liIlil. Hounolu 4 musImo vyjuiIl ouo-
clonIm ou uaIsIlo vyssIlo llovolo znalu. Hounolu 4 nomuzomo zasal jalo IIII. MIslo lolo jI
musImo zasal jalo IV (,o 1 mon noz 5). 40 so zaIsujo jalo XL (,o 10 mon noz 50), 41 jalo XLI,
42 jalo XLII, 43 jalo XLIII a nsIouujo 44 jalo XLIV (,o 10 mon noz 50 a l lomu o 1 mon noz 5).
- Nluy znaly vyjauiujI... oal scIlnI. Kuyz nlloio znaly umIslImo iou jIno, iovuImo oucIlnI
ou lonocno lounoly. NaiIlIau lounolu 9 musImo vyjuiIl ouoclonIm ou uaIsIlo vyssIlo uosIllo-
volo znalu: 8 zaIsomo jalo VIII, aIo 9 zaIsomo IX (,o 1 mon noz 10) a no jalo VIIII (iolozo
znal I nomuzomo oaloval clyiIlil). 90 jo XC, 900 jo CM.
- Pllovo znaly so nosmI oaloval. 10 so vzuy zaIsujo jalo X a nIluy jalo VV. 100 jo vzuy C, nIluy LL.
- RImsl cIsIa so clou zIova uoiava, lalzo na oiauI znalu voImI zIozI. DC znamon 600, aIo CD
jo In jIno cIsIo (400, ,o 100 mon noz 500). CI jo 101; IC nonI uolonco vuhoc Ialno iImslo
cIsIo (iolozo 1 nomuzomo iImo oucIlal ou 100; musImo lo nasal jalo XCIX, ,o 10 mon noz 100
a l lomu o 1 mon noz 10).
.8.1. KonlioIa lIsIcovol
Jal hyclom vIasln molII oviIl, zua jo IIhovoIny iolzoc Ialnym iImslym cIsIom PouIvojmo so na lo
o jounolIIvycl cIsIIcIcl. RImslo cIsIIco so vzuycly IsI ou nojvlsIcl l nojmonsIm. Zacnmo louy
u nojvyssIcl, na mIsl lIsIcovol. I cIsoI 1000 a vyssIcl so lIsIcovly vyjauiujI jalo iaua znalu M.
.8. PiIauov sluuIo: RImsl cIsIa
129
>>> import re
>>> pattern = '^M?M?M?$' }1]
>>> re.search(pattern, 'M') }2]
<_sre.SRE_Match object at 0106FB58>
>>> re.search(pattern, 'MM') }8]
<_sre.SRE_Match object at 0106C290>
>>> re.search(pattern, 'MMM') }4]
<_sre.SRE_Match object at 0106AA38>
>>> re.search(pattern, 'MMMM') }]
>>> re.search(pattern, '') }6]
<_sre.SRE_Match object at 0106F4A8>
}1] Tonlo vzoiol m liI cslI. Znal ^ zajIslI vazhu uaIsI cslI vyiazu na zaclol iolzco. Poluu hy-
clom joj noouzIII, al hy vzoiol asovaI nozvIsIo na lom, luo hy so znaly M naclzoIy. A lo
hyclom nocllII. Clcomo sI hyl jIslI nIm, zo oluu so njalo znaly M najuou, musI so nacl-
zol na zacllu iolzco. ZIs M ouovIu noovInnomu vyslylu jounolo znalu M. A iolozo
so oalujo liIlil, ouovIu vyiaz vyslylu zunolo az liI znalu M za sohou. Znal $ ouovIu
loncI iolzco. Kuyz lo umo uoliomauy so znalom ^ na zacllu, znamon lo, zo vzoiol musI
ouovIual coIomu iolzcI. Znalum M nomuzo zuny jIny znal iouclzol a anI za nImI nomuzo
nsIouoval.
}2] ZlIauom mouuIu io jo Iunlco search(). Ta iohIi ioguIinI vyiaz (alloin) a iolzoc ('M')
a zlusI, joslII l soh asujI. Poluu jo sloua naIozona, vilI Iunlco search() ohjoll, lloiy nahIzI
iuzno molouy l oIsu vysIoulu. Poluu lo slou nouojuo, viacI Iunlco search() lounolu
None, coz jo yllonovsl lounola nuII (nII, nIc). V lomlo olamzIlu ns zajIm jon lo, zua
vzoiol asujo. Ahyclom molII ouovul, slacI so ouIval na nvialovou lounolu Iunlco
search(). Rolzoc 'M' ouovIu ioguIinImu vyiazu, iolozo ivnI noovInny znal M souI
a uiuly a liolI noovInny znal M so Ignoiujo.
}8] Rolzoc 'MM' vylovujo, iolozo ivnI a uiuly noovInny znal M asujI a liolI M so Ignoiujo.
}4] Rolzoc 'MMM' vylovujo, iolozo vsoclny liI znaly M asujI.
}] Rolzoc 'MMMM' novylovujo. Vsoclny liI znaly M asujI, aIo al ioguIinI vyiaz liv na lom, zo
iolzoc musI sloncIl (iolozo jo lo iouosno znalom $). Jonzo iolzoc josl noloncI (iolozo
nsIouujo clvilo M). Talzo search() viacI None.
}6] ZajImavo jo, zo izuny iolzoc lomulo ioguIinImu vyiazu vylovujo, iolozo vsoclny znaly M
jsou noovInno.
.8.2. KonlioIa slovol
KonlioIa slovol jo ohlIznjsI noz lonlioIa lIsIcovol. Jo lo
lIm, zo v zvIsIoslI na lounol oxIslujo nloIIl vzjom-
n so vyIucujIcIcl zusohu, lloiymI molou hyl slovly
vyjuiony.
.8. PiIauov sluuIo: RImsl cIsIa
? k, e vzorek je nepovinn.
130
100 = C
200 = CC
300 = CCC
400 = CD
500 = D
600 = DC
700 = DCC
800 = DCCC
900 = CM
Talzo lu mmo clyiI mozno vzoiy:
- CM
- CD
- Zuny az liI znaly C (nuIa v iIau, luy m hyl na mIsl slovol 0).
- D nsIouovano zunym az liomI znaly C.
PosIounI uva vzoiy muzomo zlomhInoval:
- NoovInno D nsIouovano zunym az liomI znaly C.
- NsIouujIcI iIlIau ulazujo, jal muzomo u iImslycl cIsoI oviIl zIs slovol.
>>> import re
>>> pattern = '^M?M?M?(CM|CD|D?C?C?C?)$' }1]
>>> re.search(pattern, 'MCM') }2]
<_sre.SRE_Match object at 01070390>
>>> re.search(pattern, 'MD') }8]
<_sre.SRE_Match object at 01073A50>
>>> re.search(pattern, 'MMMCCC') }4]
<_sre.SRE_Match object at 010748A8>
>>> re.search(pattern, 'MCMC') }]
>>> re.search(pattern, '') }6]
<_sre.SRE_Match object at 01071D98>
}1] Tonlo vzoiol zacIn slojn jalo u iouclozIlo iIlIauu. KonlioIujomo lianIcI zacllu iolzco
(^) a olom mIslo io lIsIcovly (M?M?M?). V zvoilcl jo olo uvouona nov csl, lloi uoII-
nujo sauu liI vzjomn vyIucnycl vzoilu ouuIonycl svIsIymI caiamI: CM, CD a D?C?C?C? (coz
vyjauiujo noovInno D nsIouovano zunym noho liomI znaly C). AnaIyzloi (aisoi) ioguIinI-
lo vyiazu lonlioIujo lazuy z lcllo vzoilu v uanom oiauI (zIova uoiava), zvoII ivnI, lloiy
sIluacI ouovIu, a oslalnI Ignoiujo.
}2] Rolzoc 'MCM' vylovujo, iolozo asujo ivnI M, uiuly a liolI znal M vzoilu so IgnoiujI. NsIo-
uujIcI ouiolzoc CM ouovIu ivnImu vzoilu v zvoico (lalzo cslI vzoilu CD a D?C?C?C?
so nouvazujI). MCM jo iImslo cIsIo vyjauiujIcI lounolu 1900.
.8. PiIauov sluuIo: RImsl cIsIa
131
}8] Rolzoc 'MD' vylovujo, iolozo asujo ivnI M, uiulo a liolI M so IgnoiujI. Vzoiol D?C?C?C?
asujo l D (lazuy z nsIouujIcIcl liI znalu C jo noovInny, lalzo so IgnoiujI). MD jo iImslo cIsIo
vyjauiujIcI 1500.
}4] Rolzoc 'MMMCCC' loslom iosoI. Vsoclny liI znaly M asujI. NsIouujIcI vzoiol D?C?C?C? asujo
l ouiolzcI CCC (znal D jo noovInny a Ignoiujo so). MMMCCC jo iImslo cIsIo vyjauiujIcI lounolu 3300.
}] Rolzoc 'MCMC' novylovujo. PivnI znal M asujo, uiulo a liolI M so IgnoiujI. NsIouujIcI CM
vylovujo, aIo olo vzoiol iouoIsujo znal $, lloiy nosouI, iolozo josl nojsmo na loncI iolz-
co. (Poiu nm zhyv noziacovany znal C.) PosIounI znal C neze nuu:ovu| anI na csl vzoilu
D?C?C?C?, iolozo la so vzjomn vyIucujo s cslI vzoilu CM, lloi so jIz ouzIIa.
}6] ZajImavo jo, zo lomulo vzoilu vylovujo izuny iolzoc, iolozo vsoclny znaly M jsou noovIn-
no a IgnoiujI so. Pizuny iolzoc uIo vylovujo I cslI vzoilu D?C?C?C?, iolozo vsoclny znaly
jsou noovInno a IgnoiujI so.
IIIII! VIuIlo, jal so molou ioguIinI vyiazy iyclIo sll noclulnymI A lo jsmo zalIm vyiosIII cslI iImslycl
cIsoI jon io lIsIco a slovly. AIo oluu jslo zalIm vso sIouovaII, huuou io vs uosIlly a jounolly jounouuclo,
iolozo u nIcl ouzIjomo naioslo slojny iIslu. AIo ouIvojmo so josl na uaIsI moznosl vyjuionI vzoilu.
.4. VyuzIlI synlaxo {n,m}
V iouclzojIcI oulaIloIo jsmo iacovaII so vzoilom,
vo lloiom so molIy slojno znaly oaloval az liIlil. V iogu-
IinIcl vyiazocl oxIslujo josl jIny zusoh, jal lo vyjuiIl.
NlloiI IIuo joj ovazujI za cIloInjsI. PouIvojmo so nojuiIvo
na zusohy, lloio jsmo ouzIII v iouclzojIcIm iIlIauu.
>>> import re
>>> pattern = '^M?M?M?$'
>>> re.search(pattern, 'M') }1]
<_sre.SRE_Match object at 0x008EE090>
>>> re.search(pattern, 'MM') }2]
<_sre.SRE_Match object at 0x008EEB48>
>>> re.search(pattern, 'MMM') }8]
<_sre.SRE_Match object at 0x008EE090>
>>> re.search(pattern, 'MMMM') }4]
>>>
}1] Zuo uoclzI lo slou so zacllom iolzco a s ivnIm noovInnym M, aIo no s uiulym a s liolIm M
(coz jo v oiulu, iolozo jsou noovInn). Polom nsIouujo lonoc iolzco.
}2] Zuo uoclzI lo slou so zacllom iolzco a s ivnIm a uiulym noovInnym M, aIo no s liolIm M
(aIo lo jo v oiulu, iolozo jo noovInno). Polo asujo I lonoc iolzco.
.4. VyuzIlI synlaxo {n,m}
Zpis {1,4} vyjaduje 1 a 4
vskyty vzorku.
132
}8] Zuo uoclzI lo slou so zacllom iolzco, so vsomI liomI noovInnymI M a s loncom iolzco.
}4] Zuo uoclzI lo slou so zacllom iolzco a so vsomI liomI noovInnymI M, aIo olo nonsIouu-
jo iouosany lonoc iolzco (iolozo lu mmo josl jouno noasujIcI M). To znamon, zo vzoiol
nosouI a viacI so None.
>>> pattern = '^M{0,3}$' }1]
>>> re.search(pattern, 'M') }2]
<_sre.SRE_Match object at 0x008EEB48>
>>> re.search(pattern, 'MM') }8]
<_sre.SRE_Match object at 0x008EE090>
>>> re.search(pattern, 'MMM') }4]
<_sre.SRE_Match object at 0x008EEDA8>
>>> re.search(pattern, 'MMMM') }]
>>>
}1] Tonlo vzoiol iIl: ,Zuo musI hyl zaclol iolzco, olom nsIouujI nuIa az liI znaly M a al
musI hyl lonoc iolzco. Na mIsl u a 8 molou hyl uvouona IIhovoIn cIsIa. Poluu clcomo
iouosal ,nojmon jouon, aIo no vIc noz liI znaly M, muzomo nasal M{1,3}.
}2] Zuo uoclzI lo slou so zacllom iolzco a al s jounIm zo liI moznycl M a s loncom iolzco.
}8] Zuo uoclzI lo slou so zacllom iolzco a al s uvma zo liI moznycl M a s loncom iolzco.
}4] Zuo uoclzI lo slou so zacllom iolzco a al s liomI zo liI moznycl M a s loncom iolzco.
}] Zuo uoclzI lo slou so zacllom iolzco a al s liomI zo liI moznycl M, aIo olo nouoclzI
lo slou s iouIsom io lonoc iolzco. Tonlo ioguIinI vyiaz iouoIsujo maxImIn liI znaly M
nsIouovano loncom iolzco, aIo iolzoc ohsalujo clyiI, lalzo vzoiol noasujo a viacI so None.
.4.1. KonlioIa uosIlol a jounolol
RozsIimo louy ioguIinI vyiaz io lonlioIu iImslycl cIsoI o lonlioIu na mIsl uosIlol a jounolol. NsIo-
uujIcI iIlIau ulazujo, jal muzomo lonlioIoval uosIlly.
>>> pattern = '^M?M?M?(CM|CD|D?C?C?C?)(XC|XL|L?X?X?X?)$'
>>> re.search(pattern, 'MCMXL') }1]
<_sre.SRE_Match object at 0x008EEB48>
>>> re.search(pattern, 'MCML') }2]
<_sre.SRE_Match object at 0x008EEB48>
>>> re.search(pattern, 'MCMLX') }8]
<_sre.SRE_Match object at 0x008EEB48>
>>> re.search(pattern, 'MCMLXXX') }4]
<_sre.SRE_Match object at 0x008EEB48>
>>> re.search(pattern, 'MCMLXXXX') }]
>>>
.4. VyuzIlI synlaxo {n,m}
133
}1] Tonlo iolzoc asujo l iouosanomu zacllu iolzco, al l ivnImu noovInnomu M, nsIo-
uujo sloua s CM, olo s XL a s iouIsom io lonoc iolzco. PiIomomo sI, zo synlaxo (A|B|C)
vyjauiujo ,ouovIu iv jounomu z A, B noho C. DosIo lo slou s XL, lalzo so IgnoiujI
moznoslI XC a L?X?X?X?. Polo hyI naIozon lonoc iolzco. MCMXL jo iImslo cIsIo vyjauiujIcI
lounolu 1940.
}2] Tonlo iolzoc vylovujo iouosanomu zacllu iolzco, al ivnImu noovInnomu M, nsIouujo
sloua s CM a al s L?X?X?X?. Co so lyl cslI L?X?X?X?, vylovujo jI L a ioslalujI so vsoclny
liI noovInno znaly X. Polo so uoslvmo lo loncI iolzco. MCML jo iImslo cIsIo vyjauiujIcI
lounolu 1950.
}8] Tonlo iolzoc asujo l iouosanomu zacllu iolzco, al l ivnImu noovInnomu M, nsIo-
uujo sloua s CM, olo s noovInnym L, s ivnIm noovInnym X, al so ioslocI uiulo a liolI
noovInno X a nsIouujo ocolvany lonoc iolzco. MCMLX jo iImslo cIsIo vyjauiujIcI lounolu
1960.
}4] Tonlo iolzoc vylovujo iouosanomu zacllu iolzco, al ivnImu noovInnomu M, olom CM,
al nsIouujo noovInno L a vsoclna liI noovInn X a vyzauovany lonoc iolzco. MCMLXXX jo
iImslo cIsIo vyjauiujIcI lounolu 1980.
}] Tonlo iIau vylovujo iouosanomu zacllu iolzco, al ivnImu noovInnomu M, olom CM,
al lu mmo noovInno L a vsoclna liI noovInn X, aIo olo uoclzI l soIlnI iouolIauu
lonco iolzco, iolozo nm zhyv josl jouno X, so lloiym jsmo noocIlaII. Talzo coIy ioguIinI
vyiaz soIlv (noasujo) a viacI so Nono. MCMLXXXX nonI Ialno iImslo cIsIo.
Vyiaz io losl jounolol vylvoiImo slojnym zusohom.
IsoliIm vs uolaIIu a ulzu vm jon lonocny vysIouol.
>>> pattern = '^M?M?M?(CM|CD|D?C?C?C?)(XC|XL|L?X?X?X?)(IX|IV|V?I?I?I?)$'
Talzo jal hy lo vyauaIo, luyhyclom ouzIII aIloinalIvnI synlaxI {n,m} To nm ulzo nsIouujIcI
iIlIau.
>>> pattern = '^M{0,3}(CM|CD|D?C{0,3})(XC|XL|L?X{0,3})(IX|IV|V?I{0,3})$'
>>> re.search(pattern, 'MDLV') }1]
<_sre.SRE_Match object at 0x008EEB48>
>>> re.search(pattern, 'MMDCLXVI') }2]
<_sre.SRE_Match object at 0x008EEB48>
>>> re.search(pattern, 'MMMDCCCLXXXVIII') }8]
<_sre.SRE_Match object at 0x008EEB48>
>>> re.search(pattern, 'I') }4]
<_sre.SRE_Match object at 0x008EEB48>
.4. VyuzIlI synlaxo {n,m}
(A|B) pedepisuje bu shodu se
vzorkem A nebo se vzorkem B,
ale ne s obma najednou.
134
}1] Zuo uoclzI lo slou so zacllom iolzco, al s jounIm zo liI moznycl znalu M a nsIoun
s iouIsom D?C{0,3}. I osIounIlo ouvyiazu uoclzI lo slou s noovInnym D a s nuIou
zo liI moznycl znalu C. Posumo so uI. Zuo asujo ouvyiaz L?X{0,3}, iolozo vylovI no-
ovInno L a nuIa zo liI moznycl znalu X. DaIsI lousol iolzco vylovujo ouvyiazu V?I{0,3},
iolozo jo naIozono noovInno V a nuIa zo liI moznycl znalu I. A na zvi naslv ocolvany
lonoc iolzco. MDLV jo iImslo cIsIo vyjauiujIcI lounolu 1555.
}2] Zuo uoclzI lo slou so zacllom iolzco a al s uvma zo liI moznycl znalu M, al
s D?C{0,3} s jounIm D a s jounIm zo liI moznycl znalu C. Poliacujomo L?X{0,3} s jounIm L
a jounIm zo liI moznycl znalu X. A uIo lu mmo V?I{0,3} s jounIm V a jounIm zo liI moznycl
znalu I. Pasujo I ocolvany lonoc iolzco. MMDCLXVI jo iImslo cIsIo vyjauiujIcI lounolu 2666.
}8] Zuo uoclzI lo slou so zacllom iolzco a al s liomI zo liI moznycl znalu M, al jo lu
D?C{0,3} s jounIm D a s liomI zo liI moznycl znalu C. Poliacujomo L?X{0,3} s jounIm L
a s liomI zo liI moznycl znalu X. A uIo so uIalnI V?I{0,3} s jounIm V a s liomI zo liI moz-
nycl znalu I. A ocolvany lonoc iolzco. MMMDCCCLXXXVIII jo iImslo cIsIo vyjauiujIcI lounolu
3888. Soucasn jo lo nojvlsI iImslo cIsIo, lloio muzolo nasal hoz ouzIlI iozsIiono synlaxo.
}4] A lou so ozoin uIvojlo. (PiIaum sI jalo louzoInIl. ,DlI, ozoin so uIvojlo. Tou zo svolo
lIohoulu vyllnu liIIla.) Tauy nm asujo zaclol iolzco, al nsIouujo nuIa zo liI moz-
nycl znalu M, al asujo D?C{0,3} iosloconI noovInnolo D a ahsonco znalu C (nuIa az
liI mozno vyslyly). Poliacujomo slouou s ouvyiazom L?X{0,3} iosloconIm noovInnolo L
a iIuslnou ahsoncI znalu X (nuIa az liI mozno vyslyly). A uIo so uIalnI V?I{0,3} iosloco-
nIm noovInnolo V a slouou jounolo zo liI moznycl znalu I. A al jo lu lonoc iolzco.
No nI.
Poluu jslo lo vsoclno slIlII sIouoval a iozumII jslo lomu naoivo, juo vm lo II, noz lo sIo mn.
Tou sI iouslavlo, zo so snazIlo oiozuml ioguIinImu vyiazu, lloiy nasaI nluo jIny a lloiy so
naclzI uiosliou liIlIclo Iunlco iozslIolo iogiamu. Noho sI iouslavlo, zo so o nloIIla msIcIcl
viacIlo lo svomu vIaslnImu ioguIinImu vyiazu. Iz so mI lo slaIo a nonI lo lny olIou.
PouIvojmo so na aIloinalIvnI synlaxI, lloi nm omuzo zasal ioguIinI vyiaz lal, ahy so uaI uuizoval.
.. VIcosIovno ioguIinI vyiazy
ZalIm jsmo so zahyvaII lIm, comu huuu iIlal ,lomallnI ioguIinI vyiazy. Jal jslo samI vIuII, ohlIzn
so clou. Dolonco I luyz iIjuolo na lo, co njaly z nIcl uI, nonI lu zun ziula, zo mu huuolo iozu-
ml o sosl msIcu ozujI. To, co oiavuu oliohujomo, jo uolumonlaco iIIsovan l uanomu mIslu.
V Pyllonu lolo Izo uoslnoul u lalzvanycl vte:ovnyth regu0rnth vyruz (voihoso ioguIai oxioss-
Ions). VIcosIovny ioguIinI vyiaz so ou lomallnIlo ioguIinIlo vyiazu IIsI vo uvou smiocl:
- BIIo znaly so IgnoiujI. Mozoiy, lahuIloiy a ioclouy na novy iuol so nosnazI naasoval na
mozoiy, lahuIloiy a ioclouy na novy iuol. NoasujI vuhoc l nIcomu. (Poluu clcolo vo vIco-
.. VIcosIovno ioguIinI vyiazy
135
sIovnom ioguIinIm vyiazu iouosal slouu s mozoiou, musIlo iou nI nasal zlno IomIllo
socIInI znal (oscao) uvozujIcI solvoncI.)
- Komonlio so IgnoiujI. Komonlio uvnIli vIcosIovnycl ioguIinIcl vyiazu majI ouohu hznycl
yllonovslycl lomonliu: zacInajI znalom # a oliacujI uo lonco iulu. V lomlo iIau juo
o lomonli uvnIli vIcoiulovolo iolzco a no uvnIli zuiojovolo souhoiu. AIo Iungujo slojn.
Z uaIsIlo iIlIauu lo huuo jasnjsI. RovIuujmo lomallnI ioguIinI vyiaz, s lloiym jsmo iacovaII
iou clvIII, a iovoumo joj na vIcosIovny ioguIinI vyiaz. PiIlIau nm ulzo, jal na lo.
>>> pattern = '''
^ # zatek etzce
M{0,3} # tisce - 0 a 3 M
(CM|CD|D?C{0,3}) # stovky - 900 (CM), 400 (CD), 0-300 (0 a 3 C),
# nebo 500-800 (D nsledovan 0 a 3 C)
(XC|XL|L?X{0,3}) # destky - 90 (XC), 40 (XL), 0-30 (0 a 3 X),
# nebo 50-80 (L nsledovan 0 a 3 X)
(IX|IV|V?I{0,3}) # jednotky - 9 (IX), 4 (IV), 0-3 (0 a 3 I),
# nebo 5-8 (V nsledovan 0 a 3 I)
$ # konec etzce
'''
>>> re.search(pattern, 'M', re.VERBOSE) }1]
<_sre.SRE_Match object at 0x008EEB48>
>>> re.search(pattern, 'MCMLXXXIX', re.VERBOSE) }2]
<_sre.SRE_Match object at 0x008EEB48>
>>> re.search(pattern, 'MMMDCCCLXXXVIII', re.VERBOSE) }8]
<_sre.SRE_Match object at 0x008EEB48>
>>> re.search(pattern, 'M') }4]
}1] NojuuIozIljsI vcI iI icI s vIcosIovnymI ioguIinImI vyiazy jo lo, ahyclom nozaomnII
ioual jouon aigumonl navIc: v mouuIu re jo uoIInovna lonslanla re.VERBOSE, lloiou uv-
mo najovo, zo vzoiol so m hil jalo vIcosIovny ioguIinI vyiaz. Jal vIuIlo, v lomlo vzoilu so
naclzI uocoIa loun hIIycl znalu (vsoclny so IgnoiujI) a nloIIl lomonliu (ol so vsoclny
IgnoiujI). Poluu huuolo Ignoioval hIIo znaly a lomonlio, uoslanolo naioslo slojny ioguIinI
vyiaz, jaly jsmo sI ulzaII v mInuIo oulaIloIo. AIo jo mnolom cIloInjsI.
}2] Zuo uoclzI lo slou so zacllom iolzco a al s liomI M, al s CM, nsIouujo L a liI zo liI moz-
nycl X, al IX a lonoc iolzco.
}8] Tauy asujo zaclol iolzco, al liI z moznycl liI M, nsIouujo D a liI zo liI moznycl C, al L
a liI zo liI moznycl X, al V a liI zo liI moznycl I a lonoc iolzco.
}4] Sloua nohyIa naIozona. Pioc Piolozo jsmo nouvouII iIznal re.VERBOSE. Talzo Iunlco re.search
ovazujo vzoiol za lomallnI ioguIinI vyiaz, vo lloiom liajI ioII vsoclny hIIo znaly I znaly #.
Pyllon nomuzo iozoznval aulomalIcly, zua jo ioguIinI vyiaz vIcosIovny noho no. Pyllon ova-
zujo lazuy ioguIinI vyiaz za lomallnI oluu oxIIcIln noiolnomo, zo jo vIcosIovny.
.. VIcosIovno ioguIinI vyiazy
136
.6. PiIauov sluuIo: AnaIyza loIoIonnIcl cIsoI
PiozalIm jsmo so sousliouIII na slouu coIycl vzoilu. Vzoiol huu asujo, noho no. AIo ioguIinI vyiazy
jsou josl mnolom mocnjsI. Poluu ioguIinI vyiaz u:uje, muzomo z iolzco vyhial socIIIclo soly.
Muzomo zjIslIl, jal csl a luo asovaIa.
NsIouujIcI iIlIau iInosI ol ioIny zIvol. SollaI jsom so s nIm o jouon iacovnI uon uiIvo noz s lIm
iouclozIm. PiohIom: iozlIau amoiIclolo loIoIonnIlo cIsIa. KIIonl ozauovaI, ahy so cIsIo uaIo zau-
val vo voInom lvaiu (v jounom oII IoimuIio), aIo al jo cllI mIl vo IIiomnI ualahzI iozuIono
na lou ohIaslI, lIavnI IInlu, cIsIo a iIaun lIalu.
PiosliaclaI jsom voh a nasoI jsom souslu iIlIauu
ioguIinIcl vyiazu, lloio hyIy io lonlo coI vylvoiony.
AIo zuny z nIcl nohyI uosl honovoIonlnI.
Tauy mmo i loIoIonnIcl cIsoI, lloi mIa hyl iIjala:
800-555-1212
800 555 1212
800.555.1212
(800) 555-1212
1-800-555-1212
800-555-1212-1234
800-555-1212x1234
800-555-1212 ext. 1234
work 1-(800) 555.1212 #1234
DocoIa sIioly zhi, zo V lazuom z lcllo iIauu jsom oliohovaI zjIslIl, zo cIsIo ohIaslI hyIo 800,
cIsIo lIavnI IInly hyIo 555 a zhylol loIoIonnIlo cIsIa hyI 1212. I cIsoI s lIalou (oxlonsIon, oxl.) jsom
oliohovaI zjIslIl, zo lIala hyIa 1234.
Talzo sI iojumo vyvoj iosonI io anaIyzu loIoIonnIlo cIsIa. NsIouujIcI iIlIau ulazujo ivnI liol.
>>> phonePattern = re.compile(r'^(\d{3})-(\d{3})-(\d{4})$') }1]
>>> phonePattern.search('800-555-1212').groups() }2]
('800', '555', '1212')
>>> phonePattern.search('800-555-1212-1234') }8]
>>> phonePattern.search('800-555-1212-1234').groups() }4]
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
AttributeError: 'NoneType' object has no attribute 'groups'
}1] RoguIinI vyiaz clomo vzuy zIova uoiava. Tonlo ouovIu zacllu iolzco a al nsIouujo
(\d{3}). Co lo jo \d{3}? No, `u vyjauiujo ,IIhovoInou cIsIIcI (0 az 9). SoIocn s {3} znamon
.6. PiIauov sluuIo: AnaIyza
loIoIonnIcl cIsoI
\d vyjaduje libovolnou slici
(09). \D vyjaduje ve krom
slice.
137
,iosn liI cIsIIco. Juo o vaiIacI na synlaxI {n,m}, lloiou jsmo sI ulazovaII uiIvo. Kuyz lo vso
ohaIImo uo zvoiol, znamon lo ,naasuj so iosn na liI cIsIIco u o|om : je zuumu|uj juLo
:Lunu, L|erou : m2eme vy20du| ozd6j. Pal musI nsIouoval omIcla. Pal m nsIouoval
sluIna zaso iosn liI cIsIIc. A al uaIsI omIcla. A uaIsI sluIna lonlolil clyi cIsIIc. A olo
so ocolv lonoc iolzco.
}2] Ko sluInm, lloio so zaamalovaIy hlom anaIyzy iouosano ioguIinIm vyiazom, muzomo
iIsluoval molouou groups() ohjollu, lloiy vilIIa moloua search(). ViacI loIIlacIonnou
n-lIcI, loIIl sluIn hyIo v ioguIinIm vyiazu uoIInovno. V nasom iIau jsmo uoIInovaII
liI sluIny: jounu s liomI cIsIIcomI, uaIsI s liomI cIsIIcomI a osIounI so clyimI cIsIIcomI.
}8] Tonlo ioguIinI vyiaz aIo nonI lolovy, iolozo nozvIuno loIoIonnI cIsIa s lIalou na loncI.
Pio lonlo coI musImo ioguIinI vyiaz iozsIiIl.
}4] Tonlo iIau IIusliujo, ioc hyclom vo slulocn ouzIvanom louu nomII nIluy ,iolzIl
ouzIlI molou search() a groups(). Poluu moloua search() novilI zunou slouu, viacI Nono
a nIloIIv ohjoll vyjauiujIcI slouu s ioguIinIm vyiazom (MalclOhjocl). VoInI None.groups()
vyvoI naioslo ziojmou vyjImlu. Nono lolIz zunou molouu groups() nom. (Jo lo samozioj-
m mon zjovno v sIluacI, luy so lalov vyjImla vynoiI nluo z lIouhly nasolo louu. Ano,
lauy mIuvIm z vIaslnI zlusonoslI.)
>>> phonePattern = re.compile(r'^(\d{3})-(\d{3})-(\d{4})-(\d+)$') }1]
>>> phonePattern.search('800-555-1212-1234').groups() }2]
('800', '555', '1212', '1234')
>>> phonePattern.search('800 555 1212 1234') }8]
>>>
>>> phonePattern.search('800-555-1212') }4]
>>>
}1] Tonlo ioguIinI vyiaz so s iouclozIm lomi slouujo. Talo nojuiIvo iouoIsujo zaclol iolz-
co, al so amalujo sluIna liI cIsIIc, omIcla, al so amalujo sluIna liI cIsIIc, omIcla
a nalonoc so amalujo sluIna clyi cIsIIc. Novo jo lauy lo, zo so ocolv uaIsI omIcla, al so
amalujo sluIna jouno noho vIco cIsIIc a loivo olom m naslal lonoc iolzco.
}2] Moloua groups() lou viacI n-lIcI so clyimI ivly, iolozo ioguIinI vyiaz nynI uoIInujo clyiI
amalovano sluIny.
}8] Tonlo ioguIinI vyiaz aIo, holuzoI, lalo nonI lonocnou ouovuI, iolozo iouolIu, zo
jounolIIvo cslI loIoIonnIlo cIsIa jsou ouuIony omIclou. Co luyhy jo nluo ouuIII mozoiamI,
cilamI noho loclamI Poliohujomo ohocnjsI iosonI, lloio hy alcolovaIo vIco lyu ouuIovacu.
}4] Oula! TonlIo ioguIinI vyiaz nojon zo nouI vso, co sI iojomo. Jo lo vo slulocnoslI liol zl,
iolozo lou nojsmo sclonI anaIyzoval cIsIo Iez LuLy. To vuhoc nonI lo, co jsmo cllII. Poluu
lam lIala jo, al clcomo vul jal. Poluu lam lIala nonI, al clcomo znl, jalo hyIy cslI
lIavnIlo cIsIa.
NsIouujIcI iIlIau ulazujo ioguIinI vyiaz, lloiy sI oiauI s iuznymI ouuIovacI mozI cslmI
loIoIonnIlo cIsIa.
.6. PiIauov sluuIo: AnaIyza
loIoIonnIcl cIsoI
138
>>> phonePattern = re.compile(r'^(\d{3})\D+(\d{3})\D+(\d{4})\D+(\d+)$') }1]
>>> phonePattern.search('800 555 1212 1234').groups() }2]
('800', '555', '1212', '1234')
>>> phonePattern.search('800-555-1212-1234').groups() }8]
('800', '555', '1212', '1234')
>>> phonePattern.search('80055512121234') }4]
>>>
>>> phonePattern.search('800-555-1212') }]
>>>
}1] Dizlo sI lIohouly, jouomo z loco! Ocolvmo zaclol iolzco, olom sluInu liI cIsIIc, al \D+.
A co jo zaso lolIo ZIs \D vyjauiujo IIhovoIny znal : vyjmLou cIsIIco a + znamon ,1 noho
vIclil. Talzo \D+ asujo na jouon noho vIco znalu, lloio nojsou cIsIIcomI. A lo jo iv lo,
co ouzIjomo mIslo iImo zasano omIcly a co nm huuo asoval s iuznymI ouuIovacI.
}2] Piolozo ouzIvmo \D+ mIslo -, huuo nm ioguIinI vyiaz asoval I na loIoIonnI cIsIa, luo jsou
jounolIIvo cslI ouuIony mozoiamI.
}8] AIo cIsIa ouuIon omIclamI huuou Iungoval lalo.
}4] SlIo lo aIo josl, holuzoI, nonI lonocn ouovu, iolozo lam njaly ouuIovac jo. Co luyz
nluo zau loIoIonnI cIsIo In hoz mozoi noho jInycl ouuIovacu
}] Jojua! Poiu josl nonI vyiosono lo, zo so ozauujo zaunI lIaly. Talzo lou mmo uva iohIo-
my, aIo muzomo jo oha vyiosIl slojnou loclnIlou.
NsIouujIcI iIlIau ulazujo ioguIinI vyiaz io loIoIonnI cIsIa hoz ouuIovacu.
>>> phonePattern = re.compile(r'^(\d{3})\D*(\d{3})\D*(\d{4})\D*(\d*)$') }1]
>>> phonePattern.search('80055512121234').groups() }2]
('800', '555', '1212', '1234')
>>> phonePattern.search('800.555.1212 x1234').groups() }8]
('800', '555', '1212', '1234')
>>> phonePattern.search('800-555-1212').groups() }4]
('800', '555', '1212', '')
>>> phonePattern.search('(800)5551212 x1234') }]
>>>
}1] JouIn vc, lloiou jsmo ou mInuIolo liolu uuIaII, hyIa zmna + za *. MozI cslmI loIoIon-
nIlo cIsIa nynI mIslo \D+ iouoIsujomo \D*. Pamalujolo sI josl, zo + znamon ,jounou noho
vIclil Iajn. Talzo * znamon ,nuIa noho vIco vyslylu. Talzo lou hyclom mII hyl sclonI
ziacoval cIsIa, lloi noohsalujI vuhoc zuny ouuIovacI znal.
}2] No ouIvojmo, ono lo oiavuu Iungujo! Jal lo NaasovaII jsmo so na zaclol iolzco, al jsmo
sI zaamalovaII sluInu liI cIsIIc (800), olom nuIa nonumoiIclycl znalu, al nsIouujo
zaamalovan sluIna liI cIsIIc (555), al nuIa nonumoiIclycl znalu, al zaamalovan slu-
Ina clyi cIsIIc (1212), al nuIa nonumoiIclycl znalu, al zaamalovan sluIna IIhovoInolo
oclu cIsIIc (1234) a lonoc iolzco.
.6. PiIauov sluuIo: AnaIyza
loIoIonnIcl cIsoI
139
}8] OslalnI ohmny lou IungujI lalo: locly mIslo omIcol I lomhInaco mozoi a x iou lIalou.
}4] Nalonoc so nm ouaiIIo vyiosIl I uIoulo ouoIvajIcI iohIom: lIala uz jo ol noovInn.
Moloua groups() viacI n-lIcI so clyimI ivly I loluy, luyz nohyIa naIozona lIala. V lalovom
iIau so aIo na mIsl clvilolo ivlu viacI izuny iolzoc.
}4] NoclcI hyl osIom salnycl ziv, aIo oiu josl nojsmo lolovI. Co jo lauy saln Piou
louom ohIaslI mmo znal navIc, aIo ioguIinI vyiaz iouolIu, zo na zacllu iolzco so m
jalo ivnI naclzol lou ohIaslI. Zuny iohIom. IvounI znaly iou louom ohIaslI muzomo
ioslocIl jIz uiIvo iouslavonou loclnIlou ,nuIa noho vIco nocIsoInycl znalu.
DaIsI iIlIau ulazujo, jal hyclom sI mII ocInal.
>>> phonePattern = re.compile(r'^\D*(\d{3})\D*(\d{3})\D*(\d{4})\D*(\d*)$') }1]
>>> phonePattern.search('(800)5551212 ext. 1234').groups() }2]
('800', '555', '1212', '1234')
>>> phonePattern.search('800-555-1212').groups() }8]
('800', '555', '1212', '')
>>> phonePattern.search('work 1-(800) 555.1212 #1234') }4]
>>>
}1] Tauy jo lo slojno jalo v iouclozIm iIlIauu s lou vyjImlou, zo iou ivnI amalovanou
sluInou znalu (iou cIsIom ohIaslI) iouoIsujo \D* nuIa noho vIco nonumoiIclycl znalu.
VsImnlo sI, zo sI lylo nonumoiIclo znaly noamalujomo (iouIs nonI uzavion v zvoilcl).
Poluu jsou njalo naIozony, jounouuso jo ioslocImo a loivo al sI zaamalujomo naIozono
cIsIo ohIaslI.
}2] ToIoIonnI cIsIo so nm ouaiI ssn iozIozIl I v iIau, luy jo iou cIsIom ohIaslI uvouo-
na Iov zvoila. (Piav zvoila za cIsIom ohIaslI so uz ziacovv. Boio so jalo nonumoiIcly
ouuIovac a naasujo so na iouIs \D* naclzojIcI so za ivnI amalovanou sluInou.)
}8] Piovoumo josl losl IunlcnoslI (sanIly clocl), ahyclom so ujIslIII, zo so noolazIIo nIc, co uiIvo
IungovaIo. IvounI znaly jsou zcoIa noovInno, lalzo o zacllu iolzco so nasIo nuIa nonumo-
iIclycl znalu, al amalovan sluIna liI cIsIIc (800), al jouon nonumoiIcly znal (omIcla),
zaamalovan sluIna liI cIsIIc (555), al jouon nonumoiIcly znal (omIcla), olo zaama-
lovan sluIna clyi cIsIIc (1212), al nuIa nonumoiIclycl znalu, al zaamalovan sluIna
nuIa cIsIIc a na zvi lonoc iolzco.
}4] Tal lolo jo iIau, luy mm v souvIsIoslI s ioguIinImI vyiazy clul vyuIouhnoul sI ocI luym
ioumlom. Pioc lolIo loIoIonnI cIsIo noasujo Piolozo so iou louom ohIaslI vyslylujo 1, aIo
my jsmo iouolIuaII, zo vsoclny znaly iou louom ohIaslI huuou nonumoiIclo (\D*). Giiiii.
PouIvojmo so na lo znovu. ZalIm so vsoclny ioguIinI vyiazy clylaIy na zaclol iolzco. AIo lou
vIuImo, zo so na zacllu iolzco muzo vyslylnoul ohsal nouicIlo uoIly, lloiy hyclom cllII Ignoioval.
MolII hyclom so sIco olusIl o vylvoionI iouIsu, lloiym hyclom lon zaclol ioslocIII, aIo zlusmo
l lomu iIslouIl jInal. Nohuuomo so vuhoc snazIl o lo, ahyclom so naasovaII na zaclol iolzco.
ZmInny iIslu jo ouzIl v nsIouujIcIm iIlIauu.
.6. PiIauov sluuIo: AnaIyza
loIoIonnIcl cIsoI
140
>>> phonePattern = re.compile(r'(\d{3})\D*(\d{3})\D*(\d{4})\D*(\d*)$') }1]
>>> phonePattern.search('work 1-(800) 555.1212 #1234').groups() }2]
('800', '555', '1212', '1234')
>>> phonePattern.search('800-555-1212').groups() }8]
('800', '555', '1212', '')
>>> phonePattern.search('80055512121234').groups() }4]
('800', '555', '1212', '1234')
}1] VsImnlo sI, zo v ioguIinIm vyiazu clyhI ^. Iz so nosnazImo ulolvIl na zaclol iolzco. NIluo
nonI iocono, zo hy so ns ioguIinI vyiaz mI naasoval na coIy vslunI iolzoc. MoclanIsmus,
lloiy ioguIinI vyiaz vylounocujo, uz sI u lu icI, ahy zjIslII, ou jalolo mIsla vslunIlo
iolzco uoclzI lo slou s iouIsom, a huuo oliacoval ouluu.
}2] Tou uz jsmo ssn iozIozIII loIoIonnI cIsIo, lloio ohsalujo vounI znaly I s nocllnymI cIsIy
a lloio ouuIujo sluIny cllnycl cIsoI IIhovoInym oclom IIhovoInycl ouuIovacu.
}8] Tosl IunlcnoslI (sanIly clocl). Iungujo lo sivn.
}4] A lolIo laly Iungujo.
VIuIlo, jal so muzo ioguIinI vyiaz iyclIo vymlnoul lonlioIo Lolmo milnlo na IIhovoIny z iouclo-
zIcl olusu. Poznlo snauno iozuII mozI nIm a o nm nsIouujIcIm
Talzo uoluu josl iozumImo lonocnomu iosonI (a lolIo oiavuu jo lonocno iosonI; oluu jslo ohjovIII
iIau, lloiy hy lo nozvIuIo, noclcI o nm vul), zaIsmo lo jalo vIcosIovny ioguIinI vyiaz. MolII
hyclom hizy zaomonoul, ioc jsmo nco zasaII iv lallo.
>>> phonePattern = re.compile(r'''
# nevzat se na zatek etzce, slo me zat kdekoliv
(\d{3}) # slo oblasti m 3 slice (nap. '800')
\D* # nepovinn oddlova - libovoln poet nenumerickch znak
(\d{3}) # slo hlavn linky m 3 slice (nap. '555')
\D* # nepovinn oddlova
(\d{4}) # zbytek sla m 4 slice (nap. '1212')
\D* # nepovinn oddlova
(\d*) # nepovinn klapka - libovoln poet slic
$ # konec etzce
''', re.VERBOSE)
>>> phonePattern.search('work 1-(800) 555.1212 #1234').groups() }1]
('800', '555', '1212', '1234')
>>> phonePattern.search('800-555-1212') }2]
('800', '555', '1212', '')
}1] JouInym iozuIIom iolI ioguIinImu vyiazu z mInuIolo liolu jo lo, zo jo vso iozosno
na vIco iucIcl. Piolo nonI zunym iolvaonIm, zo ziacovv vsluy slojnym zusohom.
}2] Konocny losl IunlcnoslI (sanIly clocl). Ano, lolIo oiu Iungujo. Jsmo lolovI.
.6. PiIauov sluuIo: AnaIyza
loIoIonnIcl cIsoI
141
.7. SlinulI
ZalIm jsmo vIuII oulou sIclu Iouovco z lolo, co ioguIinI vyiazy zvIunou. JInymI sIovy, acloIIv
jImI muzolo hyl momonlIn zcoIa oliomonI, zalIm jslo novIuII nIc. To mI vilo.
NsIouujIcI vcI uz hy vm nomIy hyl cIzI:
^ ouovIu zacllu iolzco.
$ vyjauiujo lonoc iolzco.
\b ouovIu lianIcI sIova (voiu hounuaiy).
\d ouovIu cIsIIcI.
\D ouovIu znalu jInomu noz cIsIIco.
x? ouovIu noovInnomu znalu x (jInymI sIovy vyjauiujo zuny noho jouon vyslyl x).
x* vyjauiujo nuIa noho vIco vyslylu x.
x+ ouovIu x jouonlil noho vIclil.
x{n,m} vyjauiujo znal x oalovany nojmon n-lil, aIo no vIco noz m-lil.
(a|b|c) ouovIu iosn jouno z moznoslI a, b noho c.
(x) vyjauiujo ohocn zuumu|ovunou :Lunu. Hounolu zaamalovano sluIny muzomo
zIslal voInIm molouy groups() ohjollu, lloiy hyI vicon voInIm re.search.
RoguIinI vyiazy jsou voImI mocno, aIo jojIcl ouzIlI nonI sivnym iosonIm io lazuy iohIom. MII
hyslo so o nIcl naucIl loIIl, ahyslo vuII, luy jo jojIcl ouzIlI vlouno, luy vm omolou iohIom
vyiosIl a luy naoal zusohI vIc iohIomu, noz vyiosI.
.7. SlinulI
142
143
6. Uzvry a genertory
6. KaIloIa
My spelling is Wobbly. Its good spelling but it
Wobbles, and the letters get in the wrong places.
(Mo jmono jo Houavy. HIslujI lo sivn, aIo Houo
so lo a Ismonla so uoslvajI na saln mIsla.)
MouvIuol P
144
6. Uzvry a genertory 143
6.1. Ponoimo so 145
6.2. J vIm jal na lo! PouzIjomo ioguIinI vyiazy! 146
6.8. Soznam IunlcI 148
6.4. Soznam vzoilu 150
6.. Souhoi vzoilu 152
6.6. Gonoiloiy 154
6.6.1. Gonoiloi IIhonaccIlo osIounoslI 155
6.6.2. Gonoiloi iavIuoI io mnozno cIsIo 156
6.7. Piocllo sI 158
Ohsal laIloIy
145
6.1 Ponoimo so
VyiuslaI jsom jalo syn lnIlovnIco, lloi vysluuovaIa angIIclInu, a vzuycly m IascInovaIy jazyly. No-
mysIIm iogiamovacI jazyly. Touy ano, I iogiamovacI jazyly, aIo lalo iIiozono jazyly. Dojmo lomu
angIIclIna. AngIIclIna jo sclIzoIionnI jazyl, lloiy sI sIova ujcujo z nmcIny, IiancouzslIny, sanIslI-
ny a IalIny (luyz uz mm i vyjmonoval). SIova ,ujcujo sI vo slulocnoslI nojsou la iav, ,vyli-
u jo iIIolavjsI. Noho sI jo mozn ,asImIIujo jalo Boig. Jo, lo so mI IIhI.
My jsme Borg. Zvltnosti vaeho jazyka a pvodu slov budou pidny do naeho
vlastnho. Odpor je marn.
V lolo laIloIo so naucIlo nco o angIIclycl ouslalnycl jmonocl v mnoznom cIsIo. A lalo o IunlcIcl,
lloio viacojI jIno Iunlco, o ioguIinIcl vyiazocl io oliocIIo a o gonoiloiocl. AIo nojuiIvo sI iolnmo
nco o lom, jal so lvoiI ouslaln jmona v mnoznom cIsIo. (Poluu jslo nocolII laIloIu o ioguIinIcl
vyiazocl, lal jo na lo vloun uoha iv lou. V lolo laIloIo so iouolIu, zo zlIauum ioguIinIcl
vyiazu uz iozumIlo, iolozo so iyclIo uoslanomo l Ilco io oliocIIo.)
Poluu jslo vyioslII v angIIcly mIuvIcI zomI noho oluu jslo so angIIclInu ucIII vo sloInIcl IavIcIcl,
al iavuouohn zlIaunI iavIuIa znlo:
- Poluu sIovo loncI na S, X noho Z, iIumo LS. Z Iu:: so slv Iu::e:, z [ux so slv [uxe:
a wu|z so mnI na vaIlzos.
- Poluu sIovo loncI lIasIlym H, iIumo LS. Poluu loncI lIclym H, iIumo jon S. Co lo jo
lIasIlo H Kuyz H zlomhInujomo s jInymI Ismony, vyu zvul, lloiy sIysImo. Talzo touth
}louc] so zmnI na coaclos a z ru:h }ios] so slano iaslos, iolozo iI vysIovnI sIysImo zvuly
io CH }c] a SH }s]. AIo z thee|uh }cIla] so slano thee|uh:, iolozo H jo zuo lIclo.
- Poluu sIovo loncI Ismonom Y, lloio znI jalo I, zmnImo Y na ILS. Poluu so Y lomhInujo
so samolIslou lal, zo znI jalo nco jInolo, al ouzo iIumo S. Vacancy so iolo zmnI
na vutunte:, aIo z duy so slano duy:.
- Poluu vsoclno soIlaIo, iIumo S a uouImo, zo lo iojuo.
(No ano, oxIslujo sousla vyjImol. Z mun so slv men a z womun zaso women, aIo humun so mnI
na humun:. Mouso ioclzI v mIco a z ou:e jo zaso te, aIo hou:e so mnI v hou:e:. Kn[e ioclzI
v Lnve: a z w[e so slvajI wve:, aIo ow[e so mnI v ow[e:. A noclljlo, ahycl zacaI o sIovocl,
lloi jsou sama svym mnoznym cIsIom (lj. omnozn), jalo jsou :hee, deer a huLu.)
V jInycl jazycIcl jo lo, samoziojm, In jIno.
Pojumo sI navilnoul yllonovslou lnIlovnu, lloi aulomalIcly iovuI angIIcl ouslaln jmona
uo mnoznolo cIsIa. Zacnomo s uvouonymI clyimI iavIuIy. AIo mysIolo na lo, zo huuomo novylnuloI-
n musol iIuval uaIsI.
6.1 Ponoimo so
Ka.
146
6.2. J vIm jal na lo! PouzIjomo ioguIinI vyiazy!
Talzo so uIvmo na sIova, coz znamon (iInojmonsIm v angIIclIn), zo so uIvmo na iolzco znalu.
Pal lauy mmo iavIuIa, lloi nm iIlajI, zo oliohujomo najIl iuzno lomhInaco znalu a ouIo nIcl
nco uuIal. Vyau lo jalo ico io ioguIinI vyiazy!
import re
def plural(noun):
if re.search('[sxz]$', noun): }1]
return re.sub('$', 'es', noun) }2]
elif re.search('[^aeioudgkprt]h$', noun):
return re.sub('$', 'es', noun)
elif re.search('[^aeiou]y$', noun):
return re.sub('y$', 'ies', noun)
else:
return noun + 's'
}1] Juo o ioguIinI vyiaz, aIo ouzIv synlaxI, so lloiou jslo so v laIloIo RoguIinI vyiazy nosolla-
II. Hianalo zvoily znamonajI ,naasuj so iosn na jouon z lcllo znalu. Talzo [sxz] zna-
mon ,s noho x noho z, aIo jonom jouon z nIcl. Znal $ hy vm mI hyl ovuomy. Vyjauiujo
slouu s loncom iolzco. Kuyz lo umo uoliomauy, al lonlo ioguIinI vyiaz loslujo, zua noun
(ouslalno jmono) loncI znalom s, x noho z.
}2] Iunlco re.sub() iovuI nliauy v iolzcI, lloio jsou zaIozony na ouzIlI ioguIinIlo vyiazu.
PouIvojmo so na nliauy iouosano ioguIinIm vyiazom ouiohnjI.
>>> import re
>>> re.search('[abc]', 'Mark') }1]
<_sre.SRE_Match object at 0x001C1FA8>
>>> re.sub('[abc]', 'o', 'Mark') }2]
'Mork'
>>> re.sub('[abc]', 'o', 'rock') }8]
'rook'
>>> re.sub('[abc]', 'o', 'caps') }4]
'oops'
}1] Ohsalujo iolzoc Mark znal a, b noho c Ano, ohsalujo a.
}2] Iajn. Tou najuI a, b noho c a naliau lo znalom o. Z Mark so slano Mork.
}8] Slojn Iunlco zmnI rock na rook.
}4] MolII hyslo sI mysIol, zo slojn Iunlco zmnI caps na oaps, aIo nonI lomu lal. Iunlco re.sub
naliazujo vsoclny slouy s ioguIinIm vyiazom, nojonom ivnI z nIcl. Talzo lonlo ioguIinI
vyiaz zmnI caps na oops, iolozo jal c, lal a so zmnI na o.
6.2. J vIm jal na lo! PouzIjomo
ioguIinI vyiazy!
Ka.
147
A lou zl l IunlcI plural() (mnozno cIsIo).
def plural(noun):
if re.search('[sxz]$', noun):
return re.sub('$', 'es', noun) }1]
elif re.search('[^aeioudgkprt]h$', noun): }2]
return re.sub('$', 'es', noun)
elif re.search('[^aeiou]y$', noun): }8]
return re.sub('y$', 'ies', noun)
else:
return noun + 's'
}1] Zuo naliazujomo lonoc iolzco (sloua s iouIsom $) iolzcom es. JInymI sIovy, iIuvmo es
na lonoc iolzco. Slojnolo oIollu hyslo molII uoslnoul lonlalonacI iolzcu (sojonIm), naiI-
lIau ouzIlIm noun + 'es'. AIo z uuvouu, lloio huuou jasnjsI ozujI, jsom so iozlouI lazuo
iavIuIo ioaIIzoval omocI ioguIinIlo vyiazu.
}2] Tou so oiun ouIvojlo na nsIouujIcI novInlu. Znal ^ uvouony v lianalycl zvoilcl
na zacllu m socIInI vyznam nogacI. ZIs [^abc] znamon ,IIhovoIny znal : vyjmLou
a, b noho c. Talzo [^aeioudgkprt] znamon IIhovoIny znal s vyjImlou a, e, i, o, u, d, g, k, p,
r noho t. Tonlo znal musI hyl nsIouovn znalom h a loncom iolzco. HIoumo sIova, lloi
loncI Ismonom H a vo lloiycl jo H sIysol.
}8] Slojn osluujomo v lomlo iIau: naasuj so na sIova, lloi loncI Ismonom Y, luo
iouclzojIcIm znalom nonI a, e, i, o noho u. HIoumo sIova, lloi loncI Ismonom Y, lloio
znI jalo I.
PouIvojmo so na ioguIinI vyiazy s nogacI ouiohnjI.
>>> import re
>>> re.search('[^aeiou]y$', 'vacancy') }1]
<_sre.SRE_Match object at 0x001C1FA8>
>>> re.search('[^aeiou]y$', 'boy') }2]
>>>
>>> re.search('[^aeiou]y$', 'day')
>>>
>>> re.search('[^aeiou]y$', 'pita') }8]
>>>
}1] vacancy lomulo ioguIinImu vyiazu vylovujo, iolozo loncI na cy a c noaliI mozI a, e, i,
o noho u.
}2] boy l ioguIinImu vyiazu noasujo, iolozo loncI oy a ioguIinIm vyiazom jsmo iImo iolII,
zo iou znalom y nomuzo hyl o. Noasujo anI day, iolozo loncI na ay.
}8] pita novylovujo lalo, iolozo noloncI na y.
6.2. J vIm jal na lo! PouzIjomo
ioguIinI vyiazy!
148
>>> re.sub('y$', 'ies', 'vacancy') }1]
'vacancies'
>>> re.sub('y$', 'ies', 'agency')
'agencies'
>>> re.sub('([^aeiou])y$', r'\1ies', 'vacancy') }2]
'vacancies'
}1] Tonlo ioguIinI vyiaz mnI vacancy na vacancies a agency na agencies, coz jsmo cllII.
VsImnlo sI, zo hy zmnII lalo boy na boies, aIo l lomu uvnIli Iunlco nIluy nouojuo, iolozo
iovouonI re.sub jo oumInno vysIoulom iouclozIlo re.search.
}2] Kuyz uz jsmo u lolo, cllI hycl uozoinIl, zo uvouono uva ioguIinI vyiazy (jouon, lloiy
iozlouujo o uIalnnI iavIuIa, a uiuly, lloiy lo ioaIIzujo) muzomo zlomhInoval uo jounolo.
VyauaIo hy lo njal lallo. S vlsInou vyiazu uz hyslo nomII mIl iohIom. PouzIvmo zaa-
malovanou sluInu, o lloio jsmo sI ovIuaII v iIauovo sluuII zahyvajIcI so anaIyzou loIoIon-
nIcl cIsoI. SluIna so ouzIv l zaamalovnI sI znalu, lloiy so naclzI iou Ismonom y.
V iolzcI s nliauou so al ouzIv novy synlallIcly ivol \1, lloiy znamon: ,Ms lu ivnI
zaamalovanou sluInu VIoz jI som. V lomlo iIau so iou y zaamalovaIo c. V olamzIlu
suhslIluco so na mIslo c vIozI c a y so naliauI ies. (Poluu iacujolo s vIco noz jounou zaama-
lovanou sluInou, muzolo ouzIl \2 a \3 a lal uIo.)
Nliauy omocI ioguIinIcl vyiazu jsou voImI mocno a synlaxo \1 jo cInI josl mocnjsImI. AIo zlom-
hInovnI coIo ooiaco uo jounolo ioguIinIlo vyiazu snIzujo cIloInosl a navIc lolo iosonI novyjauiujo
iImocaio zusoh oIsu iavIuIa io vylvionI mnoznolo cIsIa. Puvoun jsmo iavIuIo vyjuiIII
vo slyIu ,oluu sIovo loncI S, X noho Z, al iIumo ES. Kuyz so ouIvlo na zIs Iunlco, vIuIlo
uva iuly louu, lloio iIlajI ,joslIIzo sIovo loncI S, X noho Z, al iIuoj ES. PiImocaiojI uz lo snau
anI vyjuiIl nojuo.
6.8. Soznam IunlcI
Tou iIumo iovo ahslialco. ZacaII jsmo uoIInIcI soznamu iavIuoI: JoslIIzo IalI lolIo, uuIoj lamlo,
v oacnom iIau iojuI l uaIsImu iavIuIu. Docasn zlomIIlujomo jounu csl iogiamu, ahyclom
molII zjounouusIl jInou.
import re
def match_sxz(noun):
return re.search('[sxz]$', noun)
def apply_sxz(noun):
return re.sub('$', 'es', noun)
6.8. Soznam IunlcI
149
def match_h(noun):
return re.search('[^aeioudgkprt]h$', noun)
def apply_h(noun):
return re.sub('$', 'es', noun)
def match_y(noun): }1]
return re.search('[^aeiou]y$', noun)

def apply_y(noun): }2]
return re.sub('y$', 'ies', noun)
def match_default(noun):
return True
def apply_default(noun):
return noun + 's'
rules = ((match_sxz, apply_sxz), }8]
(match_h, apply_h),
(match_y, apply_y),
(match_default, apply_default)
)
def plural(noun):
for matches_rule, apply_rule in rules: }4]
if matches_rule(noun):
return apply_rule(noun)
}1] V lomlo olamzIlu m lazuo iozlouovacI (malcl) iavIuIo svou vIaslnI IunlcI, lloi viacI
vysIouol voInI Iunlco re.search().
}2] Kazuo aIIlacnI iavIuIo m lalo svou vIaslnI IunlcI, lloi voI IunlcI re.sub() ioaIIzujIcI
iIsIusny zusoh vylvoionI mnoznolo cIsIa.
}8] MIslo jouno Iunlco (plural()) s mnola iavIuIy lou mmo ualovou sliulluiu rules (iavIuIa),
lloi jo osIounoslI uvojIc IunlcI.
}4] A iolozo iavIuIa hyIa iozhIla uo ouohy ouuIono ualovo sliulluiy, muzo hyl nov Iunlco
plural() ziouulovna na i iulu louu. V cylIu for muzomo z ualovo sliulluiy rules o
uvojIcIcl vyhIial iozlouovacI a aIIlacnI iavIuIa (jouno iozlouovacI a jouno aIIlacnI). PiI
ivnIm iuclouu cylIom Ioi nahuuo matches_rule lounoly match_sxz a apply_rule lounoly
apply_sxz. PiI uiulom iuclouu (za iouolIauu, zo so lal uaIolo uoslanomo) huuo iomnno
matches_rule iIiazona match_h a iomnno apply_rule huuo iIiazona apply_h. Jo zaiuco-
no, zo Iunlco nalonoc nco vilI, iolozo osIounI iozlouovacI Iunlco (match_default) viacI
iosl True. To znamon, zo so iovouo ouovIuajIcI aIIlacnI iavIuIo (apply_default).
6.8. Soznam IunlcI
150
Iunlcnosl lolo loclnIly jo zaiucona lIm, zo v Pyllonu jo ohjol-
lom vsoclno, vcoln IunlcI. Dalov sliulluia rules ohsalujo
Iunlco nIloIIv jmona IunlcI, aIo slulocno ohjolly IunlcI.
Kuyz v cylIu for uojuo l jojIcl iIiazonI, slanou so z io-
mnnycl matches_rule a apply_rule slulocno Iunlco, lloio
muzomo voIal. PiI ivnIm iuclouu cylIu for jo lo slojno, jalo luyhy so voIaIa Iunlco matches_sxz(noun).
A oluu hy vilIIa ohjoll ouovIuajIcI slou, zavoIaIa hy so Iunlco apply_sxz(noun).
Poluu so vm iIuan iovo ahslialco jovI jalo maloucI, zluslo sI cylIus uvnIli Iunlco iozosal
a slouu iozoznlo snaunjI. CoIy cylIus Ioi jo olvIvaIonlnI nsIouujIcImu zIsu:
def plural(noun):
if match_sxz(noun):
return apply_sxz(noun)
if match_h(noun):
return apply_h(noun)
if match_y(noun):
return apply_y(noun)
if match_default(noun):
return apply_default(noun)
Vylouou jo, zo Iunlco plural() so zjounouusIIa. PiohIi sauu iavIuoI, lloi molIa hyl uoIInovna luo-
loIIv, a ioclzI jImI zohocnnym zusohom.
1. ZIsloj iozlouovacI iavIuIo (match rule).
2. DosIo lo slou Tal voIoj aIIlacnI iavIuIo a vial vysIouol.
8. NouosIo lo slou PiojuI lo liolu 1.
PiavIuIa molou hyl uoIInovna luoloIIv, jalymloIIv zusohom. IunlcI plural() jo lo jouno.
Dohi, aIo hyIo vuhoc iIunI iovn ahslialco l ncomu uohio No, zalIm no. Zvazmo, co lo znamon, luyz
l IunlcI clcomo iIual novo iavIuIo. V ivnIm iIlIauu hy lo znamonaIo iIual uo Iunlco plural() iIlaz
if. V lomlo uiulom iIlIauu hy lo vyzauovaIo iIunI uaIsIcl uvou IunlcI match_foo() a apply_foo(). Pal
hyclom musoII uicIl, uo lloiolo mIsla osIounoslI rules m hyl uvojIco s iozlouovacI a aIIlacnI IunlcI
zaiazona (oIola vucI oslalnIm iavIuIum).
AIo lo jsmo jIz jon liucol ou nsIouujIcI oulaIloIy. Pojumo na lo...
6.4. Soznam vzoilu
Ono vo slulocnoslI nonI nozhylno, ahyclom io lazuo iozlouovacI a aIIlacnI iavIuIo uoIInovaII samo-
slalno ojmonovano Iunlco. NIluy jo novoImo iImo. PiIuvmo jo uo osIounoslI rules a voImo jo
6.4. Soznam vzoilu
Promnn rules je posloup-
nost dvojic funkc.
151
ios lulo sliulluiu. Kazu z lcllo IunlcI navIc ouovIu jounomu zo uvou vzoiu. Vsoclny iozlouo-
vacI Iunlco voIajI re.search() a vsoclny aIIlacnI Iunlco voIajI re.sub(). RozIozmo lylo vzoiy lal,
ahyclom sI usnaunIII huuovnI novycl iavIuoI.
import re
def build_match_and_apply_functions(pattern, search, replace):
def matches_rule(word): }1]
return re.search(pattern, word)
def apply_rule(word): }2]
return re.sub(search, replace, word)
return (matches_rule, apply_rule) }8]
}1] build_match_and_apply_functions() jo Iunlco, lloi vylviI uaIsI Iunlco uynamIcly. PiohIi ai-
gumonly pattern, search a replace. Pal uoIInujo iozlouovacI IunlcI matches_rule(), lloi voI
re.search() s vzoilom pattern, lloiy hyI ioun IunlcI build_match_and_apply_functions(),
a so sIovom word, lloio so iouv iv huuovano IunlcI matches_rule(). Ty jo!
}2] AIIlacnI Iunlco so vylviI slojnym zusohom. AIIlacnI Iunlco iohIi jouon aiamoli a voI
re.sub() s aigumonly search a replace, lloio hyIy iouny IunlcI build_match_and_apply_
functions(), a s aiamoliom word, lloiy so iouv iv huuovano IunlcI apply_rule().
Tolo loclnIco, luy so uvnIli uynamIcly huuovano Iunlco ouzIjI vnjsI lounoly, so iIl uz0v6r
(cIosuio). IvnIli huuovano aIIlacnI Iunlco v ouslal uoIInujomo lonslanly. Iunlco iohIi
jouon aiamoli (word), olom so clov ouIo nj, aIo lalo ouIo uaIsIcl uvou lounol (search
a replace), lloio IalIIy v uoh uoIInIco aIIlacnI Iunlco.
}8] Nalonoc Iunlco build_match_and_apply_functions() vilIIa uvojIcI lounol uv Iunlco,
lloio jsmo iv vylvoiIII. Konslanly, lloio jsmo uvnIli lcllo IunlcI uoIInovaII (pattern uvnIli
Iunlco matches_rule() a search a replace uvnIli Iunlco apply_rule()), v nIcl zuslvajI uza-
viono uolonco I o nvialu z Iunlco build_match_and_apply_functions(). To jo iosl sIca!
Poluu so vm lo zu nouviIloIn maloucI (a lo hy mIo, iolozo lo jo Iall ujolo), muzo so lo vyjasnIl,
luyz uvIuIlo, jal so lo ouzIv.
patterns = \ }1]
(
('[sxz]$', '$', 'es'),
('[^aeioudgkprt]h$', '$', 'es'),
('(qu|[^aeiou])y$', 'y$', 'ies'),
('$', '$', 's') }2]
)
rules = [build_match_and_apply_functions(pattern, search, replace) }8]
for (pattern, search, replace) in patterns]
6.4. Soznam vzoilu
152
}1] Naso iavIuIa (iuIos) io lvoihu mnoznolo cIsIa jsou nynI uoIInovna jalo n-lIco liojIc Ie|6zt
(no IunlcI). PivnIm iolzcom v lazuo sluIn jo ioguIinI vyiaz, lloiy so huuo ouzIval
v re.search() io iozlouovnI, zua so lolo iavIuIo uIalujo. Diuly a liolI iolzoc vo sluIn
jsou vyiazy io vylIounI a nliauu, lloio so ouzIjI v re.sub() io aIIlacI iavIuIa, lloio
sIovoso iovouo uo mnoznolo cIsIa.
}2] I zIoznIlo iavIuIa uosIo l uiohno zmn. Poluu v iouclozIm iIlIauu nohyIo naIozono
zuno zo socIIIcljsIcl iavIuoI, viacoIa Iunlco match_default() lounolu True, coz znamo-
naIo, zo so na lonoc sIova jounouuso iIu s. Tonlo uosalujo slojno IunlcnoslI lioclu jInal.
PosIounI ioguIinI vyiaz zjIslujo, joslII sIovo loncI ($ ouovIu loncI iolzco). A samoziojm,
lazuy iolzoc loncI (uolonco I izuny iolzoc), lalzo sloua s lImlo vyiazom jo naIozona vzuy.
Tonlo iIslu louy InI slojny coI jalo Iunlco match_default(), lloi vzuycly viacoIa True.
Poluu noasujo zuno socIIIcljsI iavIuIo, zajIslI iIunI s na lonoc uanolo sIova.
}8] Tonlo iuol jo magIcly. PiohIi iolzco z osIounoslI alloins a mnI jo na osIounosl IunlcI.
Jal lo uI ,ZohiazonIm iolzcu iosliounIclvIm Iunlco build_match_and_apply_functions().
To znamon, zo so vozmo lazu liojIco iolzcu a ly so iouajI jalo aigumonly IunlcI build_match_
and_apply_functions(). Iunlco build_match_and_apply_functions() vilI uvojIcI IunlcI. To
znamon, zo sliulluia rules zIsl Iunlcn slounou ouohu jalo v iouclozIm iIlIauu so-
znam uvojIc, luo lazu ohsalujo uv Iunlco. PivnI Iunlco jo iozlouovacI (malcl; asoval) a voI
re.search(), uiul Iunlco jo aIIlacnI a voI re.sub().
SliIl zaloncImo lIavnIm vslunIm houom, IunlcI plural().
def plural(noun):
for matches_rule, apply_rule in rules: }1]
if matches_rule(noun):
return apply_rule(noun)
}1] A iolozo jo soznam rules slojny jalo v iouclozIm iIlIauu (a lo oiavuu jo), nomIo hy hyl
zunym iolvaonIm, zo so Iunlco plural() vuhoc nozmnIIa. Jo zcoIa ohocn. PiohIi soznam
IunlcI ioaIIzujIcIcl iavIuIa a voI jo v uvouonom oiauI. Noslai so o lo, jal jsou iavIuIa
uoIInovna. V iouclzojIcIm iIlIauu hyIa uoIInovna jalo ojmonovano Iunlco. Tou jsou
Iunlco iavIuoI huuovny uynamIcly zohiazonIm iolzcu zo vslunIlo soznamu voInIm Iunl-
co build_match_and_apply_functions(). Na lom aIo vuhoc nozIozI. Iunlco plural() iacujo
slIo slojnym zusohom.
6.. Souhoi vzoilu
Jsmo v sIluacI, luy uz jsmo iozoznaII vosloio uuIIcIly v louu a iosII jsmo na uoslalocnou iovo
ahslialco. To nm umoznIIo uoIInoval iavIuIa io vylvionI mnoznolo cIsIa v ouoh soznamu
iolzcu. DaIsI IogIcly liol socIv v uIozonI lcllo iolzcu v ouuIonom souhoiu. PiavIuIa (v ouoh
iolzcu) al molou hyl uuizovna ouuIon ou louu, lloiy jo ouzIv.
6.. Souhoi vzoilu
153
NojuiIvo vylvoimo loxlovy souhoi, lloiy ohsalujo ozauovan iavIuIa. Nohuuomo ouzIval zuno
oIollnI ualovo sliulluiy. SlacI nm liI sIouco iolzcu ouuIono hIIymI znaly (vlIlosaco; zuo mozoiy
noho lahuIloiy). Souhoi nazvomo plural4-rules.txt.
[sxz]$ $ es
[^aeioudgkprt]h$ $ es
[^aeiou]y$ y$ ies
$ $ s
Tou so ouIvojmo na lo, jal muzomo souhoi s iavIuIy ouzIl.
import re
def build_match_and_apply_functions(pattern, search, replace): }1]
def matches_rule(word):
return re.search(pattern, word)
def apply_rule(word):
return re.sub(search, replace, word)
return (matches_rule, apply_rule)
rules = []
with open('plural4-rules.txt', encoding='utf-8') as pattern_file: }2]
for line in pattern_file: }8]
pattern, search, replace = line.split(None, 3) }4]
rules.append(build_match_and_apply_functions( }]
pattern, search, replace))
}1] Iunlco build_match_and_apply_functions() so nozmnIIa. Pio uynamIclo vylvoionI IunlcI,
lloio ouzIvajI iomnno uoIInovano vnjsI IunlcI, oiu ouzIvmo uzviy.
}2] GIohInI Iunlco open() olvIi souhoi a viacI souhoiovy ohjoll. V lomlo iIau olvIimo
souhoi, lloiy ohsalujo vzoily iolzcu io iovunI ouslalnycl jmon uo mnoznolo cIsIa.
PiIlaz with vylviI lalzvany Lon|ex|. JalmIIo hIol iIlazu with sloncI, Pyllon souhoi auloma-
lIcly uzavio, a lo I v iIau, luyhy hyIa uvnIli hIolu vIll vyvoIna vyjImla. O hIocIcl with
a o souhoiovycl ohjollocl so uozvIlo vIco v laIloIo Souhoiy.
}8] Ohial for line in <souborov_objekt> clo uala z olovionolo souhoiovolo ohjollu iuol
o iulu a iIiazujo loxl uo iomnno line (iuol). O clonI zo souhoiu so uozvIlo vIco
v laIloIo Souhoiy.
}4] Kazuy iuol souhoiu ohsalujo liI lounoly, aIo jsou ouuIono hIIymI znaly (lahuIloiy noho
mozoiamI, na lom nozIozI). RozuIImo jo ouzIlIm iolzcovo molouy split(). PivnIm aigu-
monlom molouy split() jo None, coz vyjauiujo ozauavol ,iozuIIl v mIslocl osIounoslI
hIIycl znalu (lahuIloiu noho mozoi, na lom nozIozI). Diulym aigumonlom jo lounola 3, coz
znamon ,iozuIIl na mIsl hIIycl znalu maxImIn 8lil a zhylol iulu onoclal hozo zm-
ny. NaiIlIau iuol [sxz]$ $ es huuo iozIozon na soznam ['[sxz]$', '$', 'es']. To znamon,
6.. Souhoi vzoilu
Ka.
Ka.
154
zo iomnn pattern zIsl lounolu '[sxz]$', iomnn soaicl lounolu '$' a iomnn
replace lounolu 'es'. V lal lillom iulu louu so sliyv uocoIa loun sIIy.
}] Nalonoc ioumo pattern, search a replace IunlcI build_match_and_apply_functions(),
lloi vilI uvojIcI IunlcI. Tulo uvojIcI iIojImo na lonoc soznamu iavIuoI, lalzo nalonoc huuo
rules uclovval soznam iozlouovacIcl a aIIlacnIcl IunlcI, lloio oliohujo Iunlco plural().
ZuolonaIonI socIv v lom, zo jsmo iavIuIa io vylvionI mnoznolo cIsIa ouslalnycl jmon ouuIIII
uo vnjsIlo souhoiu, lloiy muzo hyl uuizovn ouuIon ou louu, lloiy iavIuIa vyuzIv. Kou so slaI
louom, z ual jsou uala a zIvol jo lisnjsI.
6.6. Gonoiloiy
NohyIo hy slvIo, luyhyclom mII ohocnou IunlcI plural(), lloi sI umI sama ziacoval souhoi
s iavIuIy ZIslaIa hy iavIuIa, zlonlioIovaIa hy, lloio so m uIalnIl, iovouIa hy iIsIusno liansIoi-
maco, iosIa hy l uaIsImu iavIuIu. To jo lo, co hyclom o IunlcI plural() cllII. A lo jo lo, co hy
Iunlco plural() mIa uIal.
def rules(rules_filename):
with open(rules_filename, encoding='utf-8') as pattern_file:
for line in pattern_file:
pattern, search, replace = line.split(None, 3)
yield build_match_and_apply_functions(pattern, search, replace)
def plural(noun, rules_filename='plural5-rules.txt'):
for matches_rule, apply_rule in rules(rules_filename):
if matches_rule(noun):
return apply_rule(noun)
raise ValueError('no matching rule for {0}'.format(noun))
Jal salia Iungujo |ohe? PouIvojmo so nojuiIvo na InloiallIvnI iIlIau.
>>> def make_counter(x):
... print('entering make_counter')
... while True:
... yield x }1]
... print('incrementing x')
... x = x + 1
...
>>> counter = make_counter(2) }2]
>>> counter }8]
<generator object at 0x001C9C10>
>>> next(counter) }4]
6.6. Gonoiloiy
155
entering make_counter
2
>>> next(counter) }]
incrementing x
3
>>> next(counter) }6]
incrementing x
4
}1] PiIlomnosl lIIcovolo sIova yield v make_counter znamon, zo nojuo o ohycojnou IunlcI. Juo
o socIInI uiul Iunlco, lloi gonoiujo lounoly jounu o uiulo. Muzomo sI jI iouslavIl jalo
IunlcI, lloi umI iI uaIsIm voInI oliacoval v cInnoslI. Kuyz jI zavoImo, vilI nm gonoi-
loi, lloiy muzomo ouzIl io gonoiovnI osIounoslI lounol x.
}2] InslancI gonoiloiu make_counter vylvoiImo lIm, zo jI zavoImo jalo lazuou jInou IunlcI.
Poznamonojmo, zo lIm vo slulocnoslI nouojuo l iovouonI louu Iunlco. Juo lo oznal I ouIo
lolo, zo so na ivnIm iulu Iunlco make_counter() voI print(), aIo nIc so zalIm novylIslIo.
}8] Iunlco make_counter() vilIIa ohjoll gonoiloiu.
}4] Iunlco next() iohIi ohjoll gonoiloiu a viacI jolo uaIsI lounolu. PiI ivnIm voInI Iunlco
next() io gonoiloi counter so iovouo lou z make_counter() az uo ivnIlo iIlazu yield
a vilI so vyiouulovan lounola. V nasom iIau lo huuo 2, iolozo jsmo gonoiloi vylvoiIII
voInIm make_counter(2).
}] PiI oalovanom voInI Iunlco next() io slojny gonoiloiovy ohjoll so uoslvmo iosn uo
mIsla, luo jsmo mInuIo sloncIII, a oliacujomo az uo mIsla, luy znovu naiazImo na iIlaz yi-
eld. PiI iovouonI yield jsou vsoclny iomnno, IolInI slav a uaIsI vcI uIozony a iI uaIsIm
voInI next() jsou ohnovony. DaIsI iuol louu, lloiy col na iovouonI, voI IunlcI print(),
lloi vylIslno incrementing x (zvysujI lounolu x). Polo jo iovouon iIlaz x = x + 1. Pal
so iovouo uaIsI ohilla cylIu while a lnou so naiazI na iIlaz yield x. Ton uIozI slav vsolo
moznolo a vilI alluInI lounolu iomnno x (v lomlo olamzIlu 3).
}6] PiI uiulom voInI next(counter) so vso oalujo, aIo lonlolil m x lounolu 4.
Piolozo make_counter uoIInujo nolonocny cylIus, molII hyclom oliacoval looiolIcly uo nolonocna
a uoclzoIo hy l nouslIomu zvysovnI iomnno x a viaconI jojI lounoly. MIslo lolo so aIo ouIvoj-
mo na uzIlocnjsI ouzIlI gonoiloiu.
6.6.1. Gonoiloi IIhonaccIlo osIounoslI
def fib(max):
a, b = 0, 1 }1]
while a < max:
yield a }2]
a, b = b, a + b }8]
6.6. Gonoiloiy
156
}1] IIhonaccIlo osIounosl jo iaua cIsoI, luo lazuo uaIsI cIsIo jo souclom uvou iouclozIcl.
ZacIn lounolamI 0 a 1, zocllu ioslo omaIu a al iyclIojI a iyclIojI. Na zacllu oliohujo-
mo uv iomnno: a s oclocnI lounolou 0 a b s oclocnI lounolou 1.
}2] Piomnn a ohsalujo alluInI cIsIo osIounoslI, lalzo lounolu vyiouulujomo (yIoIu).
}8] Piomnn b iouslavujo uaIsI cIsIo v osIounoslI, lalzo jo iIiauImo uo a, aIo soucasn
vyoclomo uaIsI lounolu (a + b) a iIiauImo jI uo b io ozujsI ouzIlI. Poznamonojmo,
zo so lo ujo aiaIoIn. Poluu m a lounolu 3 a b lounolu 5, al a, b = b, a + b naslavI
a na 5 (iouclozI lounola b) a b na 8 (soucol iouclozI lounoly a a b).
DoslaII jsmo IunlcI, lloi oslun cliII IIhonaccIlo cIs-
Ia. MolII hyslo lo osal I ioluizIvnIm iosonIm, aIo lonlo
zusoh jo cIloInjsI. A navIc uohio Iungujo iI ouzIlI
v cylIocl for.
>>> from fibonacci import fib
>>> for n in fib(1000): }1]
... print(n, end=' ') }2]
0 1 1 2 3 5 8 13 21 34 55 89 144 233 377 610 987
>>> list(fib(1000)) }8]
[0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, 377, 610, 987]
}1] Gonoiloi jalo fib() muzolo v cylIu for ouzIl iImo. CylIus Ioi aulomalIcly zIslv lounoly
gonoiloiu fib() voInIm Iunlco next() a iIiazujo jo uo iomnno cylIu n.
}2] PiI lazuo ohilco cylIu for zIslv iomnn n novou lounolu, lloi jo uvnIli fib() iouu-
lovna iIlazom yield. SlacI jI jon vylIslnoul. JalmIIo fib() uojuou cIsIa (a nahuuo lounoly
vlsI noz max, coz jo v nasom iIau 1000), cylIus for oIoganln sloncI.
}8] Tolo jo uzIlocny ohial. IunlcI list() ioumo gonoiloi. Iunlco iojuo (Iloiujo ios) vsoclny
jolo lounoly (slojn jalo lomu hyIo v iouclozIm iIlIauu u cylIu for) a vilI soznam vsocl
gonoiovanycl lounol.
6.6.2. Gonoiloi iavIuoI io mnozno cIsIo
Vialmo so l plural5.py a ouIvojmo so, jal lalo voizo Iunlco plural() iacujo.
def rules(rules_filename):
with open(rules_filename, encoding='utf-8') as pattern_file:
for line in pattern_file:
pattern, search, replace = line.split(None, 3) }1]
yield build_match_and_apply_functions(pattern, search, replace) }2]
6.6. Gonoiloiy
yield funkci zastav.
next() pokrauje
od msta zastaven.
157
def plural(noun, rules_filename='plural5-rules.txt'):
for matches_rule, apply_rule in rules(rules_filename): }8]
if matches_rule(noun):
return apply_rule(noun)
raise ValueError('no matching rule for {0}'.format(noun))
}1] NonI v lom zun magIo. Vzomolo sI, zo iuly souhoiu s iavIuIy ohsalujI vzuy liI lounoly
ouuIono hIIymI znaly. Talzo ouzIjomo line.split(None, 3) l zIslnI liI ,sIoucu a jojIcl
lounoly iIiauImo uo liI IolInIcl iomnnycl.
}2] A uL vyroduLujeme vy:edeL /yed). Jaly vysIouol DvojIcI IunlcI, lloio hyIy uynamIcly
vylvoiony nasI slaiou znmou IunlcI build_match_and_apply_functions() (jo slojn jalo
v iouclozIcl iIlIauocl). Rocono jInal, rules() jo gonoiloi, lloiy na ozunI iouulujo
iozlouovacI a aIIlacnI Iunlco.
}8] Piolozo rules() jo gonoiloi, muzomo joj iImo ouzIl v cylIu for. PiI ivnI ohilco cylIu for
zavoImo IunlcI rules(), lloi olovio souhoi so vzoily, naclo ivnI iuol, na zlIau vzoilu
uvouonycl na iulu uynamIcly vyhuuujo iozlouovacI IunlcI a aIIlacnI IunlcI a lylo Iunlco
vilI (yIoIu). AIo hlom uiulo ohilly cylIu for so uoslvmo iosn uo mIsla, luo jsmo lou
rules() ouslIII (coz jo uiosliou cylIu for line in pattern_file). PivnI vcI, lloi so io-
vouo, huuo naclonI iulu souhoiu (lloiy jo oiu olovion). Na zlIau vzoilu z lololo iulu
souhoiu so uynamIcly vylvoiI uaIsI iozlouovacI a aIIlacnI Iunlco a lalo uvojIco so
vilI (yIoIu).
Co jsmo vIasln iolI voizI 4 zIslaII navIc SlailovacI cas. Vo voizI 4 so iI Imoilu mouuIu plural4
noz jsmo molII vuhoc uvazoval o voInI Iunlco plural() nacIlaI coIy souhoi vzoilu a huuovaI so
soznam vsocl moznycl iavIuoI. PiI ouzIlI gonoiloiu muzomo vso uIal na osIounI clvIII. Pio-
clomo sI ivnI iavIuIo, vylvoiImo Iunlco a vyzlousImo jo. Poluu lo Iungujo, nomusImo cIsl zhylol
souhoiu noho vylviol uaIsI Iunlco.
A co jsmo zlialIII Vylonnosl! Gonoiloi rules() slailujo znovu ou zacllu olazuo, luyz voImo
IunlcI plural(). To znamon, zo souhoi so vzoily musI hyl znovu olovion a musImo cIsl ou zacllu,
jouon iuol o uiulom.
CllIo hy lo njal zIslal lo nojIosI z ohou iosonI: mInImInI cas iI slailu (zuno iovunI louu iI
Imoil) a maxImInI vylonnosl (zuno oalovano vylvionI IunlcI). AIo oluu nohuuomo musol cIsl
slojno iuly uvalil, hyIo hy uohio, ahy iavIuIa molIa zuslal v ouuIonom souhoiu (iolozo lou jo
lou a uala jsou uala).
Ahyclom lolo uoslII, huuomo musol vylvoiIl svuj vIaslnI Iloiloi. AIo ioulIm so musImo naucIl
nco o yllonovslycl liIucl.
6.6. Gonoiloiy
158
6.7. Piocllo sI
- PEP Z: Simplo Gonorutnrs
(vvv.yllon.oigluovloslo-u2l)
- Undorstunding Pythnn's "with stutomont
(lll:lloIIhol.oiglzonolyllon-vIll-slalomonl.llm)
- Clnsuros in Pythnn
(lll:llynnIv.comlhIogl2uu7lu8lcIosuios-In-yllon.llmI)
- Fibnnucci numbors
(lll:llon.vIlIouIa.oiglvIlIlIIhonaccI_numhoi)
- Fnglish Irrogulur Plurul Nnuns
(vvv2.gsu.ouul~vvvosIlogvlcium.llm)
6.7. Piocllo sI
159
7. Tdy a itertory
7. KaIloIa
East is East, and West is West,
and never the twain shall meet.
(Vyclou jo vyclou, zau jo zau
a la uvojIco so nIluy nosoll.)
Ruuyaiu KIIIng
160
Ohsal laIloIy
7. Tdy a itertory 159
7.1. Ponoimo so 161
7.2. DoIInIco liIu 161
7.2.1. Moloua __init__() 162
7.8. VylvionI InslancI liIu 163
7.4. CIonslo iomnno 163
7.. IIhonaccIlo Iloiloi 164
7.6. Iloiloi io iavIuIa mnoznolo cIsIa 166
7.7. Piocllo sI 172
161
7.1 Ponoimo so
Iloiloiy jsou ,lajnou omclou Pyllonu 8. Jsou vsuuo, vso jo na nIcl zaIozono, vzuy zuslvajI v ozauI,
novIuIloIno. Gonoiloiovo nolaco jsou jounouuclou Ioimou |er0|or. Gonoiloiy jsou jounouuclou
Ioimou |er0|or. Iunlco, lloi iouulujo lounoly iIlazom yield, jo ulzlou lnolo a lomallnIlo
zusohu vylvoionI Iloiloiu, anIz hyclom musoII Iloiloi lvoiIl. Ilzu vm, co lIm mInIm.
VzomInlo sI na IIhonaccIlo gonoiloi Tauy lo mmo v ouoh Iloiloiu vylvoionolo ou zlIauu:
class Fib:
'''iterator that yields numbers in the Fibonacci sequence'''
def __init__(self, max):
self.max = max
def __iter__(self):
self.a = 0
self.b = 1
return self
def __next__(self):
fib = self.a
if fib > self.max:
raise StopIteration
self.a, self.b = self.b, self.a + self.b
return fib
Piohoimo sI jolo lou iuol o iulu.
class Fib:
class? Cosly so lomu iIl |Idu. AIo co lo jo
7.2. DoIInIco liIu
Pyllon jo In ohjollov oiIonlovany. Muzolo uoIInoval svo vIaslnI liIuy, uuIl zo svycl vIaslnIcl
noho zo zahuuovanycl liIu a z uoIInovanycl liIu muzolo vylviol Inslanco.
TiIuu uoIInujomo v Pyllonu jounouuso. NoouzIv so zuo ouuIon uoIInIco iozlianI jo lo jalo u Iunl-
cI. Piosl uoIInujomo liIuu a zacnomo sl jojI lou. Pyllonovsl liIua zacIn vyliazonym sIovom class,
za lloiym nsIouujo jmono liIuy. Z loclnIclolo olIouu jo lo vso, co so vyzauujo, iolozo liIua nomusI
uuIl z zuno jIno liIuy.
7.1 Ponoimo so
7.2. DoIInIco liIu
Ka.
162
class PapayaWhip: }1]
pass }2]
}1] Jmono lolo liIuy jo PapayaWhip. NonI ouvozona ou zuno jIno liIuy. Jmona liIu so ohvylIo zaIsujI
s voIlymI Ismony u sIov nzvu, KazdeSlovoNazvuTakto. AIo jo lo jon lonvonco, nonI lo zvazno.
}2] AsI uz jslo oulauII, zo vso uvnIli liIuy jo ousazono ouohn jalo lou uvnIli Iunlco, v iIla-
zu if, u cylIu for noho v iIau jalololoIIv jInolo hIolu louu. Ruol, lloiy nonI ousazon,
uz uo liIuy noaliI.
TiIua PapayaWhip nouoIInujo zunou molouu anI aliIhuly, aIo zo synlallIclycl uuvouu v uoIInIcI nco
hyl musI. Piolo jsmo zuo ouzIII iIlaz pass. V Pyllonu jo lolo sIovo vyliazono a znamon ,oliacuj
uI, lauy nonI nIc l vIunI. Jo lo iIlaz, lloiy nIc nouI. HouI so nm iv v iIauocl, luy olio-
hujomo nasal IunlcI noho liIuu, lloi oxIslujo, aIo nIc nouI.
> PiIlaz pass znamon v Pyllonu loloz co izuno sIozono zvoily ({}) v jazycIcl Java noho C.
Mnolo liIuy uuI z jInycl liIu, aIo lo nonI ns iIau. Mnolo liIuy uoIInujI molouy, aIo lalo no. Pyllo-
novsl liIua nomusI mIl nIc, jon jmono. OhzvIsl iogiamloium v C++ muzo iIjIl uIvno, zo yllo-
novslo liIuy nomajI oxIIcIlnI lonsliulloiy a uosliulloiy. AcloIIv so lo novyzauujo, yllonovslo liIuy
mohou mIl nco, co so lonsliulloiu ouoh. Jo lo moloua __init__().
7.2.1. Moloua __init__()
NsIouujIcI iIlIau ulazujo InIcIaIIzacI liIuy Fib s vyuzIlIm molouy __init__.
class Fib:
'''iterator that yields numbers in the Fibonacci sequence''' }1]
def __init__(self, max): }2]
}1] TiIuy molou (a mIy hy) mIl svo uolumonlacnI iolzco slojn jalo mouuIy a Iunlco.
}2] Moloua __init__() jo zavoIna hozioslioun o vylvoionI Inslanco liIuy. SvuI ns lo, ahy-
clom jI nazyvaII ,lonsliulloiom liIuy, aIo z loclnIclolo lIouIsla lo nonI iavua. SvuI ns
lo, iolozo vyau jalo C++ lonsliulloi (lonvonco iIl, zo hy moloua __init__() mIa hyl
v uoIInIcI liIuy uvouona jalo ivnI), clov so jalo lonsliulloi (jo lo ivnI lousol louu, lloiy
so v nov vylvoiono InslancI liIuy iovuI) a vuhoc. Clyha! V uoh voInI molouy __init__()
uz hyI ohjoll zlonsliuovn (uz oxIslovaI) a na novou InslancI liIuy uz mmo Ialny oulaz.
PivnIm aigumonlom molouy liIuy jo vzuy oulaz na alluInI InslancI liIuy a IalI lo I io molouu
__init__(). PouIo lonvonco jo lonlo aigumonl ojmonovn self. PInI ioII vyliazonolo sIova, jalym
jo llIs v jazycIcl c++ noho Java, aIo v Pyllonu nonI self vyliazonym sIovom. Jo lo jon lonvoncnI
ojmonovnI. Pioslo joj, iosIm vs, nonazyvojlo nIluy jInal noz self. Juo o voImI sIInou lonvoncI.
7.2. DoIInIco liIu
163
IvnIli molouy __init__() oulazujo soII na nov vylvoiony ohjoll. I oslalnIcl molou liIuy oulazujo
na InslancI liIuy, jojIz moloua hyIa zavoIna. V olamzIlu uoIInIco molouy musImo uvosl self oxIIcIl-
n. AIo v olamzIlu voInI molouy uz lonlo aigumonl neuv0dme. Pyllon lo iIu za ns aulomalIcly.
7.8. VylvionI InslancI liIu
VylvionI InslancI liIu jo v Pyllonu iImocaio. Jounouuso zavoImo liIuu, jalo luyhy lo hyIa Iunlco,
a ioumo jI aigumonly, lloio vyzauujo moloua __init__(). VilI so nm nov vylvoiony ohjoll.
>>> import fibonacci2
>>> fib = fibonacci2.Fib(100) }1]
>>> fib }2]
<fibonacci2.Fib object at 0x00DB8810>
>>> fib.__class__ }8]
<class 'fibonacci2.Fib'>
>>> fib.__doc__ }4]
'iterator that yields numbers in the Fibonacci sequence'
}1] VylviImo InslancI liIuy Fib (uoIInovano v mouuIu fibonacci2) a nov vylvoionou InslancI
iIiazujomo uo iomnno fib. Piouvmo jouon aiamoli (100), lloiy so iI voInI molouy
__init__() liIuy Fib slano jojIm aigumonlom max.
}2] fib jo nynI InslancI liIuy Fib.
}8] Kazu Inslanco liIuy m zahuuovany aliIhul __class__, lloiy oulazujo na liIuu ohjollu. Piogia-
mloiI v Jav mozn znajI liIuu Class. Ta oslylujo molouy jalo getName() a getSuperclass(),
lloio nm ziIsluujI molaInIoimaco o ohjollu. V Pyllonu jo lonlo uiul molaual iIsluny
iosliounIclvIm aliIhulu, aIo zlIaunI mysIonla jo slojn.
}4] DolumonlacnI iolzoc Inslanco muzomo ziIslunIl slojn jalo u Iunlco noho u mouuIu.
Vsoclny Inslanco liIuy suIIojI slojny docstring.
> Novou InslancI liIuy v Pyllonu vylvoiImo jounouuso zavoInIm liIuy, jalo luyhy lo hyIa Iunl-
co. Nonajuomo zuo zuny oxIIcIlnI ooiloi new, jalo jo lomu u jazylu c++ noho Java.
7.4. CIonslo iomnno
Poliacujomo l uaIsImu iulu:
class Fib:
def __init__(self, max):
self.max = max }1]
7.8. VylvionI InslancI liIu
7.4. CIonslo iomnno
164
}1] Co lo jo self.max Juo o cIonslou iomnnou (noho lalo InslancnI iomnnou noho iomn-
nou Inslanco). Jo lo nco zcoIa jInolo noz aigumonl max, lloiy hyI ioun molou __init__().
self.max jo ,gIohInI v imcI Inslanco. To znamon, zo l lolo iomnno muzomo iIsluoval
z jInycl molou.
class Fib:
def __init__(self, max):
self.max = max }1]
.
.
.
def __next__(self):
fib = self.a
if fib > self.max: }2]
}1] self.max jo uoIInovna molouou __init__().
}2] .a oulazujomo so na nI v molou __next__().
CIonslo iomnno jsou io lazuou InslancI liIuy socIIIclo. Poluu naiIlIau vylvoiImo uv Inslanco
liIuy Fib s iuznymI lounolamI maxIma, huuo sI lazu z nIcl amaloval svou vIaslnI lounolu.
>>> import fibonacci2
>>> fib1 = fibonacci2.Fib(100)
>>> fib2 = fibonacci2.Fib(200)
>>> fib1.max
100
>>> fib2.max
200
7.. IIhonaccIlo Iloiloi
A2 |ed jsmo iIiavonI so
naucIl, jal so vylviI In-
loiloi. Iloiloi jo jouno-
uuso liIua, lloi uoIInujo
molouu __iter__().
7.. IIhonaccIlo Iloiloi
Vechny ti z uvedench metod tdy, __init__, __iter__
a __next__, zanaj a kon dvojic znak podtren (_).
Pro zrovna takhle? Nen v tom nic magickho, ale obvykle
to naznauje, e jde o speciln metody. Jedinou speciln
vc je na tchto specilnch metodch to, e se nevolaj pmo.
Python je vol, kdy pouijete njak jin syntaktick obrat
pro tdu nebo pro instanci tdy. Vce o specilnch metodch
v kapitole Jmna specilnch metod. Ka.
165
class Fib: }1]
def __init__(self, max): }2]
self.max = max
def __iter__(self): }8]
self.a = 0
self.b = 1
return self
def __next__(self): }4]
fib = self.a
if fib > self.max:
raise StopIteration }]
self.a, self.b = self.b, self.a + self.b
return fib }6]
}1] Ahyclom vyhuuovaII Iloiloi ou zlIauu, musImo z Fib uuIal liIuu, a no IunlcI.
}2] ,VoInI Fib(max) vo slulocnoslI znamon vylvoionI Inslanco lolo liIuy a zavoInI jojI molo-
uy __init__() s aigumonlom max. Moloua __init__() uIozI maxImInI lounolu uo cIonslo
iomnno, lalzo so na nI molou ozujI oulazoval oslalnI molouy.
}8] Moloua __iter__() so voI, luyloIIv nluo zavoI iter(fib). (Jal uvIuImo za mInullu,
cylIus for jI voI aulomalIcly. AIo vy samI jI muzolo voIal lalo, iucn.) Po iovouonI InIcIa-
IIzaco na zacllu Iloiaco (v lomlo iIau juo o naslavonI oclocnIlo slavu uvou ocIlauoI
self.a a self.b) muzo moloua __iter__() vilIl IIhovoIny ohjoll, lloiy ImIomonlujo molouu
__next__(). V nasom iIau (a vo vlsIn iIauu) moloua __iter__() vilI jounouuso self,
iolozo lalo liIua ImIomonlujo svou vIaslnI molouu __next__().
}4] Moloua __next__() so voI vzuy, luyz nluo zavoI IunlcI next() s Iloiloiom Inslanco liIuy.
Za mInullu lo huuo uval vlsI smysI.
}] Kuyz moloua __next__() vyvoI vyjImlu StopIteration, sIgnaIIzujo lIm voIajIcImu, zo Iloiaco
sloncIIa. Na iozuII ou vlsIny jInycl vyjImol so zuo nosIgnaIIzujo clyha. Juo o hznou sIluacI,
lloi iosl znamon, zo Iloiloi uz nom zun uala, lloi hy gonoiovaI. Poluu jo voIajIcIm
cylIus for, huuo vyjImla SloIloialIon zaclycona a cylIus huuo hoziohIomov uloncon.
(JInymI sIovy, cylIus vyjImlu soIlno.) Tolo maIo louzIo jo vo slulocnoslI lIIcom l ouzIlI
Iloiloiu v cylIocl for.
}6] VyiouulovnI uaIsI lounoly iovouo Iloiloi lal, zo moloua __next__() lounolu jounouuso
vilI iIlazom return. NoouzIvojlo zuo iIlaz yield. Ton jo ouzo synlallIclym culillom
a m vyznam ouzo v souvIsIoslI s gonoiloiy. Zuo vylviImo ou zlIauu svuj vIaslnI Iloiloi,
iolo huuomo ouzIval return.
Iz jslo In zmalonI Vyhoin. PouIvojmo so, jal huuomo Iloiloi voIal:
7.. IIhonaccIlo Iloiloi
166
>>> from fibonacci2 import Fib
>>> for n in Fib(1000):
... print(n, end=' ')
0 1 1 2 3 5 8 13 21 34 55 89 144 233 377 610 987
Cozo Vzuyl jo lo In slojno! V lazuom hajlu so lo slouujo s voInIm gonoiloiu IIhonaccIlo o-
sIounoslI (az na iozuII jounolo voIlolo Ismono). AIo jal jo lo mozno
CylIy for v soh sliyvajI lioclu magIo. Ouoliv so v nIcl nsIouujIcI:
- CylIus for voI Fib(1000), jal jo vIul z louu. ViacI so Inslanco liIuy Fib. RIlojmo jI lioha
fib_inst.
- CylIus Ioi olajI a uocoIa clylio voI IunlcI iter(fib_inst), lloi vilI ohjoll Iloiloiu.
RIlojmo mu lioha fib_iter. V nasom iIau IalI fib_iter == fib_inst, iolozo moloua
__iter__() viacI self. AIo o lom cylIus for novI (a jo mu lo jouno).
- Za coIom ,iuclouu lounolamI Iloiloiu voI cylIus Ioi IunlcI next(fib_iter), lloi
zaso voI molouu __next__() ohjollu fib_iter. Ta iovouo vyocol uaIsIlo IIhonaccIlo cIsIa
a viacI lounolu. CylIus for lounolu iovozmo, iIiauI jI uo iomnno n a s loulo lounolou
v n iovouo lIo cylIu.
- Jal cylIus for vI, luy m sloncIl To jsom iu, zo jslo so zolaII! Kuyz next(fib_iter) vyvoI
vyjImlu StopIteration, cylIus for jI soIlno a soiuan so uloncI. (JalloIIv jIn vyjImla
so iouslI a iojovI so ohvylIym zusohom.) A luo jsmo zalIouII vyjImlu StopIteration
No ioco v molou __next__()!
7.6. Iloiloi io iavIuIa mnoznolo cIsIa
PiIsoI cas na IInIo. PioIsmo gonoiloi iavIuoI
io mnozno cIsIo uo ouohy Iloiloiu.
class LazyRules:
rules_filename = 'plural6-rules.txt'
def __init__(self):
self.pattern_file = open(self.rules_filename, encoding='utf-8')
self.cache = []
def __iter__(self):
self.cache_index = 0
return self
7.6. Iloiloi io iavIuIa mnoznolo cIsIa
iter(f) vol f.__iter__
next(f) vol f.__next__
167
def __next__(self):
self.cache_index += 1
if len(self.cache) >= self.cache_index:
return self.cache[self.cache_index - 1]
if self.pattern_file.closed:
raise StopIteration
line = self.pattern_file.readline()
if not line:
self.pattern_file.close()
raise StopIteration
pattern, search, replace = line.split(None, 3)
funcs = build_match_and_apply_functions(
pattern, search, replace)
self.cache.append(funcs)
return funcs
rules = LazyRules()
TolIo jo louy liIua, lloi ImIomonlujo molouy __iter__() a __next__(), lalzo jI muzomo ouzIl jalo
Iloiloi. Za loncom jojI uoIInIco so vylvoiI Inslanco liIuy a iIiauI so uo rules. To so slano jon jounou,
iI Imoilu.
Piohoimo sI zmInnou liIuu o louscIcl.
class LazyRules:
rules_filename = 'plural6-rules.txt'
def __init__(self):
self.pattern_file = open(self.rules_filename, encoding='utf-8') }1]
self.cache = [] }2]
}1] Kuyz vylvoiImo InslancI liIuy LazyRules (IIn iavIuIa), olovio so souhoi s uoIInIcomI vzoilu,
aIo nIc so z nj noclo. (K lomu uojuo ozujI.)
}2] Po olovionI souhoiu so InIcIaIIzujo vyiovnvacI aml (caclo). Buuomo jI ouzIval ozujI,
hlom clonI iulu zo souhoiu vzoilu (v molou __next__()).
Noz huuomo oliacoval, ouIvojmo so ouiohnjI na rules_filename. Talo iomnn nonI uoIInovna
uvnIli molouy __init__(). Vo slulocnoslI nonI uoIInovna uvnIli 20dn6 molouy. Jo uoIInovna na iovnI
liIuy. Juo o rom6nnou |Idy. AcloIIv l nI muzomo iIsluoval slojnym zusohom jalo l njalo cIonslo
iomnno (self.rules_filename), suIII jI vsoclny Inslanco liIuy LazyRules.
7.6. Iloiloi io iavIuIa mnoznolo cIsIa
168
>>> import plural6
>>> r1 = plural6.LazyRules()
>>> r2 = plural6.LazyRules()
>>> r1.rules_filename }1]
'plural6-rules.txt'
>>> r2.rules_filename
'plural6-rules.txt'
>>> r2.rules_filename = 'r2-override.txt' }2]
>>> r2.rules_filename
'r2-override.txt'
>>> r1.rules_filename
'plural6-rules.txt'
>>> r2.__class__.rules_filename }8]
'plural6-rules.txt'
>>> r2.__class__.rules_filename = 'papayawhip.txt' }4]
>>> r1.rules_filename
'papayawhip.txt'
>>> r2.rules_filename }]
'r2-overridetxt'
}1] Kazu Inslanco liIuy uuI aliIhul rules_filename s lounolou uoIInovanou na iovnI liIuy.
}2] Kuyz zmnImo lounolu lololo aliIhulu v jouno InslancI, noovIIvnImo lIm oslalnI Inslanco.
}8] .a anI noovIIvnImo aliIhul liIuy. K aliIhulu liIuy (v iolIlIauu l aliIhulu jounolIIvycl Inslan-
cI) muzomo iIsluoval iosliounIclvIm socIInIlo aliIhulu __class__, lloiy ziIsluujo
liIuu jalo lalovou.
}4] Poluu zmnIlo lounolu aliIhulu liIuy, al lo ovIIvnI vsoclny Inslanco, lloio lulo lounolu
uosuu uuI (zuo r1).
}] Inslanco, lloio lonlo aliIhul iosaIy (zuo r2), ovIIvnny nohuuou.
AIo zl l nasI ulzco.
def __iter__(self): }1]
self.cache_index = 0
return self }2]
}1] Moloua __iter__() huuo voIna olazuo, luyz nluo (uojmo lomu cylIus for) zavoI
iter(rules).
}2] Jounou z vcI, lloiou musI lazu moloua __iter__() uuIal, jo viconI Iloiloiu. V lomlo
iIau so viacI self, cImz uvmo najovo, zo lalo liIua uoIInujo njalou molouu __next__(),
lloi so oslai o viaconI lounol hlom Iloiaco.
7.6. Iloiloi io iavIuIa mnoznolo cIsIa
169
def __next__(self): }1]
.
.
.
pattern, search, replace = line.split(None, 3)
funcs = build_match_and_apply_functions( }2]
pattern, search, replace)
self.cache.append(funcs) }8]
return funcs
}1] Moloua __next__() huuo voIna olazuo, luyz nluo (uojmo lomu cylIus for) zavoI
next(rules). SmysI lolo molouy ocloImo, luyz zacnomo ou jojIlo lonco a ujuomo
ozllu. Talzo ojumo na lo.
}2] PosIounI csl lolo Iunlco hy vm mIa hyl iInojmonsIm ovuom. Iunlco
build_match_and_apply_functions() so nozmnIIa. Jo oiu slojn, jalo vzuycly hyIa.
}8] JouIny iozuII socIv v lom, zo iou viconIm iozlouovacI a aIIlacnI Iunlco (jsou uIozony
v uvojIcI funcs) jo nojuiIvo uIozImo uo self.cache.
Posumo so zl.
def __next__(self):
.
.
.
line = self.pattern_file.readline() }1]
if not line: }2]
self.pattern_file.close()
raise StopIteration }8]
.
.
.
}1] Tauy ouzIjomo IInlu so souhoiom io lioslu oliocIIojsI. Moloua readline() (oznmla:
jounolno cIsIo, nIloIIv mnozno readlines()) ioclo z olovionolo souhoiu iosn jouon iuol.
PiosnjI iocono, ioclo uaIsI iuol. (Souhoiovo ohjolly jsou lalo Iloiloiy! Iloiloiy jsou vsuuo,
az o zlIauy...)
}2] Poluu molIa readline() iocIsl iuol uo iomnno line, huuo lo noizuny iolzoc. Dolon-
co I luyhy souhoi ohsalovaI izuny iuol, sloncI IIno jalo jounoznalovy iolzoc '\n' (znal
lonco iulu). Poluu so v iomnno line oiavuu naclzI izuny iolzoc, znamon lo, zo
souhoi uz noohsalujo zuno uaIsI iuly lo clonI.
}8] Kuyz uoslnomo lonco souhoiu, mII hyclom souhoi zaviIl a vyvoIal magIclou vyjImlu
StopIteration. PiIomomo sI, zo uo lololo houu jsmo so uoslaII, iolozo jsmo oliohovaII
iozlouovacI a aIIlacnI IunlcI io uaIsI iavIuIo. DaIsI iavIuIo jo uoIInovano uaIsIm iulom
7.6. Iloiloi io iavIuIa mnoznolo cIsIa
170
souhoiu. AIo uaIsI iuol uz nommo! Talzo uz nommo co vilIl. Iloiaco sloncIIa.
(Tlo IloialIon Is ovoi. Tlo aily`s ovoi. )
A juomo ozllu az l zacllu molouy __next__().
def __next__(self):
self.cache_index += 1
if len(self.cache) >= self.cache_index:
return self.cache[self.cache_index - 1] }1]
if self.pattern_file.closed:
raise StopIteration }2]
.
.
.
}1] self.cache huuo mIl ouohu soznamu IunlcI, lloio oliohujomo io iozlouovnI a aIIlacI
jounolIIvycl iavIuoI. (PiInojmonsIm lolIo hy vm mIo hyl ovuomo!) V self.cache_index
so amalujo, lloi uaIsI (uz zaamalovan) oIozla so m vilIl iIsl. Poluu jsmo uosuu no-
vycoiaII iosloi so zaamalovanymI oIozlamI (lj. oluu jo uoIla self.cache vlsI noz self.
cache_index), al jsmo jI nasII (cache hit)! Hui! RozlouovacI a aIIlacnI IunlcI muzomo
vilIl z vyiovnvacI amlI a nomusImo jo huuoval znovu.
}2] Na uiulou slianu, oluu jsmo na oIozlu vo vyiovnvacI amlI nonaiazIII a ziovo jo souho-
iovy ohjoll uz uzavion (coz so nIzo v louu molouy muzo sll jal jsmo vIuII v iouclzojIcI
ulzco), al uz nomuzomo nIc vIc uIal. Poluu jo souhoi uzavion, znamon lo, zo jsmo jolo
ohsal vycoiaII. Iz jsmo iocolII lazuy jolo iuol a vyhuuovaII jsmo Iunlco io iozlouovnI
a io aIIlacI io lazuy vzoiol a uIozIII jsmo jo uo vyiovnvacI amlI. Souhoi jo vycoiany,
vyiovnvacI aml jo vycoian, j jsom vycoiany. Poclal! Co , }vyuizaj
Ijani], uz jo lo sloio lolovo.
Kuyz lo umo vsoclno uoliomauy, iovuI so nsIouujIcI:
- V olamzIlu Imoilu mouuIu so vylvoiI jouIn Inslanco liIuy LazyRules, lloi jo nazvan rules
(iavIuIa). Talo Inslanco olovioIa souhoi so vzoily, aIo nocolIa z nj.
- V olamzIlu, luy so ozauujo ivnI uvojIco IunlcI io iozlouovnI a io aIIlacI, uojuo
lo lonlioIo vyiovnvacI amlI, aIo zjIslI so, zo jo izun. Talzo so zo souhoiu ioclo jouon
iuol so vzoily, vyhuuujI so ouIo nj Iunlco io iozlouovnI a io aIIlacI a uIozI so
uo vyiovnvacI amlI.
- Dojmo lomu, zo vylovIo In ivnI iavIuIo. Poluu lomu lal jo, zuno uaIsI Iunlco
io iozlouovnI a aIIlacI so novylviojI a zo souhoiu so noclou zuno uaIsI iuly.
- DIo uojmo lomu, zo voIajIcI zavoI IunlcI plural() znovu, iolozo clco iovosl uo mnoznolo
cIsIa jIno sIovo. CylIus for vo IunlcI plural() zavoI iter(rules), coz vouo l naslavonI Inuo-
7.6. Iloiloi io iavIuIa mnoznolo cIsIa
171
xu vyiovnvacI amlI na zaclol, aIo nouojuo l iosolovnI olovionolo souhoiovolo ohjollu.
- PiI ivnIm iuclouu ozu cylIus for o lounolu zo sliulluiy rules, coz vouo l zavoInI
jolo molouy __next__(). AIo v lomlo olamzIlu uz vyiovnvacI aml ohsalujo jouIny i
IunlcI io iozlouovnI a io aIIlacI ouovIuajI vzoilum z ivnIlo iulu souhoiu. Piolozo
uz hyIy vylvoiony a uIozony uo vyiovnvacI amlI iI ziacovnI mInuIolo sIova, jsou z nI
vyhiny. Inuox uo vyiovnvacI amlI so zvysI a oloviony souhoi zuslano nouolcon.
- Dojmo lomu, zo ivnI iavIuIo lonlolil nevyhov6o. CylIus Ioi uuI uaIsI ohillu a zol so
na uaIsI lounolu zo soznamu rules. TIm so ouiulo allIvujo moloua __next__(). Tonlolil jo
aIo vyiovnvacI aml vycoina, iolozo ohsalovaIa jon jounu oIozlu a my jsmo ozuaII
o uiulou. Talzo moloua __next__() oliacujo v cInnoslI. Z olovionolo souhoiu ioclo uaIsI
iuol, vyhuuujo ouIo nj iozlouovacI a aIIlacnI IunlcI a uvojIcI uIozI uo vyiovnvacI amlI.
- Poluu iavIuIa huuovan z nacIlanycl iulu souhoiu io zauano sIovo novylovujI, oliacujo
iocos IzomI ,ioclI, vyhuuuj, uIoz uI. JalmIIo so naIozno vlouno iavIuIo iou loncom
souhoiu, jounouuso so ouzIjo a uaIsI nacIlnI so zaslavI. Souhoi zuslano oloviony. IlazaloI
uo souhoiu zuslano lam, luo jsmo ioslaII cIsl, a huuo so colal na uaIsI iIlaz readline().
Vo vyiovnvacI amlI so lou naclzI vIco oIozol. Poluu znovu zaljImo vylvionI mnoznolo
cIsIa io novo sIovo, vyzlousImo iou iIaunym clonIm uaIsIlo iulu souhoiu nojuiIvo
vsoclny oIozly z vyiovnvacI amlI.
DoslII jsmo ,mnoznocIsoIno nIivny.
1. Minimln sturtnvuc cus. JouIno cInnoslI, lloio so iI iIlazu import iovouou, jsou vylvoionI
jouIno Inslanco liIuy a olovionI souhoiu (aIo noclo so z nj).
2. Muximln vyknnnnst. I iouclzojIcIlo iIlIauu hyclom colII zo souhoiu a uynamIcly
huuovaII Iunlco olazuo, luyz hyclom cllII vylvoiIl mnozno cIsIo zauanolo sIova. V lolo
voizI uoclzI lnou o vyhuuovnI IunlcI l jojIcl uIozonI uo vyiovnvacI amlI a v nojloi-
sIm iIau uojuo l ioclonI coIolo souhoiu jounou nozvIsIo na lom, z loIIla sIov lvoiImo
mnozno cIsIo.
8. Oddlon kdu u dut. Vsoclny vzoily jsou uIozono v ouuIonom souhoiu. Kou jo lou, uala jsou
uala a la uvojIco so nIluy nosoll.
> Jo lo oiavuu nIivna Inu, ano I no. I iIlIauu s LazyRules musImo ocIlal s nsIouujIcIm:
souhoi so vzoily so olovio (hlom __init__()) a zuslano olovion, uoluu nohuuo uosazono
osIounIlo iavIuIa. Souhoi so nalonoc uzavio iI ulonconI Pyllonu noho o ziusonI osIounI
Inslanco liIuy LazyRules, aIo muzo lo lival vem douho. Poluu jo lalo liIua soucslI uIoulo
hzIcIlo iocosu, nomusI Inloiiol Pyllonu sloncIl nIluy a lalo ohjoll liIuy LazyRules nomusI
hyl nIluy ziuson.
D so lo ohojIl iuznymI zusohy. MIslo lolo, ahy hyI souhoi olovion hlom __init__() a o-
nocln v olovionom slavu io clonI o jounom iulu, muzomo souhoi oloviIl, iocIsl vsoclny
iuly a souhoi lnou zaviIl. Noho muzomo souhoi oloviIl, iocIsl jouon iuol s iavIuIom,
uIozIl ozIcI v souhoiu zjIslnou molouou tell() a souhoi uzaviIl. PozujI joj znovu oloviomo,
7.6. Iloiloi io iavIuIa mnoznolo cIsIa
172
ouzIjomo molouu seek() a oliacujomo vo clonI lam, luo jsmo sloncIII. A noho sI s lIm nohu-
uomo uIal lzlou lIavu a iosl noclmo souhoi oloviony, jalo lo uI lonlo iIlIau. Piogia-
movnI zco souvIsI s nvilom a nvil jo zaIozon na lomiomIsocl a omozonIcl. Poluu huuo
souhoi onocln v olovionom slavu iIIIs uIoulo, muzo lo vosl l iohIomu. Poluu mIslo lolo
vylvoiIlo lomIIlovanjsI lou, muzo lo lalo vosl l iohIomu. Kloiy z lcllo iohIomu jo vlsI,
zIozI na vasom vyvojovom lymu, na vasI aIIlacI a na iovoznIm iosliouI.
7.7. Piocllo sI
- Itorutnr typos
(lll:lluocs.yllon.oigly8llIIhiaiylslulyos.llmI)
- PEP Z84: Itorutnrs
(vvv.yllon.oigluovloslo-u284l)
- PEP Z: Simplo Gonorutnrs
(vvv.yllon.oigluovloslo-u2l)
- Gonorutnr Tricks fnr Systoms Prngrummors
(vvv.uahoaz.comlgonoialoisl)
7.7. Piocllo sI
173
8. Itertory pro pokroil
8. KaIloIa
Great fleas have little fleas upon their backs to bite em,
And little fleas have lesser fleas, and so ad infinitum.
(VoIIlo hIocly maj maIo svo hIocly,
ahy jo lousaIy uo jojIcl zau,
HIo, maIo sI nosou svo o nco monsI;
lonco lo nom ouIvny iu.)
Auguslus Do Moigan
174
8. Itertory pro pokroil 173
8.1. Ponoimo so 175
8.2. NaIozonI vsocl vyslylu vzoilu 176
8.8. NaIozonI jouInocnycl ivlu
osIounoslI 177
8.4. CInImo iouolIauy 178
8.. Gonoiloiovo vyiazy 179
8.6. Vyocol oimulacI (io Ionocly) 180
8.7. DaIsI Iogicly v mouuIu itertools 182
8.8. Novy zusoh iavy iolzco 185
8.u. VylounocovnI IIhovoInycl iolzcu
zaclycujIcIcl yllonovslo vyiazy 187
8.1u. Sojmo lo vsoclno uoliomauy 190
8.11. Piocllo sI 191
Ohsal laIloIy
175
8.1 Ponoimo so
JoslIIzo iIiovnmo ioguIinI vyiazy lo sloioIuum io iolzco, al mouuI itertools iouslavujo sloioI-
uy io Iloiloiy. AIo nojuiIvo sI ulzomo jounu lIasIclou luanlu.
HAWAII + IDAHO + IOWA + OHIO == STATES
510199 + 98153 + 9301 + 3593 == 621246
H = 5
A = 1
W = 0
I = 9
D = 8
O = 3
S = 6
T = 2
E = 4
Pio luanly lololo lyu so ouzIvajI angIIclo nzvy try|ur|hm: noho uhume|t:. PIsmona jsou sIo-
zona uo slulocnycl sIov, aIo oluu lazuo z nIcl naliauIlo cIsIIcI 0-9, al lvoiI aiIlmolIclou iovnIcI.
IloI socIv v naIozonI uvojIc IsmonolcIsIIco. Vsoclny vyslyly slojnolo Ismono so musI ul naliauIl
slojnou cIsIIcI. Zun cIsIIco so nosmI oaloval a zuno ,sIovo nosmI zacInal cIsIIcI 0.
V lolo laIloIo so onoiImo uo nouviIloInolo yllonov-
slolo iogiamu, lloiy uvoun nasaI Raymonu HollIngoi.
Piogiam iosI aIIamolIclo luanly nu ouhyth 14 I0dtth
Lodu.
import re
import itertools
def solve(puzzle):
words = re.findall('[A-Z]+', puzzle.upper())
unique_characters = set(''.join(words))
assert len(unique_characters) <= 10, 'Too many letters'
first_letters = {word[0] for word in words}
n = len(first_letters)
sorted_characters = ''.join(first_letters) + \
''.join(unique_characters - first_letters)
characters = tuple(ord(c) for c in sorted_characters)
8.1 Ponoimo so
Nejznmj alfametickou
hdankou je SEND + MORE =
MONEY.
176
digits = tuple(ord(c) for c in '0123456789')
zero = digits[0]
for guess in itertools.permutations(digits, len(characters)):
if zero not in guess[:n]:
equation = puzzle.translate(dict(zip(characters, guess)))
if eval(equation):
return equation
if __name__ == '__main__':
import sys
for puzzle in sys.argv[1:]:
print(puzzle)
solution = solve(puzzle)
if solution:
print(solution)
Piogiam muzomo suslIl z iIlazovolo iulu. Pou LInuxom lo huuo vyaual njal lallo. (V zvIsIoslI na iycl-
IoslI vasolo ocIlaco lo muzo zahial njaly cas a nonI zuo zuny InuIlloi iuhlu vyoclu. Buulo liIIvI.)
you@localhost:~/diveintopython3/examples$ python3 alphametics.py "HAWAII + IDAHO + IOWA + OHIO == STATES"
HAWAII + IDAHO + IOWA + OHIO = STATES
510199 + 98153 + 9301 + 3593 == 621246
you@localhost:~/diveintopython3/examples$ python3 alphametics.py "I + LOVE + YOU == DORA"
I + LOVE + YOU == DORA
1 + 2784 + 975 == 3760
you@localhost:~/diveintopython3/examples$ python3 alphametics.py "SEND + MORE == MONEY"
SEND + MORE == MONEY
9567 + 1085 == 10652
8.2. NaIozonI vsocl vyslylu vzoilu
Piogiam io iosonI aIIamolIly zo vsolo nojuiIv lIou v luanco Ismona (AZ).
>>> import re
>>> re.findall('[0-9]+', '16 2-by-4s in rows of 8') }1]
['16', '2', '4', '8']
>>> re.findall('[A-Z]+', 'SEND + MORE == MONEY') }2]
['SEND', 'MORE', 'MONEY']
}1] MouuI re ImIomonlujo v Pyllonu ioguIinI vyiazy. Najuomo v nm I sIlovnou IunlcI nazva-
nou findall(), lloio zauvmo vzoiol io ioguIinI vyiaz a iolzoc. Iunlco v zauanom iolzcI
naIozno vsoclny vyslyly vzoilu. V lomlo iIau vzoiol asujo na osIounoslI cIsIIc. Iunlco
findall() viacI soznam vsocl ouiolzcu, lloio vzoilu vylovujI.
8.2. NaIozonI vsocl vyslylu vzoilu
177
}2] Zuo ioguIinI vyiaz oIsujo osIounoslI Ismon. Nvialovou lounolou jo ol soznam, joloz
ivly jsou iolzco, lloio asovaIy l ioguIinImu vyiazu.
NsIouujo uaIsI iIlIau, lloiy vm lioclu iocvIcI mozol.
>>> re.findall(' s.*? s', "The sixth sick sheikh's sixth sheep's sick.")
[' sixth s', " sheikh's s", " sheep's s"]
PiolvaonI RoguIinI vyiaz lIou mozoiu, znal s, al
nojlialsI moznou osIounosl IIhovoInycl znalu (.*?),
al mozoiu a uaIsI s. Kuyz so lal uIvm na vslunI iolzoc,
vIuIm l asujIcIcl ouiolzcu:
The sixth sick sheikh's sixth sheep's sick.
The sixth sick sheikh's sixth sheep's sick.
The sixth sick sheikh's sixth sheep's sick.
The sixth sick sheikh's sixth sheep's sick.
The sixth sick sheikh's sixth sheep's sick.
AIo Iunlco re.findall() vilIIa jon liI slouy. Konlioln vilIIa jon ivnI, liolI a lou. Pioc jon liI
Fro|o2e nevrut IeLryvujt :e :hody :e vzorLem. PivnI sloua so ioliyv s uiulou, lalzo ivnI so viacI
a uiul so ioslalujo. Pal so liolI sloua ioliyv so clvilou, lalzo liolI so viacI a clvil so ioslalujo.
A nalonoc jo lu l sloua, lloi so viacI. Najuou so louy liI vyslyly a no l.
TalIo oznmla nomIa s iosonIm aIIamolIly nIc soIocnolo. Piosl mI lo iIauIo zajImavo.
8.8. NaIozonI jouInocnycl ivlu osIounoslI
JouInocno lounoly z osIounoslI muzomo snauno najIl omocI mnozIn (sol).
>>> a_list = ['The', 'sixth', 'sick', "sheik's", 'sixth', "sheep's", 'sick']
>>> set(a_list) }1]
{'sixth', 'The', "sheep's", 'sick', "sheik's"}
>>> a_string = 'EAST IS EAST'
>>> set(a_string) }2]
{'A', ' ', 'E', 'I', 'S', 'T'}
>>> words = ['SEND', 'MORE', 'MONEY']
>>> ''.join(words) }8]
'SENDMOREMONEY'
>>> set(''.join(words)) }4]
{'E', 'D', 'M', 'O', 'N', 'S', 'R', 'Y'}
8.8. NaIozonI jouInocnycl ivlu osIounoslI
Tohle je nejt jazykolam,
jak v anglickm jazyce
najdete.
178
}1] Poluu mmo soznam s nloIIla iolzcI, al nm z nj Iunlco set() vylvoiI mnozInu jouInoc-
nycl iolzcu. D so lo snauno ocloIl, luyz sI lo iouslavIlo jalo cylIus for. Vozmomo ivnI
oIozlu zo soznamu a vIozImo jI uo mnozIny. Pal uiulou. A liolI. Clvilou. Plou... Poclal!
Ta uz v mnozIn jo, lalzo so huuo vyIsoval jon jounou, iolozo mnozIny v Pyllonu noumoz-
ujI oxIsloncI uuIIcIl. A soslou. Soumou a znovu uuIIcIla, lalzo so al ohjovI jon jounou.
A jaly jo lonocny vysIouol Z uvounIlo soznamu zhyIy jon jouInocno oIozly hoz uuIIcIl.
PuvounI soznam anI nomusImo iouom soiauIl.
}2] Slojn loclnIla Iungujo I io iolzco, iolozo iolzco jsou osIounoslmI znalu.
}8] Poluu mmo soznam iolzcu, al ''.join(a_list) sojI vsoclny iolzco uo jounolo.
}4] Talzo oluu mmo soznam iolzcu, lonlo iuol louu vilI jouInocno znaly naclzojIcI
so vo vsocl iolzcIcl. Boz uuIIcIl.
Piogiam io iosonI aIIamolIl lulo loclnIlu ouzIv io vylvoionI mnozIny vsocl jouInocnycl znalu
v zaunI.
unique_characters = set(''.join(words))
Piogiam oslun ioclzI vsomI moznymI iosonImI a lulo mnozInu ouzIv io iIiazonI cIsIIc jounol-
IIvym znalum.
8.4. CInImo iouolIauy
V Pyllonu, slojn jalo v mnola jInycl iogiamovacIcl jazycIcl, najuomo iIlaz assert. Iungujo nsIo-
uovn.
>>> assert 1 + 1 == 2 }1]
>>> assert 1 + 1 == 3 }2]
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
AssertionError
>>> assert 2 + 2 == 5, "Only for very large values of 2" }8]
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
AssertionError: Only for very large values of 2
}1] Za iIlaz assert uvouomo IIhovoIny Ialny yllonovsly vyiaz. V lomlo iIau so vyiaz
1 + 1 == 2 vylounolI jalo True, lalzo iIlaz assert nouI nIc.
}2] Poluu so aIo yllonovsly vyiaz vylounolI jalo False, vyvoI iIlaz assert vyjImlu
AssertionError.
}8] Za vyiaz muzomo uvosl lalo IIusly cIloInou zivu, lloi so v iIau vyvoInI vyjImly
AssertionError zohiazI.
8.4. CInImo iouolIauy
179
Talzo nsIouujIcI iuol louu:
assert len(unique_characters) <= 10, 'Too many letters'
.jo olvIvaIonlom zIsu:
if len(unique_characters) > 10:
raise AssertionError('Too many letters')
Piogiam iosIcI aIIamolIlu ouzIv iosn lalovy iIlaz assert l ioucasnomu ulonconI cInnoslI v iIa-
u, luy luanla ohsalujo vIc noz uosol jouInocnycl znalu. Piolozo lazuomu Ismonu iIiazujomo jouI-
nocnou cIsIIcI a cIsIIc mmo jon uosol, luanla s vIco noz uosolI jouInocnymI znaly nomuzo mIl iosonI.
8.. Gonoiloiovo vyiazy
Gonoiloiovy vyiaz so ouoh gonoiloiovo IunlcI, aIo Iunlco lo nonI.
>>> unique_characters = {'E', 'D', 'M', 'O', 'N', 'S', 'R', 'Y'}
>>> gen = (ord(c) for c in unique_characters) }1]
>>> gen }2]
<generator object <genexpr> at 0x00BADC10>
>>> next(gen) }8]
69
>>> next(gen)
68
>>> tuple(ord(c) for c in unique_characters) }4]
(69, 68, 77, 79, 78, 83, 82, 89)
}1] Gonoiloiovy vyiaz so clov jalo anonymnI Iunlco, lloi iouulujo lounoly. Vyiaz samolny
so ouoh gonoiloiovo nolacI soznamu (IIsl comiolonsIon), aIo mIslo uo lianalycl zvoiol jo
uzavion v luIalycl zvoilcl.
}2] Gonoiloiovy vyiaz viacI. Iloiloi.
}8] PiI voInI next(gen) so nm viacI uaIsI lounola Iloiloiu.
}4] Poluu clcolo, muzolo Iloioval ios vsoclny lounoly a vilIl n-lIcI, soznam noho mnozInu lIm,
zo gonoiloiovy vyiaz ouzIjolo v ioII aigumonlu tuple(), list() noho set(). V lalovom iI-
au nomusIlo ouzIval sauu luIalycl zvoiol navIc. IunlcI tuple() slacI ioual ,loIy vyiaz
ord(c) for c in unique_characters a Pyllon uz ozn, zo juo o gonoiloiovy vyiaz.
> Kuyz mIslo gonoiloiovo nolaco soznamu ouzIjolo gonoiloiovy vyiaz, usoliIlo jal CPU, lal
RAM. Poluu lonsliuujolo soznam jon iolo, ahyslo lo zaso zalouIII (lj. luyz lo naiIlIau clcolo
ioual uo tuple() noho set()), ouzIjlo iaujI gonoiloiovy vyiaz!
8.. Gonoiloiovo vyiazy
180
NsIouujIcI ulzla uosalujo slojnolo oIollu s ouzIlIm gonoiloiovo Iunlco:
def ord_map(a_string):
for c in a_string:
yield ord(c)
gen = ord_map(unique_characters)
Gonoiloiovy vyiaz jo lomallnjsI, aIo Iungujo slojn.
8.6. Vyocol oimulacI (io Ionocly)
Zo vsolo nojuiIvo so ouIvojmo, co lo vIasln jsou oimulaco Poimulaco jsou malomalIcly loncol.
(Vo slulocnoslI oxIslujo nloIIl uoIInIcI v zvIsIoslI na lom, jalym uiulom malomalIly so zahyvlo.
Zuo so uollnomo lomhInaloiIly. AIo oluu vm lo nIc noiIl, nouIojlo sI s lIm slaioslI. Tal jalo vzuy,
vasIm lamaiuom jo WIlIouIo.)
ZlIaunI mysIonla socIv v lom, zo vozmomo soznam vcI (molou lo hyl cIsIa, Ismonla noho lancu-
jIcI mouvIucI) a najuomo vsoclny mozno zusohy, jal z nj uuIal monsI soznamy. (Poznmla iolIa-
ualoIo: V nasIcl sloIcl so io oznaconI lololo lonu ouzIv ojom vaiIaco l-lo liIuy z n ivlu hoz
oalovnI. Pojom oimulaco hoz oalovnI so u ns ouzIv jon io socIInI iIau, luy k jo iovno n.
V uaIsIm loxlu zuslanu u clnI ojmu z oiIgInInI uhIIlaco lalo z uuvouu ojmonovnI iIsIusno
Iunlco.) Vsoclny monsI soznamy majI mIl slojnou voIIlosl, lloi muzo hyl ou 1 az o coIlovy ocol
ivlu. A nIc so nosmI oaloval. MalomalIcI hy iolII ,najumo oimulaco uvojIc z liI iuznycl ivlu
(u ns ,najulo vaiIaco uiulo liIuy z liI ivlu hoz oalovnI). To znamon, zo mmo osIounosl liI
ivlu a clcomo naIozl vsoclny mozno usoiuano uvojIco.
>>> import itertools }1]
>>> perms = itertools.permutations([1, 2, 3], 2) }2]
>>> next(perms) }8]
(1, 2)
>>> next(perms)
(1, 3)
>>> next(perms)
(2, 1) }4]
>>> next(perms)
(2, 3)
>>> next(perms)
(3, 1)
>>> next(perms)
(3, 2)
>>> next(perms) }]
8.6. Vyocol oimulacI (io Ionocly)
181
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
StopIteration
}1] MouuI itertools ohsalujo coIou iauu zhavnycl vcI, vcoln Iunlco permutations(), lloi
ns iI lIounI oimulacI zhavI vosloio nmaly.
}2] Iunlco permutations() iohIi osIounosl (zuo juo o soznam liI cIsoI) a ozauovany ocol
ivlu v monsIcl sluIncl. Iunlco viacI Iloiloi, lloiy muzomo ouzIl v cylIu for noho
na jalomloIIv slaiom znmom mIsl, vo lloiom so Iloiujo (lj. ioclzI vsomI ivly). Zuo huuo-
mo iovul lioly Iloiloiu iucn, ahyclom sI vsoclny lounoly ulzaII.
}8] PivnI oimulacI zo soznamu [1, 2, 3] jo uvojIco (1, 2).
}4] Poznamonojmo, zo oimulaco jsou usoiuano: (2, 1) jo nco jInolo noz (1, 2).
}] Tal lo jsou ony! TolIo jsou oimulaco vsocl uvojIc z [1, 2, 3]. DvojIco jalo (1, 1) noho
(2, 2) zuo nIluy nouvIuIlo, iolozo ohsalujI oalujIcI so ivly. Talzo nojuo o Ialno
oimulaco. Poluu uz vIco oimulacI nooxIslujo, Iloiloi vyvoI vyjImlu StopIteration.
IunlcI permutations() nomusImo iouval jon soznam.
Muzo iohIial jalouloIIv osIounosl, uolonco I iolzoc.
>>> import itertools
>>> perms = itertools.permutations('ABC', 3) }1]
>>> next(perms)
('A', 'B', 'C') }2]
>>> next(perms)
('A', 'C', 'B')
>>> next(perms)
('B', 'A', 'C')
>>> next(perms)
('B', 'C', 'A')
>>> next(perms)
('C', 'A', 'B')
>>> next(perms)
('C', 'B', 'A')
>>> next(perms)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
StopIteration
>>> list(itertools.permutations('ABC', 3)) }8]
[('A', 'B', 'C'), ('A', 'C', 'B'),
('B', 'A', 'C'), ('B', 'C', 'A'),
('C', 'A', 'B'), ('C', 'B', 'A')]
8.6. Vyocol oimulacI (io Ionocly)
Modul itertools obsahuje
vemon zbavn vci.
182
}1] Rolzoc jo jon osIounoslI znalu. Talzo io coIy lIounI oimulacI jo iolzoc 'ABC' olvIva-
Ionlom l soznamu ['A', 'B', 'C'].
}2] PivnI oimulacI liojIc z liI ivlu ['A', 'B', 'C'] jo ('A', 'B', 'C'). Pio slojno znaly
oxIslujo l uaIsIcl mysIIloInycl usoiunI, louy oimulacI.
}8] Iunlco permutations() viacI vzuy Iloiloi. Snauny zusoh zvIuIloInnI vsocl oimulacI iI
IaunI socIv vo vylvoionI jojIcl soznamu iounIm Iloiloiu uo zahuuovano Iunlco list().
8.7. DaIsI Iogicly v mouuIu itertools
>>> import itertools
>>> list(itertools.product('ABC', '123')) }1]
[('A', '1'), ('A', '2'), ('A', '3'),
('B', '1'), ('B', '2'), ('B', '3'),
('C', '1'), ('C', '2'), ('C', '3')]
>>> list(itertools.combinations('ABC', 2)) }2]
[('A', 'B'), ('A', 'C'), ('B', 'C')]
}1] Iunlco itertools.product() viacI Iloiloi, lloiy vylviI lailozsly soucIn uvou osIounoslI.
}2] Iunlco itertools.combinations() viacI Iloiloi, lloiy vylviI vsoclny mozno lomhInaco
uano uoIly z uano osIounoslI. Pouoh so IunlcI itertools.permutations() s lou vyjImlou,
zo lomhInaco nozalinujI vysIouly, lloio vznIlnou oulou zmnou usoiunI oIozol jInolo
vysIoulu. Talzo itertools.permutations('ABC', 2) vilI jal ('A', 'B'), lal ('B', 'A')
(mImo jIno), aIo itertools.combinations('ABC', 2) novilI ('B', 'A'), iolozo juo o uuIIcI-
lu vylvoionou zmnou oiauI oIozol ('A', 'B').
>>> names = list(open('examples/favorite-people.txt', encoding='utf-8')) }1]
>>> names
['Dora\n', 'Ethan\n', 'Wesley\n', 'John\n', 'Anne\n',
'Mike\n', 'Chris\n', 'Sarah\n', 'Alex\n', 'Lizzie\n']
>>> names = [name.rstrip() for name in names] }2]
>>> names
['Dora', 'Ethan', 'Wesley', 'John', 'Anne',
'Mike', 'Chris', 'Sarah', 'Alex', 'Lizzie']
>>> names = sorted(names) }8]
>>> names
['Alex', 'Anne', 'Chris', 'Dora', 'Ethan',
'John', 'Lizzie', 'Mike', 'Sarah', 'Wesley']
>>> names = sorted(names, key=len) }4]
>>> names
['Alex', 'Anne', 'Dora', 'John', 'Mike',
'Chris', 'Ethan', 'Sarah', 'Lizzie', 'Wesley']
8.7. DaIsI Iogicly v mouuIu itertools
183
}1] Tonlo ohial viacI soznam vsocl iulu v loxlovom souhoiu.
}2] NanoslslI (io lonlo iIlIau) ohial list(open(filename)) viacI na loncI lazuolo iulu I znal
lonco iulu. V lolo gonoiloiovo nolacI soznamu ouzIjomo molouu iolzco rstrip(), lloi
z lonco lazuolo iulu ouslianI loncovo hIIo znaly. (Rolzco uoIInujI loz molouu lstrip(), lloi
ousliaujo vounI hIIo znaly, a molouu strip(), lloi ousliaujo hIIo znaly z ohou loncu.)
}8] Iunlco sorted() iohIi soznam a viacI novy, soiazony. Noiolnomo-II jInal, iauI so ouIo ahocouy.
}4] AIo IunlcI sorted() muzomo aiamoliom key ioual IunlcI a al so iovouo iazonI ouIo jojIcl
vysIoulu. V lomlo iIau hyIa iouna Iunlco len(), lalzo iazonI iohIl ouIo vysIoulu Iunl-
co len(poloka). NojlialsI jmona so uoslanou na zaclol, al huuou nsIouoval uoIsI a uoIsI.
A co lo m soIocnolo s mouuIom itertools To jsom iu, zo so llo.
pokraovn v pedchoz prci s interaktivnm shellem
>>> import itertools
>>> groups = itertools.groupby(names, len) }1]
>>> groups
<itertools.groupby object at 0x00BB20C0>
>>> list(groups)
[(4, <itertools._grouper object at 0x00BA8BF0>),
(5, <itertools._grouper object at 0x00BB4050>),
(6, <itertools._grouper object at 0x00BB4030>)]
>>> groups = itertools.groupby(names, len) }2]
>>> for name_length, name_iter in groups: }8]
... print('Names with {0:d} letters:'.format(name_length))
... for name in name_iter:
... print(name)
...
Names with 4 letters:
Alex
Anne
Dora
John
Mike
Names with 5 letters:
Chris
Ethan
Sarah
Names with 6 letters:
Lizzie
Wesley
8.7. DaIsI Iogicly v mouuIu itertools
184
}1] Iulco itertools.groupby() iohIi osIounosl a IunlcI lIIco. ViacI Iloiloi, lloiy vylviI
uvojIco. Kazu uvojIco ohsalujo jounal vysIouol funkce_klic(kad poloka) a jounal uaIsI
Iloiloi, lloiy ioclzI vsomI oIozlamI so slojnym vysIoulom Iunlco lIIco.
}2] VoInIm Iunlco list() jsmo Iloiloi ,vycoiaII. To znamon, zo jsmo iI vylvionI soznamu vy-
gonoiovaII lazuou oIozlu Iloiloiu. Iloiloi nom zuno lIacIllo ,iosol. JalmIIo jsmo osIou-
nosl jounou vycoiaII, nomuzomo zacIl znovu. Poluu clcomo lounoly iojIl znovu (uojmo lomu
v uaIsIm cylIu for), musImo znovu zavoIal itertools.groupby() a vylvoiIl novy Iloiloi.
}8] Za iouolIauu, zo uz mmo soznam jmon :eIuzeny ode jejth d6eL, iIuII itertools.
groupby(names, len) vsom jmonum uoIly 4 jouon Iloiloi, vsom jmonum uoIly 5 uiuly Iloi-
loi alu. Iunlco groupby() jo zcoIa ohocn. Rolzco muzomo sosluIl ouIo ivnIlo Ismono,
cIsIa ouIo oclu jojIcl ivocInIloIu noho ouIo jaloloIIv mysIIloIno Iunlco lIIco.
> Iunlco itertools.groupby() Iungujo jon v iIau, luy jo vslunI osIounosl jIz soiazon
ouIo suiuzovacI Iunlco. Vo vyso uvouonom iIlIauu jsmo soznam jmon sosluIII ouIo Iunlco
len(). IungovaIo lo jon uIly lomu, zo hyI vslunI soznam jIz soiazon ouIo uoIly oIozol.
DIvlo so ozoin
>>> list(range(0, 3))
[0, 1, 2]
>>> list(range(10, 13))
[10, 11, 12]
>>> list(itertools.chain(range(0, 3), range(10, 13))) }1]
[0, 1, 2, 10, 11, 12]
>>> list(zip(range(0, 3), range(10, 13))) }2]
[(0, 10), (1, 11), (2, 12)]
>>> list(zip(range(0, 3), range(10, 14))) }8]
[(0, 10), (1, 11), (2, 12)]
>>> list(itertools.zip_longest(range(0, 3), range(10, 14))) }4]
[(0, 10), (1, 11), (2, 12), (None, 13)]
}1] Iunlco itertools.chain() iohIi uva Iloiloiy a viacI Iloiloi, lloiy vylviI osIounosl vsocl
oIozol nojuiIvo z ivnIlo Iloiloiu a al vsocl oIozol z uiulolo Iloiloiu. (Vo slulocnoslI
muzomo ioual IIhovoIny ocol Iloiloiu a lalo Iunlco ziolzI vsoclny jojIcl lounoly v oiauI,
v jalom jsmo jo IunlcI iouaII.)
}2] Iunlco zip() uI nco uocoIa ohycojnolo, aIo ulazujo so, zo jo voImI uzIlocn. PiohIi IIho-
voIny ocol osIounoslI a viacI Iloiloi, lloiy vylviI n-lIco z ivnIcl oIozol lazuo osIou-
noslI, al z uiulycl oIozol, al z liolIcl alu.
}8] Iunlco zip() zaslavI na loncI nojlialsI osIounoslI. Iunlco range(10, 14) iouulujo 4 oIozly
(1u, 11, 12 a 18), aIo range(0, 3) jon 8. Talzo Iunlco zip() vilI Iloiloi iouulujIcI 8 oIozly.
}4] Naoal Iunlco itertools.zip_longest() zaslavI az na loncI nejde: osIounoslI. MIslo cly-
hjIcIcl oIozol lialsIcl osIounoslI uoInI lounoly None.
8.7. DaIsI Iogicly v mouuIu itertools
185
No uohi, lolIo vsoclno jo sIco voImI zajImavo, aIo jal so lo vzlalujo l iogiamu na iosonI aIIamolIl
Tallo:
>>> characters = ('S', 'M', 'E', 'D', 'O', 'N', 'R', 'Y')
>>> guess = ('1', '2', '0', '3', '4', '5', '6', '7')
>>> tuple(zip(characters, guess)) }1]
(('S', '1'), ('M', '2'), ('E', '0'), ('D', '3'),
('O', '4'), ('N', '5'), ('R', '6'), ('Y', '7'))
>>> dict(zip(characters, guess)) }2]
{'E': '0', 'D': '3', 'M': '2', 'O': '4',
'N': '5', 'S': '1', 'R': '6', 'Y': '7'}
}1] Mmo-II un soznam Ismon a soznam cIsIIc (lazu z nIcl jo v nm ioiozonlovna jalo jouno-
znalovy iolzoc), al nm Iunlco zip siujo Ismona a cIsIIco v uvouonom oiauI.
}2] A ioc hy lo mIo hyl njal zvIsl vylouno Piolozo slouou oloInoslI jo lalov ualov sliullu-
ia iosn lou sivnou ualovou sliulluiou, lloiou muzomo ioual IunlcI dict(), ahy vylvo-
iIIa sIovnIl, lloiy ouzIv Ismona jalo lIIco a l nIm iIuiuzono cIsIIco jalo lounoly. (NonI
lo, samoziojm, jouIny zusoh, jal lolo muzomo uoslnoul. SIovnIl hyclom molII vylvoiIl
iImo, omocI gonoiloiovo nolaco.) AcloIIv loxlov ioiozonlaco ohsalu sIovnIlu zohiazujo
uvojIco v jInom oiauI (sIovnIly samy o soh nouoIInujI ,oiauI), vIuImo, zo lazuo Ismono
m l soh cIsIIcI iIuiuzonou na zlIau uvounIcl osIounoslI characters a guess.
Piogiam io iosonI aIIamolIl lulo loclnIlu ouzIv io vylvoionI sIovnIlu, lloiy iovuI Ismona
z luanly na cIsIa v iosonI io lazuo mozno iosonI.
characters = tuple(ord(c) for c in sorted_characters)
digits = tuple(ord(c) for c in '0123456789')
...
for guess in itertools.permutations(digits, len(characters)):
...
equation = puzzle.translate(dict(zip(characters, guess)))
AIo co jo za molouu la translate()? Tou so uoslvmo l oruvdu zhavno cslI.
8.8. Novy zusoh iavy iolzco
Pyllonovslo iolzco uoIInujI mnolo molou. O nlloiycl
z nIcl jsmo so ucIII v laIloIo Rolzco: lower(), count()
a format(). Tou sI iouslavImo mocnou, aIo mIo znmou
loclnIlu io manIuIacI s iolzcom. Juo o molouu
translate().
8.8. Novy zusoh iavy iolzco
Te se dostvme k opravdu
zbavn sti.
186
>>> translation_table = {ord('A'): ord('O')} }1]
>>> translation_table }2]
{65: 79}
>>> 'MARK'.translate(translation_table) }8]
'MORK'
}1] PiolIau iolzco zacIn naInnIm iolIauovo lahuIly, coz jo iosl sIovnIl, lloiy zohiazujo
jouon znal na jIny. Pojom ,znal jo zuo vIasln uvouon clyhn. PiolIauov lahuIla vo sluloc-
noslI zohiazujo hajly na jIno hajly.
}2] PiIomomo sI, zo hajly jsou v Pyllonu 8 coI cIsIa. Iunlco ord() viacI ASCII lounolu uanolo
znalu. V iIau znalu AZ lo huuou vzuy hajly ou 6 uo uu.
}8] Moloua iolzcovolo ohjollu translate() iohIi iolIauovou lahuIlu a ohsal iolzco ios nI
ioasIiujo. To znamon, zo naliauI vsoclny vyslyly lIIcu z iolIauovo lahuIly ouovIuajIcImI
lounolamI. V lomlo iIau so MARK ,ioIozI na MORK.
AIo co lo m soIocnolo s iosonIm aIIamolIclycl luanol Jal so ulzo za clvIIII, vsoclno.
>>> characters = tuple(ord(c) for c in 'SMEDONRY') }1]
>>> characters
(83, 77, 69, 68, 79, 78, 82, 89)
>>> guess = tuple(ord(c) for c in '91570682') }2]
>>> guess
(57, 49, 53, 55, 48, 54, 56, 50)
>>> translation_table = dict(zip(characters, guess)) }8]
>>> translation_table
{68: 55, 69: 53, 77: 49, 78: 54, 79: 48, 82: 56, 83: 57, 89: 50}
>>> 'SEND + MORE == MONEY'.translate(translation_table) }4]
'9567 + 1085 == 10652'
}1] PiosliounIclvIm gonoiloiovolo vyiazu io lazuy znal iolzco iyclIo vyoclomo lounolu ouovI-
uajIcIlo hajlu. Ohsal iomnno characters jo iIlIauom ohsalu iomnno sorted_characters
z Iunlco alphametics.solve().
}2] PomocI uaIsIlo gonoiloiovolo vyiazu iyclIo vyocIlmo lounoly hajlu ioiozonlujIcIcl laz-
uou cIsIIcI iolzco. VysIouol v iomnno guess (lj. oulau) m ouohu viconou IunlcI iter-
tools.permutations() vIz Iunlco alphametics.solve()
}8] PiolIauov lahuIla so gonoiujo zIovnIm osIounoslI characters a guess uoliomauy
a ouzIlIm vysIouno osIounoslI uvojIc io vyhuuovnI sIovnIlu. Piosn lolIo uI Iunlco
alphametics.solve() uvnIli cylIu for.
}4] Nalonoc iolIauovou lahuIlu ioumo molou translate() uvounIlo iolzco luanly.
TIm so lazuy znal iolzco ioIozI na ouovIuajIcI cIsIIcI (ouIo Ismon v characters a cIsIIc
v guess). VysIoulom jo Ialny yllonovsly vyiaz v iolzcovo ouoh.
To jo uocoIa oIollnI. AIo co muzomo uIal s iolzcom, lloiy slouou oloInoslI zaclycujo Ialny yllo-
novsly vyiaz
8.8. Novy zusoh iavy iolzco
187
8.u. VylounocovnI IIhovoInycl iolzcu zaclycujIcIcl yllonovslo vyiazy
TolIo jo osIounI lousol slIuanly (noho sIso osIounI lousol iogiamu io iosonI luanly). Po vsocl
lcl oIollnIcl manIuIacIcl s iolzcI jsmo sloncIII u iolzco, jalo jo '9567 + 1085 == 10652'. AIo jo
lo jon iolzoc. A l comu jo nm iolzoc uohiy Soznamlo so s eval(), s unIvoizInIm yllonovslym
vylounocovacIm nsliojom.
>>> eval('1 + 1 == 2')
True
>>> eval('1 + 1 == 3')
False
>>> eval('9567 + 1085 == 10652')
True
AIo oclojlo! Jo lolo josl vIc! Iunlco eval() so noomozujo jon na hooIoovslo vyiazy. ZvIuno Iovony
yllonovsly vyiaz a viacI Iovony ualovy ly.
>>> eval('"A" + "B"')
'AB'
>>> eval('"MARK".translate({65: 79})')
'MORK'
>>> eval('"AAAAA".count("A")')
5
>>> eval('["*"] * 5')
['*', '*', '*', '*', '*']
AIo oclojlo, lo josl nonI vso!
>>> x = 5
>>> eval("x * 5") }1]
25
>>> eval("pow(x, 2)") }2]
25
>>> import math
>>> eval("math.sqrt(x)") }8]
2.2360679774997898
}1] Vyiaz iouvany IunlcI eval() so muzo oulazoval na gIohInI iomnno uoIInovano vn eval().
A oluu so voI uvnIli Iunlco, muzo so oulazoval I na IolInI iomnno.
}2] A Iunlco.
}8] A mouuIy.
8.u. VylounocovnI IIhovoInycl iolzcu
zaclycujIcIcl yllonovslo vyiazy
188
Hoj, zaslav na mInullu.
>>> import subprocess
>>> eval("subprocess.getoutput('ls ~')") }1]
'Desktop Library Pictures \
Documents Movies Public \
Music Sites'
>>> eval("subprocess.getoutput('rm /some/random/file')") }2]
}1] MouuI subprocess vm uovoII suslIl IIhovoIny sloIIovsly iIlaz a zIslal vysIouol v ouoh
yllonovslolo iolzco.
}2] Jonzo IIhovoIny sloIIovsly iIlaz muzo vosl l livaIym nsIoulum.
A jo lo uolonco josl loisI, iolozo oxIslujo gIohInI Iunlco __import__(), lloi iohIi jmono mouuIu
v iolzcovo ouoh, Imoilujo lo a viacI na nj oulaz. Kuyz lo zlomhInujomo so sIIou Iunlco eval(),
muzomo vylvoiIl vyiaz, lloiy smazo vsoclny vaso souhoiy:
>>> eval("__import__('subprocess').getoutput('rm /some/random/file')") }1]
}1] A lou sI iouslavlo vyslu iIlazu 'rm -rf ~'. Vo slulocnoslI zuny vyslu nouvIuIlo.
AIo nouvIuIlo uz anI svo souhoiy.
(lj. eval() jo zIy, salny, zIovslny). Tou zIou slinlou jo vylounocovnI IIhovoInycl vyiazu oclzo-
jIcIcl z nouuviylounycl zuioju. IunlcI eval() hyslo mII ouzIval vyliaun io vslu z uuviylou-
nycl zuioju. PiohIom jo v lom, jal uicIl, co jo ,uuviylouny zuioj. AIo nco vIm uicIl. IicIl hyslo
NFMFLI vzIl lonlo iogiam io iosonI aIIamolIl a zvoiojnIl joj na Inloinolu v ouoh maIo vohovslo
sIuzhy. A nomysIolo sI: ,Vzuyl la Iunlco uI loIIl iolzcovycl ooiacI, noz so vuhoc uoslano l vylou-
noconI. Nouovouu sI iouslavIl, jal hy lolo nluo molI znouzIl. Nluo pri|do na lo, jal ioasoval n-
jaly nohozocny lou vsomI lmI iolzcovymI manIuIacomI (uz so slaIy uIvnjsI vcI). A al uz muzolo
svomu soivoiu osIal jon oIIhol na iozIouconou.
AIo oxIslujo vuhoc njaly zusoh, jal vyiazy vylounolIl hozocn Lzo njal eval() umIslIl na IslovIs-
l, ouluu nom iIslu l oloInImu svlu a nomuzo mu slouIl Hmm, ano I no.
>>> x = 5
>>> eval("x * 5", {}, {}) }1]
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "<string>", line 1, in <module>
8.u. VylounocovnI IIhovoInycl iolzcu
zaclycujIcIcl yllonovslo vyiazy
eval() is EVIL
189
NameError: name 'x' is not defined
>>> eval("x * 5", {"x": x}, {}) }2]
25
>>> import math
>>> eval("math.sqrt(x)", {"x": x}, {}) }8]
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "<string>", line 1, in <module>
NameError: name 'math' is not defined
}1] Diuly a liolI aiamoli iouvany IunlcI eval() so clovajI jalo gIohInI a IolInI iosloi jmon.
Tylo iosloiy so ouzIvajI iI vylounocovnI vyiazu. V lomlo iIau jsou oha izuno. To
znamon, zo iI vylounocovnI iolzco "x * 5" nooxIslujo zuny oulaz na x anI v gIohInIm
anI v IolInIm iosloiu jmon. Talzo eval() vyvoI vyjImlu.
}2] Do gIohInIlo iosloiu jmon muzomo vIozIl vyhi uicIlycl lounol lIm, zo jo jounolIIv vyjmo-
nujomo. Blom vylounocovnI al huuou l uIsozIcI lylo a jon lylo iomnno.
}8] AcloIIv jslo ziovna ImoilovaII mouuI mall, novIozIII jsmo joj uo iosloiu jmon, lloiy iou-
vmo IunlcI eval(). V uusIoulu lolo vylounoconI soIlaIo.
Ty jo. Tal lo hyIo jounouuclo. Tou sI uuIm vohovslou sIuzhu io iosonI aIIamolIl!
>>> eval("pow(5, 2)", {}, {}) }1]
25
>>> eval("__import__('math').sqrt(5)", {}, {}) }2]
2.2360679774997898
}1] AcloIIv jslo v ioII gIohInIlo a IolInIlo iosloiu jmon iouaII izuno sIovnIly, hlom
vylounocovnI jsou slIo uosluno vsoclny zahuuovano yllonovslo Iunlco. Talzo pow(5, 2)
Iungujo, iolozo 5 a 2 jsou IIloiIy a pow() jo zahuuovan Iunlco.
}2] NanoslslI (a oluu nolusIlo, ioc nanoslslI, cllo uI) jo Iunlco __import__() lalo zahuuova-
nou IunlcI, lalzo lalo Iungujo.
Ano, lo znamon, zo muzolo oiu uIal ouoino vcI, I luyz jslo iI voInI eval() io gIohInI a IolInI
iosloi jmon oxIIcIln naslavIII izuno sIovnIly:
>>> eval("__import__('subprocess').getoutput('rm /some/random/file')", {}, {})
A uo icIc! Jsom iu, zo jsom z mouuIu aIlamolIcs nouuIaI vohovou sIuzhu. Jo zuo vuhoc n6juLy zu-
soh, lloiym hyclom molII eval() ouzIval hozocn Ano I no.
8.u. VylounocovnI IIhovoInycl iolzcu
zaclycujIcIcl yllonovslo vyiazy
190
>>> eval("__import__('math').sqrt(5)",
... {"__builtins__":None}, {}) }1]
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "<string>", line 1, in <module>
NameError: name '__import__' is not defined
>>> eval("__import__('subprocess').getoutput('rm -rf /')",
... {"__builtins__":None}, {}) }2]
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "<string>", line 1, in <module>
NameError: name '__import__' is not defined
}1] Ahyslo molII vyiazy z nouuviylounycl zuioju vylounocoval hozocn, musIlo uoIInoval
sIovnIl io gIohInI iosloi jmon, lloiy maujo "__builtins__" na None, louy na yllonov-
slou lounolu nuII (nIc, nII). ,Zahuuovano Iunlco jsou lolIz vnIlin uzaviony uo souuomo-
uuIu nazvanolo "__builtins__". Tonlo souuomouuI (lj. mnozIna zahuuovanycl IunlcI) jo
vylounocovanym vyiazum ziIslunn oluu joj oxIIcIln noolIacIlo.
}2] IjIsllo so, zo iouoIInovvlo __builtins__. Zuno __builtin__, __built-ins__ noho njalou
ouohnou vaiIanlu. Ono hy lo IungovaIo hoz iohIomu, aIo vyslavIIo hy vs lo iIzIlu lalaslioIy.
TallIo uz jo eval() hozocny Nu, ano I no.
>>> eval("2 ** 2147483647",
... {"__builtins__":None}, {}) }1]
}1] I hoz iIsluu l __builtins__ muzolo slIo suslIl lol lyu oumIlnulI sIuzhy. Poluu so naiIlIau
olusIlo o umocnnI 2 na 2147483647, vyuzIlI iocosoiu vasolo soivoiu slouno na 1uu na l-
n uIoulou uohu. (Poluu lo zlousIlo v InloiallIvnIm sloIIu, muzolo lo ioiusIl, luyz nloIIlil
slIslnolo Ctrl-C.) ToclnIcly vzalo, lonlo vyiaz nuLonet vr0| njalou lounolu, aIo uo lo uohy huuo
soivoi uIal souslu zhylocno ico.
Talzo nalonoc je mo2n6 hozocn vylounocoval yllonovslo vyiazy z nouuviylounycl zuioju.
Vyzauujo lo aIo uicIlou uoIInIcI ojmu ,hozocn, lloi v ioInom zIvol nonI zas lal uzIlocn. Dohio
jo, luyz sI liajolo nluo ohIIz. Dohio laly jo, luyz iIuslIlo jon uuviylouny vslu. ColoIIv jInolo
znamon, zo sI loIouujolo o maIoi.
8.1u. Sojmo lo vsoclno uoliomauy
RolaIluIaco: Tonlo iogiam iosI aIIamolIclo luanly liuhou sIIou, lj. vycoivajIcIm lIounIm vsocl
moznycl iosonI. Piogiam za lIm coIom...
8.1u. Sojmo lo vsoclno uoliomauy
191
1. Nulozno v zudn vsochnu psmonu voInIm Iunlco re.findall().
2. Nulozno vsochnu XSRW\Sx\t psmonu hdunky s vyuzitm mnnziny u funkco set().
8. Zknntrnlu|o prkuzom assert, zdu so v zudn novyskytu|o vco noz 10 |odinocnych znuk (coz
hy znamonaIo, zo luanla jo noiosIloIn).
4. Provodo znuky nu |o|ich ASCII hndnnty pnuzitm nb|oktu gonortnru.
. Pnct vsochnu mnzn roson omocI Iunlco itertools.permutations().
6. Provd kuzd mnzn roson nu pythnnnvsky vyruz omocI molouy iolzcovolo ohjollu tran-
slate().
7. Tostu|o kuzd mnzn roson vyhndnnconm pythnnnvskhn vyruzu voInIm Iunlco eval().
8. ViacI ivnI iosonI, lloio so vylounolI jalo True.
.lo vso na oulycl 14 iucIcl louu.
8.11. Piocllo sI
- itertools mndulo
(lll:lluocs.yllon.oigly8llIIhiaiylIloilooIs.llmI)
- itertools - Itorutnr functinns fnr officiont lnnping
(vvv.uougloIImann.comlPyMOTWlIloilooIsl)
- Pndvo|to so nu prodnsku Ruymnndu Hottingoru ,Fusy AI with Pythnn" na PyCon 2uuu
(vvv.uougloIImann.comlPyMOTWlIloilooIsl)
- Rocipo 71: Alphumotics snlvor, uvounI iogiam Raymonua HollIngoia io Pyllon 2.
(lll:llcouo.aclIvoslalo.comliocIosl7661l)
- Duls rocopty nd Ruymnndu Hottingoru v AclIvoSlalo Couo ioosIloiy (aiclIv louu).
(lll:llcouo.aclIvoslalo.comliocIoslusoisl178128l)
- Alphumotics nn Wikipodiu
(lll:llon.vIlIouIa.oiglvIlIlVoihaI_aiIllmolIc)
- Alphumotics Indox, vcoln mnnhu zudn a gonortnru vusich vlustnch zudn.
(vvv.llcs-coIIIns.comlliumanlaIlamollInuox.sllmI)
Mnololil ulujI Raymonuu HollIngoiovI za soulIas s iavou IIconco jolo louu, ahycl lo molI
iosal io Pyllon 8 a ouzIl jalo zlIau lolo laIloIy.
8.11. Piocllo sI
192
193
9. Unit Testing
u. KaIloIa
Certitude is not the test of certainty. We have been
cocksure of many things that were not so.
(PocIl jIsloly nonI miIllom jIsloly. ByII jsmo sI
slIoovn jIslI mnola vcmI, lloio lalovo nohyIy.)
OIIvoi WonuoII HoImos, Ji.
194
9. Unit Testing 193
u.1. (No)onoimo so 195
u.2. JouIn olzla 196
u.8. ,Zaslav a zacnI loiol 202
u.4. VIco zaslvol, vIco oln 206
u.. A josl jouna vc... 209
u.6. SymoliIo, lloi olsI 211
u.7. VIco salnycl vsluu 215
Ohsal laIloIy
195
u.1. (No)onoimo so
Ta unosnI mIuoz. Jsou lal zlazonI lmI iyclIymI ocIlacI a mounImI ,uynamIclymI jazyly. RyclIo
nasal, al uoual a IauIl az nalonoc (joslII vuhoc). Za mycl casu jsmo uouizovaII uIscIIInu. RIlm
uIscIIInu! MusoII jsmo sl iogiamy rutn6, na ur a cl jo uo ocIlaco na d6rnyth :||tth. A ono
so nm lo Io! A cozo Zo jo lon nauIs angIIcly Buulo iuI, zo nonI v iuslIn. MnozI z vs anI novI,
jal iocIsl jounolIIv Ismonla azhuly. No uohi, lioclu zvznIm. D so lo ioIozIl jalo ,loslovnI
jounolol noho ,jounollovo loslovnI. Josl so l lomu uoslanomo.
V lolo laIloIo sI naIsomo a ouIauImo i omocnycl IunlcI io lonvoizI na a z iImslycl cIsoI. Zu-
soh lvoihy a oviovnI iImslycl cIsoI jsmo sI ulzaII v oulaIloIo PiIauov sluuIo: RImsl cIsIa. Tou
sI oouslouImo a zvzImo, loIIl hy uaIo ico iozsIiIl uvounI lou na ohousmino omocno Iunlco.
PiavIuIa io iImsl cIsIa vouIa l iau zajImavycl osliolu:
1. LxIslujo jon jouon sivny zusoh vyjuionI lonliolnIlo cIsIa iImslymI cIsIIcomI.
2. PIalI lalo oal. Poluu jo iolzoc znalu Ialnym iImslym cIsIom, ioiozonlujo jon jouno mozno
cIsIo (lo znamon, zo iolzoc muzo hyl Inloiiolovn jon jounIm zusohom).
8. RImslymI cIsIy Izo vyjuiIl jon omozony iozsal cIsoI, lonlioln ou 1 uo 3999. RImano ouzIva-
II nloIIl zusohu vyjuionI vlsIcl cIsoI. Tal naiIlIau iulom nau iImslym cIsIom vyjau-
iovaII, zo jolo cIsoIn lounola musI hyl vynsohon lIsIcom. Pio coIy lolo laIloIy huuomo
uvazoval jon iImsl cIsIa ou 1 uo 3999.
4. NooxIslujo zusoh, jal iImslymI cIsIIcomI vyjuiIl nuIu.
. NooxIslujo zusoh, jal iImslymI cIsIIcomI vyjuiIl zoin cIsIa.
6. NooxIslujo zusoh, jal iImslymI cIsIIcomI vyjuiIl zIomly noho nocoIocIsoIno lounoly.
Zacnmo maoval, co hy lalovy mouuI ioman.y mI uIal. Buuo ohsaloval uv lIavnI Iunlco,
to_roman() (na iImslo cIsIo) a from_roman() (z iImslolo cIsIa). Iunlco to_roman() hy mIa iovzIl
coIo cIsIo v InloivaIu ou 1 uo 3999 a vilIl jolo ioiozonlacI iImslymI cIsIIcomI jalo iolzoc...
Hnou lauy so zaslavImo. Tou uuImo nco lioslu noocolvanolo. NaIsomo sI loslovacI iIlIau, lloiy
lonlioIujo, zua Iunlco to_roman() uI lo, co o nI clcomo. Clolo uohio. Juomo sl lou, lloiy loslujo
jIny lou, lloiy jsmo josl nonasaII.
RIl so lomu vyvoj Izeny |e:|y /|e:|-drven deveomen|) noho TDD. (V angIIclo IIloialuio sI oliI na za-
vunI a ouzIvnI zlialol.) DvojIco iovounIcl IunlcI to_roman() a ozujI from_roman() muzo
hyl nasna a loslovna jalo jedno|Lu (unIl), ouuIon ou jalololoIIv vlsIlo iogiamu, lloiy Iunlco
Imoilujo. V Pyllonu najuomo imoc (Iiamovoil) io unIl loslIng (louy loslovnI jounolol), lloiy m
ouohu iIloun nazvanolo mouuIu unittest.
InIl loslIng (loslovnI jounolol) iouslavujo uuIozIlou soucsl coIlovo vyvojovo slialogIo zaIozono
na loslovnI. Poluu losly jounolol Isolo, jo uuIozIlo, ahyslo jo nasaII hizy a ahyslo jo uuizovaII
v zvIsIoslI na zmncl louu a ozauavlu. MnozI IIuo so iImIouvajI za lo, ahy so losly saIy uiIvo
u.1. (No)onoimo so
Ka.
196
noz lou, lloiy majI losloval. V lolo laIloIo sI lalovy iIslu iouvouomo. AIo losly jounolol majI svo
vylouy nozvIsIo na lom, luy jo naIsolo.
- NasnI jounollovycl loslu (I lallo so lo u iolIual) josl iou nasnIm louu vs coInym
zusohom uonulI uiosnIl svo ozauavly
- PiI vIaslnIm sanI louu vs al jounollovo losly hizuI iou sanIm nauhylocnycl vcI. JalmI-
Io vsoclny losly iojuou, uoslII jslo Ino IunlcnoslI.
- PiI iovunI ioIalloiIzaco louu vm losly jounolol omolou iolzal, zo so nov voizo clov
slojnym zusohom jalo la slai.
- PiI uizh louu vm oxIslonco loslu omuzo liyl zua (v oiIgInIo so mIuvI o lo cslI lIa, luo zua
zlicojI svo sIusno jmono) v sIluacI, luy na vs nluo iIIolI a ivo, zo vaso osIounI zmny olazIIy
jojIcl uvounI lou. (,AIo une, aIo luyz jsom zmny zvoiojovaI, vsoclny unIl losly iosIy...)
- Poluu Isomo lou v lymu, al oxIslonco soIocno sauy loslu uiamalIcly snIzujo moznosl, zo
hy vs lou zusohII noIunlcnosl louu nlolo jInolo. JojIcl losly jounolol lolIz muzolo suslIl
jalo ivnI. (TonlIo uiul zvouu v sanI louu uz jsom zazII. Tym sI zaunI iozuII, lazuy sI
iovozmo socIIIlaco svolo loIu, naIso io nj jounollovo losly a al jo u l uIsozIcI oslal-
nIm cIonum lymu. PiI lalovom osluu nIluo nozahIouuI lal uaIolo, zo hy jIm vyvIjony lou
nosoIuiacovaI s vysIouly oslalnIcl.)
u.2. JouIn olzla
ToslovacI iIau (losl caso) ouovIu na jouInou olzlu,
lloi so loslovanolo louu lyl. ToslovacI iIau hy mI
hyl scloon...
- ...hzol zcoIa samoslaln, hoz jalololoIIv IIuslolo zsalu. InIl loslIng (loslovnI jounolol)
souvIsI s aulomalIzacI.
- ...sm iozlounoul o lom, zua loslovan Iunlco iosIa noho soIlaIa hoz nulnoslI osuzovnI
vysIoulu cIovlom.
- ...hzol IzoIovan, ouuIon ou jalyclloIIv jInycl loslovacIcl iIauu (uolonco I luyz loslujI
slojnou IunlcI). Kazuy loslovacI iIau jo osliov.
S olIouom na uvouono iouolIauy zacnmo huuoval loslovacI iIau io ivnI ozauavol:
Iunlco to_roman() hy mIa viacol ioiozonlacI iImslolo cIsIa io vsoclna coI cIsIa
v InloivaIu 1 az 3999.
V ivnIm olamzIlu nonI ziojmo, jal nsIouujIcI lou uI... no vIasln toLov. DoIInujo liIuu, lloi
nom zunou molouu __init__(). TiIua sIco m0 njalou molouu, aIo la so nIluy novoI. CoIy sliIl
ohsalujo hIol __main__, aIo nonajuomo v nm oulaz anI na liIuu, anI na jojI molouu. AIo on oiavuu
nco uI. Za lo iucIm.
u.2. JouIn olzla
Kad test je ostrov.
197
import roman1
import unittest
class KnownValues(unittest.TestCase): }1]
known_values = ( (1, 'I'),
(2, 'II'),
(3, 'III'),
(4, 'IV'),
(5, 'V'),
(6, 'VI'),
(7, 'VII'),
(8, 'VIII'),
(9, 'IX'),
(10, 'X'),
(50, 'L'),
(100, 'C'),
(500, 'D'),
(1000, 'M'),
(31, 'XXXI'),
(148, 'CXLVIII'),
(294, 'CCXCIV'),
(312, 'CCCXII'),
(421, 'CDXXI'),
(528, 'DXXVIII'),
(621, 'DCXXI'),
(782, 'DCCLXXXII'),
(870, 'DCCCLXX'),
(941, 'CMXLI'),
(1043, 'MXLIII'),
(1110, 'MCX'),
(1226, 'MCCXXVI'),
(1301, 'MCCCI'),
(1485, 'MCDLXXXV'),
(1509, 'MDIX'),
(1607, 'MDCVII'),
(1754, 'MDCCLIV'),
(1832, 'MDCCCXXXII'),
(1993, 'MCMXCIII'),
(2074, 'MMLXXIV'),
(2152, 'MMCLII'),
(2212, 'MMCCXII'),
(2343, 'MMCCCXLIII'),
(2499, 'MMCDXCIX'),
u.2. JouIn olzla
198
(2574, 'MMDLXXIV'),
(2646, 'MMDCXLVI'),
(2723, 'MMDCCXXIII'),
(2892, 'MMDCCCXCII'),
(2975, 'MMCMLXXV'),
(3051, 'MMMLI'),
(3185, 'MMMCLXXXV'),
(3250, 'MMMCCL'),
(3313, 'MMMCCCXIII'),
(3408, 'MMMCDVIII'),
(3501, 'MMMDI'),
(3610, 'MMMDCX'),
(3743, 'MMMDCCXLIII'),
(3844, 'MMMDCCCXLIV'),
(3888, 'MMMDCCCLXXXVIII'),
(3940, 'MMMCMXL'),
(3999, 'MMMCMXCIX')) }2]
def test_to_roman_known_values(self): }8]
'''to_roman should give known result with known input'''
for integer, numeral in self.known_values:
result = roman1.to_roman(integer) }4]
self.assertEqual(numeral, result) }]
if __name__ == '__main__':
unittest.main()
}1] Kuyz clcomo nasal njaly loslovacI iIau (losl caso), musImo nojuiIvo vylvoiIl liIuu ouvo-
zonou ou liIuy TestCase z mouuIu unittest. Ivouon liIua nm oslylujo iauu uzIlocnycl
molou, lloio muzomo v nasom loslovacIm iIau vyuzIl io loslovnI socIIIclycl oumInol.
}2] TolIo jo soznam uvojIc s coIym cIsIom a s iImslym cIsIom, lloio jsom oviII iucn. Ohsalujo
uosol nojmonsIcl cIsoI, nojvlsI cIsIo, lazuo cIsIo, lloio so vyjauiujo jounoznalovym iImslym
cIsIom, a nlounou sauu uaIsIcl Ialnycl cIsoI. NomusImo losloval lazuy mozny vslu, aIo
mII hyclom so olusIl olosloval vsoclny ziojmo lianIcnI iIauy.
}8] Pio lazuy jounolIIvy losl jo vylvoiona jolo vIaslnI moloua. Moloua loslu nom zuno aiamoliy,
noviacI zunou lounolu a jojI jmono musI zacInal clyimI Ismony test. Poluu loslovacI molo-
ua sloncI noimIn, hoz vyvoInI vyjImly, olIumo losl za ssny. Poluu moloua vyvoI
vyjImlu, ovazujomo lo za soIlnI loslu.
}4] Tauy voImo slulocnou IunlcI to_roman(). (Tu IunlcI jsmo zalIm nonasaII, aIo jalmIIo jI
jounou naIsomo, lonlo iuol jI zavoI.) VsImnlo sI, zo jsmo v lomlo olamzIlu io IunlcI
to_roman() uoIInovaII aIIlacnI iogiamovo iozlianI (API). MusI iohIial coIo cIsIo (iovu-
no cIsIo) a viacI iolzoc (ioiozonlacI iImslolo cIsIa). Poluu hy iozlianI Iunlco hyIo jIno, losl
hy soIlaI. VsImnlo sI lalo, zo iI voInI to_roman() zunou vyjImlu noouclylvmo. Jo lo
u.2. JouIn olzla
199
zmino. Iunlco to_roman() hy iI voInI s Ialnym vsluom zunou vyjImlu vyvoIal nomIa
a uvouono vslunI lounoly jsou vsoclny Ialno. Poluu to_roman() vyvoI vyjImlu, huuo so lo
ovazoval za soIlnI lololo loslu.
}] Dojmo lomu, zo Iunlco to_roman() hyIa loiolln uoIInovna, loiolln voIna, ssn sloncIIa
a vilIIa vysIouol. Pal nm jalo osIounI liol zhyv zlonlioIoval, zua vilIIa :r0vnou lounolu.
Juo o ohocn ouzIvany uolaz. Ko lonlioIo, zua so uv lounoly slouujI, oslylujo liIua TestCase
molouu assertEqual. Poluu vysIouol (iosuIl) vicony IunlcI to_roman() noouovIu ocolvano
znmo lounol (numoiaI), vyvoI assertEqual vyjImlu a losl soIzo. Poluu so ly uv lounoly
slouujI, nouuI assertEqual nIc. Poluu vsoclny lounoly vicono IunlcI to_roman() ouovI-
uajI ocolvanym lounolm, assoilLquaI nIluy vyjImlu novyvoI, lalzo moloua test_to_roman_
known_values nalonoc noimIn sloncI. To znamon, zo Iunlco to_roman() loslom iosIa.
JalmIIo mmo vylvoion loslovacI iIau, zacnomo sl
IunlcI to_roman(). NojuiIvo jI naliauImo izunou IunlcI
a oviImo sI, zo losl soIlv. Poluu hy losl iosoI, anIz jsmo
nasaII njaly lou, al hy losly ns lou vuhoc noloslovaIy!
InIl loslIng jo jalo lanoc: losly vouou, lou nsIouujo. Na-
Islo losl, lloiy soIzo, a al iogiamujlo, uoluu noiojuo.
# roman1.py
def to_roman(n):
'''convert integer to Roman numeral'''
pass }1]
}1] V lolo IzI hyclom iuI uoIInovaII iozlianI Iunlco to_roman(), aIo noclcomo zalIm sl zuny
lou. (Ns losl musI nojuiIvo soIlal.) Pizuno IunlcnoslI uoslnomo ouzIlIm yllonovslolo
vyliazonolo sIova pass, lloio uI uosIova nIc.
SuslnI loslu zajIslImo iovouonIm romantest1.py z iIlazovolo iulu. Poluu joj zavoImo s voIhou
-v, uoslnomo ouiohnjsIlo vysluu, lalzo iosn uvIuImo, co so iI hlu lazuolo loslovacIlo
iIauu ujo. S lioclou slslI hy vs vyslu mI vyaual njal lallo:
you@localhost:~/diveintopython3/examples$ python3 romantest1.py -v
test_to_roman_known_values (__main__.KnownValues) }1]
to_roman should give known result with known input ... FAIL }2]
======================================================================
FAIL: to_roman should give known result with known input
----------------------------------------------------------------------
Traceback (most recent call last):
File "romantest1.py", line 73, in test_to_roman_known_values
self.assertEqual(numeral, result)
u.2. JouIn olzla
Napite test, kter sele, a pak
programujte, dokud neprojde.
200
AssertionError: 'I' != None }8]
----------------------------------------------------------------------
Ran 1 test in 0.016s }4]
FAILED (failures=1) }]
}1] Kuyz sliIl suslImo, suslI so Iunlco unittest.main(), lloi zajIslI iovouonI lazuolo los-
lovacIlo iIauu. Kazuy loslovacI iIau jo molouou liIuy z romantest1.py. I loslovacIcl liIu
so novyzauujo njal zvIslnI oiganIzaco. Kazu z nIcl muzo ohsaloval jouInou molouu, noho
muzomo mIl jounu liIuu, lloi ohsalujo mnozslvI loslovacIcl molou. JouInym ozauavlom
jo lo, zo lazu loslovacI liIua musI uuIl z liIuy unittest.TestCase.
}2] Pio lazuy loslovacI iIau mouuI unittest vylIslno docstring molouy a lo, zua losl iosoI
(ass) noho soIlaI (IaII). Tonlo losl ouIo ocolvnI soIlaI.
}8] Pio lazuy loslovacI iIau, lloiy soIlaI, zohiazI unittest liasovacI InIoimacI, lloi iosn ulazu-
jo, co so slaIo. V lomlo iIau vyvoIaIa moloua assertEqual() vyjImlu AssertionError, iolozo
so ocolvaIo, zo Iunlco to_roman(1) vilI 'I', aIo novilIIa. (Piolozo jsmo v nI oxIIcIln nouvouII
iIlaz return, vilIIa Iunlco lounolu None, coz jo yllonovsly olvIvaIonl lounoly nuII.)
}4] Po uolaIInIcl vyIsocl lazuolo loslu zohiazI unIllosl soulinn, loIIl loslu so iovuIo
a jal uIoulo lo livaIo.
}] ToslovacI hl coIlov soIlaI, iolozo mInImIn jouon losl noiosoI. Poluu loslovacI iIau
noiojuo, iozIIsujo unittest mozI soIlnIm (IaIIuio) a clyhou (oiioi). SoIlnI (IaIIuio) jo
uusIoulom voInI molouy assertXYZ, jalo jo naiIlIau assertEqual noho assertRaises,
lloi soIlaIa, iolozo noIalI iouosan oumInla noho nohyIa vyvoIna ocolvan vyjImla.
Za clyhu (oiioi) so ovazujo jalyloIIv jIny uiul vyjImly, lloi vznIlIa uvnIli loslovano louu
noho v louu loslovacIlo iIauu.
A lou uz muzomo lonocn nasal IunlcI to_roman().
roman_numeral_map = (('M', 1000),
('CM', 900),
('D', 500),
('CD', 400),
('C', 100),
('XC', 90),
('L', 50),
('XL', 40),
('X', 10),
('IX', 9),
('V', 5),
('IV', 4),
('I', 1) ) }1]
u.2. JouIn olzla
201
def to_roman(n):
'''convert integer to Roman numeral'''
result = ''
for numeral, integer in roman_numeral_map:
while n >= integer: }2]
result += numeral
n -= integer
return result
}1] roman_numeral_map jo n-lIco n-lIc, lloio uoIInujI liI vcI: znalovou ioiozonlacI nojzlIaunj-
sIcl iImslycl cIsoI, oiauI iImslycl cIsoI (soslun ou M az o I), lounolu lazuolo iImslolo
cIsIa. Kazu vnIlinI n-lIco jo uvojIcI (msk slo, hodnota). Nojsou zuo jon jounoznalov
iImsl cIsIa. Jsou zuo uoIInovna I uvojznalov cIsIa jalo CM (,o jouno slo mon noz jouon
lIsIc). TIm so lou Iunlco to_roman() zjounouusI.
}2] Zuo jo lo mIslo, luo so holal ualov sliulluia roman_numeral_map uIalnI, iolozo uIly nI l io-
aIIzacI ouocIlacIlo iavIuIa nooliohujomo zunou socIInI IogIlu. PiI iovouu na iImslo cIsIo
jounouuso ioclzImo sliulluiou roman_numeral_map a lIoumo nojvlsI coIocIsoInou lounolu,
lloi jo monsI noho iovna vsluu. JalmIIo jI naIoznomo, iIumo jojI ioiozonlacI iImslym cIsIom
na lonoc vysluu, ouoclomo ouovIuajIcI coIocIsoInou lounolu ou vsluu, namyuIImo, oIcl-
nomo, zoalujomo.
Poluu vm oiu nonI jasno, jal Iunlco to_roman() iacujo, iIuojlo na lonoc cylIu while voInI
Iunlco print():
while n >= integer:
result += numeral
n -= integer
print('subtracting {0} from input, adding {1} to output'.format(integer, numeral))
S IauIcImI iIlazy print() vyau vyslu lallo:
>>> import roman1
>>> roman1.to_roman(1424)
subtracting 1000 from input, adding M to output
subtracting 400 from input, adding CD to output
subtracting 10 from input, adding X to output
subtracting 10 from input, adding X to output
subtracting 4 from input, adding IV to output
'MCDXXIV'
Talzo so zu, zo Iunlco to_roman() iacujo iInojmonsIm v lomlo iucn zlousonom iIau. AIo io-
juo loslovacIm iIauom, lloiy jsmo nasaII
u.2. JouIn olzla
202
you@localhost:~/diveintopython3/examples$ python3 romantest1.py -v
test_to_roman_known_values (__main__.KnownValues)
to_roman should give known result with known input ... ok }1]
----------------------------------------------------------------------
Ran 1 test in 0.016s
OK
}1] Hui! Iunlco to_roman() iosIa loslovacIm iIauom nazvanym ,znmo lounoly. NonI sIco
vsoohsazny, aIo ioviII sclonoslI Iunlco coIou slIou vsluu, vcoln vsluu, lloio iouu-
lujI lazuo jounoznalovo iImslo cIsIo, nojvlsI mozny vslu (3999), a vsluu, lloiy iouulujo
nojuoIsI mozno iImslo cIsIo (3888). V lomlo olamzIlu uz muzomo uocoIa uuvioval lomu, zo
Iunlco iacujo io IIhovoInou sivnou vslunI lounolu, lloiou hyclom molII zaual.
,Sivny vslu Hmm. A co lallIo clyhny vslu
u.8. ,Zaslav a zacnI loiol
Ono aIo noslacI, luyz Iunlco usjI iI zaunI sivnolo
vsluu. MusImo olosloval lalo lo, zo iI clyhnom vsluu
uojuo l jojIcl soIlnI. AIo nomuzo jIl o jalyloIIv zusoh
soIlnI. Iunlco musI soIlal ocolvanym zusohom.
>>> import roman1
>>> roman1.to_roman(4000)
'MMMM'
>>> roman1.to_roman(5000)
'MMMMM'
>>> roman1.to_roman(9000) }1]
'MMMMMMMMM'
}1] TolIo uicIl nonI lo, co jsmo cllII. Vzuyl so uolonco nojoun anI o Ialno iImslo cIsIo! Kazuo
z lcllo cIsoI IozI vo slulocnoslI mImo iozsal iIjaloInycl vsluu, aIo Iunlco io n slojn
viacI IaIosno, vylonsliuovano lounoly. Poluu olIclu viacImo salno lounoly, jo lo vem
:u|n6. Poluu m iogiam soIlal, al jo mnolom IosI, luyz soIzo iyclIo a nalIas. Jal so iIl,
,zaslav a zacnI loiol. (Juo o iolIau angIIclo Iizo ,HaIl Anu Calcl IIio, lloi so iI icI
na iovnIcl hIIzlycl laiuvaiu vzlalujo l moclanIsmu voImI uohio ozoiovaloInolo iojo-
vu njalo noocolvano clyhy. VysvlIonI uvouu lolo lIsly so iuznI, ou slulocn louiIcIcl
iozlavonycl uillu IoiIlovo amlI iI uynamIclo ioaIIzacI Insliulco HALT, az o socIInI
u.8. ,Zaslav a zacnI loiol
Pythonovsk signalizace typu
zastav a zani hoet spov
ve vyvoln vjimky.
203
nouolumonlovano sliojovo Insliulco, lloio uvouou iocosoi uo loslovacIlo iozImu.) Pyllonov-
sl sIgnaIIzaco lyu ,zaslav a zacnI loiol socIv vo vyvoInI vyjImly.
MII hyslo sI oIozIl olzlu: ,Jal hyclom lo molII vyjuiIl Ioimou loslovaloInolo ozauavlu
Co luyhyclom zacaII njal lallo:
Poluu IunlcI to_roman() zaumo coIo cIsIo vlsI noz 3999, mIa hy vyvoIal vyjImlu
OutOfRangeError.
Jal hy vyauaI iIsIusny losl
class ToRomanBadInput(unittest.TestCase): }1]
def test_too_large(self): }2]
'''to_roman should fail with large input'''
self.assertRaises(roman2.OutOfRangeError, roman2.to_roman, 4000) }8]
}1] Pouohn jalo v iouclozIm loslovacIm iIau vylvoiImo liIuu, lloi uuI z unittest.TestCase.
Jouna liIua sIco muzo ohsaloval vIco noz jouon losl (jal sI ulzomo v lolo laIloIo ozujI), aIo
j jsom so iozlouI, zo vylvoiIm novou liIuu, iolozo lonlo losl uI nco jInolo noz lon mInuIy.
Vsoclny losly sivnycl vsluu huuomo uuizoval v jouno liIu a o vsoclny losly clyhnycl vsluu
so huuo slaial uiul liIua.
}2] VIaslnI losl, slojn jalo v iouclozIm loslovacIm iIau, m ouohu molouy liIuy. JojI jmono
zacIn Ismony test.
}8] TiIua unittest.TestCase oslylujo molouu assertRaises, lloi iohIi nsIouujIcI aigumonly:
ocolvanou vyjImlu, loslovanou IunlcI a aigumonly, lloio jI clcomo ioual. (Poluu loslovan
Iunlco ocolv vIco noz jouon aigumonl, iouojlo jo molou assertRaises vsoclny v uanom
oiauI. Ona uz so oslai o jojIcl iounI loslovano IunlcI.)
Vnujlo zvIslnI ozoinosl lomu osIounImu iulu louu. MIslo lolo, ahyclom voIaII to_roman(),
iImo a iucn zlonlioIovaII, zo vyvoIv lonliolnI vyjImlu (ohaIonIm uo hIolu try...except), moloua
assertRaises lo vso uuI za ns. MusImo jI jon iIcl, jalou vyjImlu ocolvmo (roman2.OutOfRangeError),
ioual IunlcI (to_roman()) a jojI aigumonly (4000). Moloua assertRaises so oslai o zavoInI to_roman()
a o lonlioIu lolo, zo vyvoIaIa vyjImlu roman2.OutOfRangeError.
Poznamonojmo lalo, zo IunlcI to_roman() iouvmo jalo aigumonl. NovoImo jI a anI noiouvmo
jojI jmono jalo iolzoc. ZmInII jsom so uz uiIvo o lom, jal jo sIlovno, zo v Pyllonu jo vso ohjollom
Talzo co so slano, luyz suslImo sauu loslu uoInnou o lonlo novy losl
you@localhost:~/diveintopython3/examples$ python3 romantest2.py -v
test_to_roman_known_values (__main__.KnownValues)
to_roman should give known result with known input ... ok
test_too_large (__main__.ToRomanBadInput)
u.8. ,Zaslav a zacnI loiol
204
to_roman should fail with large input ... ERROR }1]
======================================================================
ERROR: to_roman should fail with large input
----------------------------------------------------------------------
Traceback (most recent call last):
File "romantest2.py", line 78, in test_too_large
self.assertRaises(roman2.OutOfRangeError, roman2.to_roman, 4000)
AttributeError: 'module' object has no attribute 'OutOfRangeError' }2]
----------------------------------------------------------------------
Ran 2 tests in 0.000s
FAILED (errors=1)
}1] AsI jslo ocolvaII, zo uojuo l soIlnI (iolozo zalIm jsmo nonasaII zuny lou, ahy lo iosIo),
aIo... ono lo vo slulocnoslI ,nosoIlaIo (IaII). MIslo lolo uosIo l ,clyh (oiioi). Jo lo sIco jom-
ny, aIo uuIozIly iozuII. Jounollovy losl m vo slulocnoslI |I n0vru|ov6 hodno|y: iosoI (ass),
soIlaI (IaII) a clyha (oiioi). ,Pass (iosoI) samoziojm znamon, zo losl iosoI. Kou uI lo, co
jsmo ocolvaII. ,IaII (soIlaI) vyjauiujo lo, co uuIaI mInuIy losl (noz jsmo nasaII lou, uIly
lloiomu iosoI). Kou so iovouI, aIo vysIouol noouovIu lomu, co jsmo ocolvaII. ,Liioi
(clyha) so ohjovI, luyz lou anI sivn nouohlI.
}2] A ioc vIasln lou sivn noiohlI Vso so uozvImo z liasovacIlo lIsonI. Toslovany mouuI
vuhoc nouoIInujo vyjImlu zvanou OutOfRangeError (lj. lounola mImo Ialny iozsal). PiIo-
momo sI, zo uvouonou vyjImlu jsmo iouaII molou assertRaises(), iolozo iv lolIo
m hyl vyjImla, lloiou m Iunlco vyvoIal, luyz zaumo vslu mImo Ialny iozsal. AIo lalo
vyjImla vuhoc nooxIslujo, lalzo voInI molouy assertRaises() soIlaIo. Moloua nomIa vuhoc
sancI olosloval IunlcI to_roman(). Tal uaIolo so vuhoc nouoslaIa.
K vyiosonI zmInnolo iohIomu musImo v roman2.py uoInIl uoIInIcI vyjImly OutOfRangeError.
class OutOfRangeError(ValueError): }1]
pass }2]
}1] VyjImly majI ouohu liIu. Clyha ,mImo Ialny iozsal jo uiulom clyhy lounoly. Hounola
aigumonlu so naclzI mImo iIjaloIno mozo. Z lololo uuvouu vyjImla uuI zo zahuuovano vy-
jImly ValueError. NonI lo nozhyln nulno (molII hyclom iosl uuIl ou hzovo liIuy Excep-
tion, lj. ohocn vyjImla), aIo zu so lo hyl sivno.
}2] VyjImly samy o soh vo slulocnoslI nIc nouIajI, aIo oliohujolo nojmon jouon iuol louu,
ahyclom uoIInovaII liIuu. VoInI pass sIco nIc nouI, aIo jo lo iuol yllonovslolo louu,
lloiy zajIslI, zo liIua vznIlno.
Tou suslImo sauu loslu znovu.
u.8. ,Zaslav a zacnI loiol
205
you@localhost:~/diveintopython3/examples$ python3 romantest2.py -v
test_to_roman_known_values (__main__.KnownValues)
to_roman should give known result with known input ... ok
test_too_large (__main__.ToRomanBadInput)
to_roman should fail with large input ... FAIL }1]
======================================================================
FAIL: to_roman should fail with large input
----------------------------------------------------------------------
Traceback (most recent call last):
File "romantest2.py", line 78, in test_too_large
self.assertRaises(roman2.OutOfRangeError, roman2.to_roman, 4000)
AssertionError: OutOfRangeError not raised by to_roman }2]
----------------------------------------------------------------------
Ran 2 tests in 0.016s
FAILED (failures=1)
}1] Novy losl sIco slIo noiosoI, aIo uz lalo noviacI clyhu. MIslo lolo uosIo l soIlnI loslu. To jo
oliol! To znamon, zo voInI molouy assertRaises() lonlolil iosIo a imoc io loslovnI
jounolol (unIl losl Iiamovoil) slulocn loslovaI IunlcI to_roman().
}2] Iunlco to_roman() zalIm, samoziojm, novyvoIv iv uoIInovanou vyjImlu OutOfRangeError,
iolozo jsmo jI josl noiolII, zo lo m uIal. To jo aIo vyhoin ziva! Znamon lo, zo mmo Ialny
loslovacI iIau soIlv (IaIIs) iou nasnIm louu, lloiy zajIslI, zo iojuo.
Tou naIsomo lou, lloiy zajIslI, ahy Iunlco loslom iosIa.
def to_roman(n):
'''convert integer to Roman numeral'''
if n > 3999:
raise OutOfRangeError('number out of range (must be less than 4000)') }1]
result = ''
for numeral, integer in roman_numeral_map:
while n >= integer:
result += numeral
n -= integer
return result
}1] PiImocaio iosonI: Poluu jo uany vslu (n) vlsI noz 3999, vyvoIoj vyjImlu OutOfRangeError. Ton-
lo jounollovy losl nolonlioIujo, zua vyjImlu uoiovzI IIusly cIloIny iolzoc. MolII hyclom
nasal uaIsI losl, lloiy hy lo lonlioIovaI (aIo ozoi na iohIomy s InloinacIonaIIzacI; iolzco so
molou IIsIl v zvIsIoslI na jazylu uzIvaloIo a v zvIsIoslI na iosliouI).
u.8. ,Zaslav a zacnI loiol
206
Vouo iava l lomu, zo losl iojuo Pojumo lo zjIslIl.
you@localhost:~/diveintopython3/examples$ python3 romantest2.py -v
test_to_roman_known_values (__main__.KnownValues)
to_roman should give known result with known input ... ok
test_too_large (__main__.ToRomanBadInput)
to_roman should fail with large input ... ok }1]
----------------------------------------------------------------------
Ran 2 tests in 0.000s
OK
}1] Hui! Oha losly iosIy. Piolozo jsmo iacovaII o liocIcl (iohIlaII jsmo mozI loslovnIm a sanIm
louu), muzomo sI hyl jIslI, zo ly uva iuly louu, lloio jsmo iv nasaII, hyIy iIcInou lolo, zo so
vysIouol loslu zmnII z ,IaII (soIlaI) na ,ass (iosoI). Tonlo uiul (soho)uuviy sIco nohyI zauai-
mo, aIo hlom zIvola nasolo louu so josl vyIalI.
u.4. VIco zaslvol, vIco oln
SoIu s loslovnIm cIsoI, lloi jsou iIIIs voIl, hyclom mII losloval I cIsIa, lloi jsou iIIIs maI. Piosn jal
jsmo oznamonaII v nasIcl ozauavcIcl na Iunlcnosl, iImsl cIsIa nomolou vyjuiIl nuIu noho zoin cIsIa.
>>> import roman2
>>> roman2.to_roman(0)
''
>>> roman2.to_roman(-1)
''
Hmm, |ohe nonI uohio. PiIuojmo losly io lazuou z lcllo oumInol.
class ToRomanBadInput(unittest.TestCase):
def test_too_large(self):
'''to_roman should fail with large input'''
self.assertRaises(roman3.OutOfRangeError, roman3.to_roman, 4000) }1]
def test_zero(self):
'''to_roman should fail with 0 input'''
self.assertRaises(roman3.OutOfRangeError, roman3.to_roman, 0) }2]
def test_negative(self):
'''to_roman should fail with negative input'''
self.assertRaises(roman3.OutOfRangeError, roman3.to_roman, -1) }8]
u.4. VIco zaslvol, vIco oln
207
}1] Moloua test_too_large() so ou mInuIolo liolu nozmnIIa. PonoclaI jsom jI zuo, ahycl ul-
zaI, lam novy lou zaau.
}2] Mmo lu novy losl, molouu test_zero(). Jo lo slojno jalo u molouy test_too_large().
Molou assertRaises() z liIuy unittest.TestCase iIlmo, ahy zavoIaIa nasI IunlcI to_roman()
s aiamoliom 0 a zlonlioIovaIa, zua vyvoI iIsIusnou vyjImlu OutOfRangeError.
}8] Moloua test_negative() jo lomi sloun az na lo, zo IunlcI to_roman() iouv lounolu -1.
Poluu lloiyloIIv z lcllo novycl loslu nevyvo0 vyjImlu OutOfRangeError (iolozo Iunlco huu
vilI njalou slulocnou lounolu noho vyvoI njalou jInou vyjImlu), huuo so lo ovazoval
za soIlnI loslu.
Tou zlonlioIujmo, zo losly soIlvajI:
you@localhost:~/diveintopython3/examples$ python3 romantest3.py -v
test_to_roman_known_values (__main__.KnownValues)
to_roman should give known result with known input ... ok
test_negative (__main__.ToRomanBadInput)
to_roman should fail with negative input ... FAIL
test_too_large (__main__.ToRomanBadInput)
to_roman should fail with large input ... ok
test_zero (__main__.ToRomanBadInput)
to_roman should fail with 0 input ... FAIL
======================================================================
FAIL: to_roman should fail with negative input
----------------------------------------------------------------------
Traceback (most recent call last):
File "romantest3.py", line 86, in test_negative
self.assertRaises(roman3.OutOfRangeError, roman3.to_roman, -1)
AssertionError: OutOfRangeError not raised by to_roman
======================================================================
FAIL: to_roman should fail with 0 input
----------------------------------------------------------------------
Traceback (most recent call last):
File "romantest3.py", line 82, in test_zero
self.assertRaises(roman3.OutOfRangeError, roman3.to_roman, 0)
AssertionError: OutOfRangeError not raised by to_roman
----------------------------------------------------------------------
Ran 4 tests in 0.000s
FAILED (failures=2)
u.4. VIco zaslvol, vIco oln
208
Vyhoin. Oha losly ouIo ocolvnI soIlaIy. Tou so ionmo na sanI louu a uvIuImo, co muzomo
uIal, ahy losly iosIy.
def to_roman(n):
'''convert integer to Roman numeral'''
if not (0 < n < 4000): }1]
raise OutOfRangeError('number out of range (must be 1..3999)') }2]
result = ''
for numeral, integer in roman_numeral_map:
while n >= integer:
result += numeral
n -= integer
return result
}1] TolIo jo ln yllonovsl zlialla vIco oiovnnI najounou. Jo lo olvIvaIonlnI zIsu
if not ((0 < n) and (n < 4000)), aIo jo lo mnolom cIloInjsI. Tonlo iuol louu hy mI
zaclylIl vsluy, lloio jsou iIIIs voIlo, zoino noho nuIovo.
}2] Poluu oumInly zmnIlo, nozaomolo ouovIuajIcIm zusohom uiavIl I IIusly cIloIny iol-
zoc. RmcI unittest jo lo jouno. Poluu hy aIo vs lou vyvoIvaI nosivn osano vyjImly,
zlIzIIo hy so lIm iucnI IaunI.
MolI hycl vm ulzal coIou soiII nosouvIsojIcIcl iIlIauu, lloio ulazujI, zo zlialla umozujIcI nlo-
IIl oiovnnI najounou Iungujo. MIslo lolo aIo suslIm losly jounolol a uolzu vm lo.
you@localhost:~/diveintopython3/examples$ python3 romantest3.py -v
test_to_roman_known_values (__main__.KnownValues)
to_roman should give known result with known input ... ok
test_negative (__main__.ToRomanBadInput)
to_roman should fail with negative input ... ok
test_too_large (__main__.ToRomanBadInput)
to_roman should fail with large input ... ok
test_zero (__main__.ToRomanBadInput)
to_roman should fail with 0 input ... ok
----------------------------------------------------------------------
Ran 4 tests in 0.016s
OK
u.4. VIco zaslvol, vIco oln
209
u.. A josl jouna vc...
MozI ozauavly na iovou na iImsl cIsIa hyI josl jouon, lloiy so lylaI nocoIocIsoInolo vsluu.
>>> import roman3
>>> roman3.to_roman(0.5) }1]
''
>>> roman3.to_roman(1.0) }2]
'I'
}1] A jojo, lo jo salno.
}2] Jojua, lolIo jo josl loisI. V ohou uvouonycl iIauocl hy mIa hyl vyvoIna vyjImla. MIslo
lolo iouulujI IaIosno vysluy.
ToslovnI na nocoIocIsoIny vslu nonI ohlIzno. NojuiIvo sI uoIInujomo vyjImlu NotIntegerError.
# roman4.py
class OutOfRangeError(ValueError): pass
class NotIntegerError(ValueError): pass
DIo naIsomo loslovacI iIau, lloiy lonlioIujo vyslyl vyjImly NotIntegerError.
class ToRomanBadInput(unittest.TestCase):
.
.
.
def test_non_integer(self):
'''to_roman should fail with non-integer input'''
self.assertRaises(roman4.NotIntegerError, roman4.to_roman, 0.5)
Tou zlonlioIujmo, zua losl sivn soIlv.
you@localhost:~/diveintopython3/examples$ python3 romantest4.py -v
test_to_roman_known_values (__main__.KnownValues)
to_roman should give known result with known input ... ok
test_negative (__main__.ToRomanBadInput)
to_roman should fail with negative input ... ok
test_non_integer (__main__.ToRomanBadInput)
to_roman should fail with non-integer input ... FAIL
test_too_large (__main__.ToRomanBadInput)
to_roman should fail with large input ... ok
test_zero (__main__.ToRomanBadInput)
to_roman should fail with 0 input ... ok
u.. A josl jouna vc...
210
======================================================================
FAIL: to_roman should fail with non-integer input
----------------------------------------------------------------------
Traceback (most recent call last):
File "romantest4.py", line 90, in test_non_integer
self.assertRaises(roman4.NotIntegerError, roman4.to_roman, 0.5)
AssertionError: NotIntegerError not raised by to_roman
----------------------------------------------------------------------
Ran 5 tests in 0.000s
FAILED (failures=1)
NaIsomo lou, lloiy m zajIslIl, ahy losl iosoI.
def to_roman(n):
'''convert integer to Roman numeral'''
if not (0 < n < 4000):
raise OutOfRangeError('number out of range (must be 1..3999)')
if not isinstance(n, int): }1]
raise NotIntegerError('non-integers can not be converted') }2]
result = ''
for numeral, integer in roman_numeral_map:
while n >= integer:
result += numeral
n -= integer
return result
}1] Zahuuovan Iunlco isinstance() loslujo, zua jo uan iomnn uicIlolo lyu (noho, z locl-
nIclolo lIouIsla, njalolo z nj ouvozonolo lyu).
}2] Poluu aigumonl n nonI lyu int, vyvoIoj nasI zhiusu novou vyjImlu NotIntegerError.
Nalonoc zlonlioIujomo, zo lonlo lou zajIslII iuclou loslom.
you@localhost:~/diveintopython3/examples$ python3 romantest4.py -v
test_to_roman_known_values (__main__.KnownValues)
to_roman should give known result with known input ... ok
test_negative (__main__.ToRomanBadInput)
to_roman should fail with negative input ... ok
test_non_integer (__main__.ToRomanBadInput)
to_roman should fail with non-integer input ... ok
test_too_large (__main__.ToRomanBadInput)
to_roman should fail with large input ... ok
u.. A josl jouna vc...
211
test_zero (__main__.ToRomanBadInput)
to_roman should fail with 0 input ... ok
----------------------------------------------------------------------
Ran 5 tests in 0.000s
OK
Iunlco to_roman() iosIa vsomI losly a zuno uaIsI losly m nonaauajI. Talzo naslaI cas, ahyclom so
iosunuII l from_roman().
u.6. SymoliIo, lloi olsI
Piovou iolzco vyjauiujIcIlo iImslo cIsIo na cIsoInou lounolu vyau sIozIljI noz iovou cIsIa na iImslo
cIsIo. IicIl huuomo musol zajIslIl ovionI IalnoslI. ZlonlioIoval, zua jo cIsIo iovno nuIo, jo snauno.
O nco ohlIznjI so lonlioIujo, zua jo iolzoc Ialnym iImslym cIsIom. Jonzo my uz jsmo zlonsliuovaII
ioguIinI vyiaz, lloiy zlonlioIujo, zua juo o iImslo cIsIo. Talzo lulIo csl uz mmo lolovou.
Zhyv nm iohIom samolno lonvoizo iolzco. Jal za clvIII uvIuImo, uIly oxIsloncI ualovo sliulluiy,
lloiou jsmo uoIInovaII io iovou uicIlycl iImslycl cIsoI na coIocIsoIno lounoly, huuo juio Iunlco
from_roman() slojn iImocaio jalo u Iunlco to_roman().
AIo nojuiIvo losly. Pio ovionI sivnoslI lonliolnIcl lounol huuomo oliohoval losl ,znmycl lou-
nol. Naso loslovacI saua jIz lahuIlu znmycl lounol ohsalujo, lalzo jI vyuzIjmo.
def test_from_roman_known_values(self):
'''from_roman should give known result with known input'''
for integer, numeral in self.known_values:
result = roman5.from_roman(numeral)
self.assertEqual(integer, result)
Najuomo zuo olsIloInou symoliII. Iunlco to_roman() a from_roman() jsou vzjomn InvoiznI. PivnI
z nIcl iovuI cIsIa na zvIsln Ioimlovano iolzco a uiul iovuI zvIsln Ioimlovano iolzco
na coI cIsIa. TooiolIcly hyclom mII hyl sclonI uosl lo zvoIonomu cIsIu olIIlou lal, zo jo nojuiIvo
ioumo IunlcI to_roman(). ZIslany iolzoc ioumo IunlcI from_roman() a vysIouno cIsIo hy so mIo
slouoval s oclocnIm.
n = from_roman(to_roman(n)) pro vechny hodnoty n
V lomlo iIau ,vsoclny lounoly znamon jalouloIIv lounolu 1..3999, iolozo lolo jo Ialny iozsal
vsluu io IunlcI to_roman(). Tulo symoliII muzomo vyjuiIl loslovacIm iIauom, lloiy ioclzI
vsoclny lounoly 1..3999, voI to_roman(), voI from_roman() a lonlioIujo, zua so vyslu slouujo
s uvounIm vsluom.
u.6. SymoliIo, lloi olsI
212
class RoundtripCheck(unittest.TestCase):
def test_roundtrip(self):
'''from_roman(to_roman(n))==n for all n'''
for integer in range(1, 4000):
numeral = roman5.to_roman(integer)
result = roman5.from_roman(numeral)
self.assertEqual(integer, result)
Tylo novo losly zalIm anI nosoIzou (IaII). ZalIm jsmo vuhoc nouoIInovaII IunlcI from_roman(), lalzo
zusohI clyhy (oiiois).
you@localhost:~/diveintopython3/examples$ python3 romantest5.py
E.E....
======================================================================
ERROR: test_from_roman_known_values (__main__.KnownValues)
from_roman should give known result with known input
----------------------------------------------------------------------
Traceback (most recent call last):
File "romantest5.py", line 78, in test_from_roman_known_values
result = roman5.from_roman(numeral)
AttributeError: 'module' object has no attribute 'from_roman'
======================================================================
ERROR: test_roundtrip (__main__.RoundtripCheck)
from_roman(to_roman(n))==n for all n
----------------------------------------------------------------------
Traceback (most recent call last):
File "romantest5.py", line 103, in test_roundtrip
result = roman5.from_roman(numeral)
AttributeError: 'module' object has no attribute 'from_roman'
----------------------------------------------------------------------
Ran 7 tests in 0.019s
FAILED (errors=2)
PiohIom vyiosImo iyclIym vylvoionIm nliaunI Iunlco.
# roman5.py
def from_roman(s):
'''convert Roman numeral to integer'''
u.6. SymoliIo, lloi olsI
213
(Hoj, vsImII jslo sI lolo DoIInovaI jsom IunlcI, lloi noohsalujo nIc noz docstring (uolumonlacnI
iolzoc). TolIo jo v Pyllonu IogInI. NlloiI iogiamloiI vs vo slulocnoslI zaiIsalajI: ,NoIslo
nliauy. Dolumonlujlo!)
Tou uz loslovacI iIauy oiavuu soIzou (IaII).
you@localhost:~/diveintopython3/examples$ python3 romantest5.py
F.F....
======================================================================
FAIL: test_from_roman_known_values (__main__.KnownValues)
from_roman should give known result with known input
----------------------------------------------------------------------
Traceback (most recent call last):
File "romantest5.py", line 79, in test_from_roman_known_values
self.assertEqual(integer, result)
AssertionError: 1 != None
======================================================================
FAIL: test_roundtrip (__main__.RoundtripCheck)
from_roman(to_roman(n))==n for all n
----------------------------------------------------------------------
Traceback (most recent call last):
File "romantest5.py", line 104, in test_roundtrip
self.assertEqual(integer, result)
AssertionError: 1 != None
----------------------------------------------------------------------
Ran 7 tests in 0.002s
FAILED (failures=2)
NaslaI cas nasal IunlcI from_roman().
def from_roman(s):
"""convert Roman numeral to integer"""
result = 0
index = 0
for numeral, integer in roman_numeral_map:
while s[index:index+len(numeral)] == numeral: }1]
result += integer
index += len(numeral)
return result
u.6. SymoliIo, lloi olsI
214
}1] ZlIaunI vzoioc jo zuo slojny jalo u Iunlco to_roman(). PioclzImo ualovou sliulluiou s iIm-
slymI cIsIy (n-lIco n-lIc), aIo mIslo lIounI nojvyssIcl moznycl cIsoInycl lounol so snazImo
lIoual iolzoc znalu s ,nojvyssIm moznym iImslym cIsIom.
Poluu vm oiu nonI jasno, jal Iunlco from_roman() iacujo, iIuojlo na lonoc cylIu while voInI
Iunlco print:
def from_roman(s):
"""convert Roman numeral to integer"""
result = 0
index = 0
for numeral, integer in roman_numeral_map:
while s[index:index+len(numeral)] == numeral:
result += integer
index += len(numeral)
print('found', numeral, 'of length', len(numeral), ', adding', integer)
>>> import roman5
>>> roman5.from_roman('MCMLXXII')
found M of length 1, adding 1000
found CM of length 2, adding 900
found L of length 1, adding 50
found X of length 1, adding 10
found X of length 1, adding 10
found I of length 1, adding 1
found I of length 1, adding 1
1972
NaslaI ol cas lo suslnI loslu.
you@localhost:~/diveintopython3/examples$ python3 romantest5.py
.......
----------------------------------------------------------------------
Ran 7 tests in 0.060s
OK
Mmo lauy uv vziusujIcI zivy. Ta ivnI jo, zo Iunlco from_roman() Iungujo io sivno vsluy
iInojmonsIm io vsoclny znmo lounoly. Ta uiul ziva jo, zo losl ,liulovym voInIm (iounu
liI losl) lalo iosoI. Kuyz lo zlomhInujomo uoliomauy, muzomo sI hyl uocoIa jIslI lIm, zo jal Iunlco
to_roman(), lal Iunlco from_roman() iacujI sivn io vsoclny mozno sivno lounoly. (NonI lo
aIo zaiucono. TooiolIcly jo mozno, zo to_roman() ohsalujo clyhu, lloi io uicIlo lounoly vsluu
iouulujo saln iImsl cIsIa, a :outu:n6 Iunlco from_roman() ohsalujo ohiconou clyhu, lloi io-
u.6. SymoliIo, lloi olsI
215
uulujo slojn, aIo saln cIsIa iosn io lu mnozInu iImslycl cIsoI, lloi Iunlco to_roman() vygono-
iovaIa nosivn. V zvIsIoslI na vasI aIIlacI a na ozauavcIcl hy vm lo molIo uIal slaioslI. Poluu
lomu lal jo, naIslo ohsaznjsI loslovacI iIauy, lloio vaso slaioslI iozlyII.)
u.7. VIco salnycl vsluu
Tou, luyz uz Iunlco from_roman() iacujo sivn io loiollnI vslu, naslaI cas l umIslnI osIou-
nIlo louslu slIuanly zajIslnI sivno Iunlco io salno vsluy. To znamon, zo musImo najIl
zusoh, jal so ouIval na iolzoc a uicIl, zua jo Ialnym iImslym cIsIom. To uz jo zo svo ouslaly
ohlIznjsI noz oviovnI sivnoslI cIsoInolo vsluu vo IunlcI to_roman(). AIo mmo l uIsozIcI
mocny nslioj ioguIinI vyiazy. (Poluu ioguIinI vyiazy noznlo, al jo vloun uoha na lo, ahyslo
sI iocolII laIloIu o ioguIinIcl vyiazocl.)
V oulaIloIo PiIauov sluuIo: RImsl cIsIa jsmo vIuII, zo oxIslujo nloIIl jounouuclycl iavIuoI
io lonsliulcI iImslolo cIsIa, lloi jsou zaIozona na vyuzIlI Ismon M, D, C, L, X, V a I. Pojumo sI lalo
iavIuIa zoaloval:
V nlloiycl iIauocl so znaly scIlajI. I jo 1, II jo iovno 2 a III znamon 3. VI so iovn 6 (uosIova
,5 a 1), VII jo 7 a VIII jo 8.
- DosIllovo znaly (I, X, C a M) so molou oaloval nanojvys liIlil. Hounolu 4 musImo vyjuiIl
ouoclonIm ou uaIsIlo vyssIlo llovolo znalu. Hounolu 4 nomuzomo zasal jalo IIII. MIslo
lolo jI musImo zasal jalo IV (,o 1 mon noz 5). 40 so zaIsujo jalo XL (,o 10 mon noz 50),
41 jalo XLI, 42 jalo XLII, 43 jalo XLIII a nsIouujo 44 jalo XLIV (,o 10 mon noz 50 a l lomu
o 1 mon noz 5).
- Nluy znaly vyjauiujI... oal scIlnI. Kuyz nlloio znaly umIslImo iou jIno, iovuImo oucI-
lnI ou lonocno lounoly. NaiIlIau lounolu 9 musImo vyjuiIl ouoclonIm ou uaIsIlo vyssIlo
uosIllovolo znalu: 8 zaIsomo jalo VIII, aIo 9 zaIsomo IX (,o 1 mon noz 10) a no jalo VIIII
(iolozo znal I nomuzomo oaloval clyiIlil). 90 jo XC, 900 jo CM.
- Pllovo znaly so nosmI oaloval. 10 so vzuy zaIsujo jalo X a nIluy jalo VV. 1uu jo vzuy C,
nIluy LL.
- RImsl cIsIa so clou zIova uoiava, lalzo na oiauI znalu voImI zIozI. DC znamon 600, aIo CD
jo In jIno cIsIo (400, ,o 100 mon noz 500). CI jo 101, aIo IC nonI uolonco vuhoc Ialno iIm-
slo cIsIo (iolozo 1 nomuzomo iImo oucIlal ou 100; musImo lo nasal jalo XCIX, ,o 10 mon
noz 100 a l lomu o 1 mon noz 10).
Talzo jouon z uzIlocnycl loslu huuo ovioval, zo hy Iunlco from_roman() mIa soIlal (IaII) v iIau,
luy jI ioumo iolzoc s iIIIs mnola oalujIcImI so iImslymI cIsIIcomI. Co znamon ,iIIIs mnolo,
zvIsI na lonliolnI cIsIIcI.
u.7. VIco salnycl vsluu
Ka.
Ka.
216
class FromRomanBadInput(unittest.TestCase):
def test_too_many_repeated_numerals(self):
'''from_roman should fail with too many repeated numerals'''
for s in ('MMMM', 'DD', 'CCCC', 'LL', 'XXXX', 'VV', 'IIII'):
self.assertRaises(roman6.InvalidRomanNumeralError, roman6.from_roman, s)
DaIsI uzIlocny losl huuo zaIozon na lonlioIo, zo so nooalujI nlloio vzoiy. NaiIlIau IX jo 9, aIo IXIX
jo vzuy noIalno.
def test_repeated_pairs(self):
'''from_roman should fail with repeated pairs of numerals'''
for s in ('CMCM', 'CDCD', 'XCXC', 'XLXL', 'IXIX', 'IVIV'):
self.assertRaises(roman6.InvalidRomanNumeralError, roman6.from_roman, s)
TiolI losl hy molI lonlioIoval, zua so cIsIIco ohjovujI vo sivnom oiauI, ou nojvyssIcl l nojnIzsIm
lounolm. NaiIlIau CL jo 150, aIo LC jo vzuy noIalno, iolozo cIsIIco io 50 so nosmI nIluy vyslylo-
val iou cIsIIcI io 100. Tonlo losl zalinujo nloun zvoIonou mnozInu nosivnycl ioucluucu:
I iou M, V iou X a lal uIo.
def test_malformed_antecedents(self):
'''from_roman should fail with malformed antecedents'''
for s in ('IIMXCC', 'VX', 'DCM', 'CMM', 'IXIV',
'MCMC', 'XCX', 'IVI', 'LM', 'LD', 'LC'):
self.assertRaises(roman6.InvalidRomanNumeralError, roman6.from_roman, s)
Kazuy z lcllo loslu soIol na lo, zo Iunlco from_roman() vyvoIv novou vyjImlu InvalidRoman-
NumeralError, lloiou jsmo josl nouoIInovaII.
# roman6.py
class InvalidRomanNumeralError(ValueError): pass
Vsoclny liI losly hy mIy soIlal (IaII), iolozo Iunlco from_roman() momonlIn noiovuI zunou
lonlioIu IalnoslI. (Poluu hy nosoIlaIy lou, lal co hy vIasln loslovaIy)
you@localhost:~/diveintopython3/examples$ python3 romantest6.py
FFF.......
======================================================================
FAIL: test_malformed_antecedents (__main__.FromRomanBadInput)
from_roman should fail with malformed antecedents
----------------------------------------------------------------------
u.7. VIco salnycl vsluu
217
Traceback (most recent call last):
File "romantest6.py", line 113, in test_malformed_antecedents
self.assertRaises(roman6.InvalidRomanNumeralError, roman6.from_roman, s)
AssertionError: InvalidRomanNumeralError not raised by from_roman
======================================================================
FAIL: test_repeated_pairs (__main__.FromRomanBadInput)
from_roman should fail with repeated pairs of numerals
----------------------------------------------------------------------
Traceback (most recent call last):
File "romantest6.py", line 107, in test_repeated_pairs
self.assertRaises(roman6.InvalidRomanNumeralError, roman6.from_roman, s)
AssertionError: InvalidRomanNumeralError not raised by from_roman
======================================================================
FAIL: test_too_many_repeated_numerals (__main__.FromRomanBadInput)
from_roman should fail with too many repeated numerals
----------------------------------------------------------------------
Traceback (most recent call last):
File "romantest6.py", line 102, in test_too_many_repeated_numerals
self.assertRaises(roman6.InvalidRomanNumeralError, roman6.from_roman, s)
AssertionError: InvalidRomanNumeralError not raised by from_roman
----------------------------------------------------------------------
Ran 10 tests in 0.058s
FAILED (failures=3)
Iajn. Tou uz uo Iunlco from_roman() oliohujomo iIual jon ioguIinI vyiaz, lloiy loslujo Ialnosl
iImslycl cIsoI.
roman_numeral_pattern = re.compile('''
^ # zatek etzce
M{0,3} # tisce - 0 a 3 M
(CM|CD|D?C{0,3}) # stovky - 900 (CM), 400 (CD), 0-300 (0 a 3 C),
# nebo 500-800 (D nsledovan 0 a 3 C)
(XC|XL|L?X{0,3}) # destky - 90 (XC), 40 (XL), 0-30 (0 a 3 X),
# nebo 50-80 (L nsledovan 0 a 3 X)
(IX|IV|V?I{0,3}) # jednotky - 9 (IX), 4 (IV), 0-3 (0 a 3 I),
# nebo 5-8 (V nsledovan 0 a 3 I)
$ # konec etzce
''', re.VERBOSE)
u.7. VIco salnycl vsluu
218
def from_roman(s):
'''convert Roman numeral to integer'''
if not roman_numeral_pattern.search(s):
raise InvalidRomanNumeralError('Invalid Roman numeral: {0}'.format(s))
result = 0
index = 0
for numeral, integer in roman_numeral_map:
while s[index : index + len(numeral)] == numeral:
result += integer
index += len(numeral)
return result
A znovu suslImo losly.
you@localhost:~/diveintopython3/examples$ python3 romantest7.py
..........
----------------------------------------------------------------------
Ran 10 tests in 0.066s
OK
A conu za zlIamnI iolu uoslv. sIovo ,OK, lloio mouuI unittest zohiazI olo, co vsoclny
losly iosIy.
u.7. VIco salnycl vsluu
219
10. Refaktorizace
1u. KaIloIa
After one has played a vast quantity of notes and more notes,
it is simplicity that emerges as the crowning reward of art.
(Polo, co jslo zaliII oliomno mnozslvI nol a josl vIco nol,
so jalo vicloIn oumna umnI ohjovI jounouuclosl.)
IiouoiIc CloIn
220
10. Refaktorizace 219
1u.1. Ponoimo so 221
1u.2. ZvIunI mnIcIcl so ozauavlu 223
1u.8. RoIalloiIzaco 228
1u.4. SlinulI 232
Ohsal laIloIy
221
1u.1. Ponoimo so
K clyhm uoclzI, al so vm lo IIhI noho no. Clyhy so ohjovI navzuoiy vasomu nojIosImu sIII o vy-
lvoionI vsozalinujIcIcl loslu jounolol (unIl losl). Co vIasln mysIIm sIovom ,clyha Clyhou iozumIm
loslovacI iIau (losl caso), lloiy jslo josl nonasaII.
>>> import roman7
>>> roman7.from_roman('') }1]
0
}1] TolIo jo clyha. Pizuny iolzoc hy mI vyvoIal vyjImlu InvalidRomanNumeralError slojn jalo
jIno osIounoslI znalu, lloio novyjauiujI Ialno iImslo cIsIo.
JalmIIo clyhu umIlo navouIl, mII hyslo nasal loslovacI iIau (losl caso) josl uiIvo, noz jI oiavIlo.
TIm clyhu oIsolo.
class FromRomanBadInput(unittest.TestCase):
.
.
.
def testBlank(self):
'''from_roman should fail with blank string'''
self.assertRaises(roman6.InvalidRomanNumeralError, roman6.from_roman, '') }1]
}1] Jo lo uocoIa jounouuclo. VoImo IunlcI from_roman() s izunym iolzcom a ujIslujomo so, zo
vyvoIv vyjImlu InvalidRomanNumeralError. NaIozonI clyhy jo ohlIznou cslI loIu. Poluu
uz o nI vImo, iouslavujo jojI oloslovnI snaunou csl loIu.
Piolozo ns lou ohsalujo clyhu a iolozo uz mmo l uIsozIcI loslovacI iIau, lloiy jI oIsujo,
uojuo l jolo soIlnI:
you@localhost:~/diveintopython3/examples$ python3 romantest8.py -v
from_roman should fail with blank string ... FAIL
from_roman should fail with malformed antecedents ... ok
from_roman should fail with repeated pairs of numerals ... ok
from_roman should fail with too many repeated numerals ... ok
from_roman should give known result with known input ... ok
to_roman should give known result with known input ... ok
from_roman(to_roman(n))==n for all n ... ok
to_roman should fail with negative input ... ok
to_roman should fail with non-integer input ... ok
to_roman should fail with large input ... ok
to_roman should fail with 0 input ... ok
1u.1. Ponoimo so
222
======================================================================
FAIL: from_roman should fail with blank string
----------------------------------------------------------------------
Traceback (most recent call last):
File "romantest8.py", line 117, in test_blank
self.assertRaises(roman8.InvalidRomanNumeralError, roman8.from_roman, '')
AssertionError: InvalidRomanNumeralError not raised by from_roman
----------------------------------------------------------------------
Ran 11 tests in 0.171s
FAILED (failures=1)
Ted uz clyhu muzomo oiavIl.
def from_roman(s):
'''convert Roman numeral to integer'''
if not s: }1]
raise InvalidRomanNumeralError('Input can not be blank')
if not re.search(romanNumeralPattern, s):
raise InvalidRomanNumeralError('Invalid Roman numeral: {}'.format(s)) }2]
result = 0
index = 0
for numeral, integer in romanNumeralMap:
while s[index:index+len(numeral)] == numeral:
result += integer
index += len(numeral)
return result
}1] MusImo iIual jon uva iuly louu: oxIIcIlnI lonlioIu na izuny iolzoc a iIlaz raise.
}2] MysIIm, zo o lomlIo jsom so v lolo lnIzo zalIm josl nozmInII. Nocll lo sIouzI jalo zviocn
Iolco z IoimlovnI iolzcu. PocInajo voizI Pyllon 8.1 muzolo iI socIIIlacI Ioimlu vynoclal
cIsIa ozIcnIcl Inuoxu. To znamon, zo mIslo socIIIlloiu {0}, lloiym so oulazujomo na ivnI
aiamoli molouy format(), muzomo jounouuso ouzIl {} a Pyllon uoInI sivny ozIcnI
Inuox za ns. Iungujo lo io IIhovoIny ocol aigumonlu. PivnI {} so clo jalo {0}, uiuly
vyslyl {} znamon {1} a lal uIo.
you@localhost:~/diveintopython3/examples$ python3 romantest8.py -v
from_roman should fail with blank string ... ok }1]
from_roman should fail with malformed antecedents ... ok
from_roman should fail with repeated pairs of numerals ... ok
from_roman should fail with too many repeated numerals ... ok
1u.1. Ponoimo so
223
from_roman should give known result with known input ... ok
to_roman should give known result with known input ... ok
from_roman(to_roman(n))==n for all n ... ok
to_roman should fail with negative input ... ok
to_roman should fail with non-integer input ... ok
to_roman should fail with large input ... ok
to_roman should fail with 0 input ... ok
----------------------------------------------------------------------
Ran 11 tests in 0.156s
OK }2]
}1] ToslovacI iIau io izuny iolzoc iosoI, lalzo clyha jo oiavona.
}] Vsoclny oslalnI loslovacI iIauy iosIy lalo. To znamon, zo jsmo oiavou clyhy nIc jInolo
noolazIII. Pioslalo sl lou.
Tonlo iIslu l iogiamovnI oiavu clyh nIjal nousnauujo. Jounouuclo clyhy (jalo jo lalo) vyzauujI
jounouussI loslovacI iIauy, sIozIlo clyhy ovouou l sIozIlym loslovacIm iIauum. V iosliouI sou-
sliounom loIom loslu so muzo zd0|, zo oiava clyhy liv uoIo. MusImo clyhu iosn osal v louu
(lj. musImo nasal loslovacI iIau) a loivo olom jI oiavIl. Poluu loslovacI iIau lnou noiojuo,
musImo zjIslIl, zua jsmo uuIaII clyhu v oiav, noho zua jo clyha v louu loslovacIlo iIauu. AIo
z uIoulouoholo lIouIsla so sliIuav lvoiha loslovacIlo a loslovanolo louu vyIalI, iolozo so lIm zvy-
sujo iavuouohnosl sivno oiavy clyh naoivo. S vasIm novym loslom so lalo snauno oalovan
sousljI v:ethny losly. Piolo jo mIo iavuouohno, zo oiavou novolo louu olazIlo uvounI lou.
DnosnI losl jounolly (unIl losl) jo zIliojsIm iogiosnIm loslom.
1u.2. ZvIunI mnIcIcl so ozauavlu
Navzuoiy vasomu nojIosImu sIII o iIIclnulI zlaznIla l zomI, olo co z nj iI hoIoslIvo ioco-
uuio zalinujIcI liuzno ouoinoslI (jalo jsou nuzly a loily vosl) vyllnolo iosno ozauavly... ly
ozauavly so zmnI. VlsIna zlaznIlu novI, co clco, uoluu lo nouvIuI. A uolonco luyz uz lo vIuI,
nojsou uosl uohiI na lo, ahy vyjuiIII, co clljI, lal iosn, ahy lo l ncomu hyIo. A uolonco I luyz so
vyjuiI iosn, v iIslI voizI lolo slojn huuou cllIl vIc. Talzo v souvIsIoslI s mnIcImI so ozauavly
huulo iIiavonI na iavy svycl loslovacIcl iIauu (losl caso).
Dojmo lomu, zo hyclom naiIlIau cllII iozsIiIl iozsal Iunlco io iovou iImslycl cIsoI. V iImslycl
cIsIocl so zuny znal nomuzo oaloval vIc noz liIlil. AIo RImano hyII oclolnI iIuslIl vyjImlu
z lololo iavIuIa a ioiozonloval lounolu 4000 uvouonIm clyi M za sohou. Poluu lalovou zmnu
iovouomo, huuomo sclonI iozsIiIl iozsal iovunycl cIsoI z 1..3999 na 1..4999. AIo nojuiIvo
iovouomo iavy loslovacIcl iIauu.
1u.2. ZvIunI mnIcIcl so ozauavlu
224
class KnownValues(unittest.TestCase):
known_values = ( (1, 'I'),
.
.
.
(3999, 'MMMCMXCIX'),
(4000, 'MMMM'), }1]
(4500, 'MMMMD'),
(4888, 'MMMMDCCCLXXXVIII'),
(4999, 'MMMMCMXCIX') )
class ToRomanBadInput(unittest.TestCase):
def test_too_large(self):
'''to_roman should fail with large input'''
self.assertRaises(roman8.OutOfRangeError, roman8.to_roman, 5000) }2]
.
.
.
class FromRomanBadInput(unittest.TestCase):
def test_too_many_repeated_numerals(self):
'''from_roman should fail with too many repeated numerals'''
for s in ('MMMMM', 'DD', 'CCCC', 'LL', 'XXXX', 'VV', 'IIII'): }8]
self.assertRaises(roman8.InvalidRomanNumeralError, roman8.from_roman, s)
.
.
.
class RoundtripCheck(unittest.TestCase):
def test_roundtrip(self):
'''from_roman(to_roman(n))==n for all n'''
for integer in range(1, 5000): }4]
numeral = roman8.to_roman(integer)
result = roman8.from_roman(numeral)
self.assertEqual(integer, result)
}1] SlvajIcI znmo lounoly so nomnI (oiu juo o iozumno loslovacI lounoly), aIo oliohujomo
iIual i uaIsIcl v iozsalu ou 4000. PiIuaII jsmo 4000 (nojlialsI), 4500 (uiulo nojlialsI), 4888
(nojuoIsI) a 4999 (nojvlsI).
}2] ZmnIIa so uoIInIco ,voIlo vslunI lounoly. I lololo loslu so iI voInI to_roman() s lou-
nolou 4000 ocolvaIa clyha. Tou so aIo iozsal 4000-4999 ovazujo za sivno lounoly, iolo
musImo lianIcI zvysIl na 5000.
1u.2. ZvIunI mnIcIcl so ozauavlu
225
}8] ZmnIIa so lalo uoIInIco ,iIIIs mnolo oalujIcIcl so znalu. I lololo loslu so iI voInI
tfrom_roman() so vsluom 'MMMM' ocolvaIa clyha. Tou jo MMMM ovazovno za Ialno iImslo
cIsIo. ToslovacI lounolu musImo zvlsIl na 'MMMMM'.
}4] Tosl IunlcnoslI ioclzoI v cylIu lazuym cIsIom z InloivaIu 1 az 3999. Rozsal so lou iozsIiII,
lalzo cylIus for musImo uiavIl, ahy so uoslaI az l 4999.
Tou mmo loslovacI iIauy uiavony vo slou s novymI ozauavly, aIo lou zalIm no. Talzo so u
colal, zo nlloio z loslu soIzou.
you@localhost:~/diveintopython3/examples$ python3 romantest9.py -v
from_roman should fail with blank string ... ok
from_roman should fail with malformed antecedents ... ok
from_roman should fail with non-string input ... ok
from_roman should fail with repeated pairs of numerals ... ok
from_roman should fail with too many repeated numerals ... ok
from_roman should give known result with known input ... ERROR }1]
to_roman should give known result with known input ... ERROR }2]
from_roman(to_roman(n))==n for all n ... ERROR }8]
to_roman should fail with negative input ... ok
to_roman should fail with non-integer input ... ok
to_roman should fail with large input ... ok
to_roman should fail with 0 input ... ok
======================================================================
ERROR: from_roman should give known result with known input
----------------------------------------------------------------------
Traceback (most recent call last):
File "romantest9.py", line 82, in test_from_roman_known_values
result = roman9.from_roman(numeral)
File "C:\home\diveintopython3\examples\roman9.py", line 60, in from_roman
raise InvalidRomanNumeralError('Invalid Roman numeral: {0}'.format(s))
roman9.InvalidRomanNumeralError: Invalid Roman numeral: MMMM
======================================================================
ERROR: to_roman should give known result with known input
----------------------------------------------------------------------
Traceback (most recent call last):
File "romantest9.py", line 76, in test_to_roman_known_values
result = roman9.to_roman(integer)
File "C:\home\diveintopython3\examples\roman9.py", line 42, in to_roman
raise OutOfRangeError('number out of range (must be 0..3999)')
roman9.OutOfRangeError: number out of range (must be 0..3999)
1u.2. ZvIunI mnIcIcl so ozauavlu
226
======================================================================
ERROR: from_roman(to_roman(n))==n for all n
----------------------------------------------------------------------
Traceback (most recent call last):
File "romantest9.py", line 131, in testSanity
numeral = roman9.to_roman(integer)
File "C:\home\diveintopython3\examples\roman9.py", line 42, in to_roman
raise OutOfRangeError('number out of range (must be 0..3999)')
roman9.OutOfRangeError: number out of range (must be 0..3999)
----------------------------------------------------------------------
Ran 12 tests in 0.171s
FAILED (errors=3)
}1] Tosl znmycl lounol io from_roman() soIzo v olamzIlu, luy so uoslano l lounol 'MMMM'.
Iunlco from_roman() sI lolIz oiu mysII, zo juo o noIalno iImslo cIsIo.
}2] Tosl znmycl lounol io to_roman() soIzo v olamzIlu, luy so naiazI na lounolu 4000, iolozo
to_roman() jI slIo ovazujo za lounolu mImo iozsal.
}8] Kiulovy losl soIzo iovnz u lounoly 4000, iolozo to_roman() jI ovazujo za lounolu mImo iozsal.
Mmo louy loslovacI iIauy, lloio soIlvajI v uusIoulu novycl ozauavlu, a muzomo uvazoval o oia-
vonI louu uo ouovIuajIcIlo slavu. (Kuyz s sanIm loslu jounolol (unIl losl) zacInlo, muzolo mIl uIvny
ocIl, zo loslovany lou nIluy ,noiouhIl loslovacI iIauy. Doluu jo ozauu, mmo oiu njalou
icI iou sohou. JalmIIo uohlno loslovacI iIauy, ioslanomo joj uiavoval. JalmIIo sI na lo jounou
zvylnolo, huuolo so uIvIl, jal jslo vuhoc uiIvo molII iogiamoval hoz loslu.)
roman_numeral_pattern = re.compile('''
^ # zatek etzce
M{0,4} # tisce - 0 a 4 M }1]
(CM|CD|D?C{0,3}) # stovky - 900 (CM), 400 (CD), 0-300 (0 a 3 C),
# nebo 500-800 (D nsledovan 0 a 3 C)
(XC|XL|L?X{0,3}) # destky - 90 (XC), 40 (XL), 0-30 (0 a 3 X),
# nebo 50-80 (L nsledovan 0 a 3 X)
(IX|IV|V?I{0,3}) # jednotky - 9 (IX), 4 (IV), 0-3 (0 a 3 I),
# nebo 5-8 (V nsledovan 0 a 3 I)
$ # konec etzce
''', re.VERBOSE)
1u.2. ZvIunI mnIcIcl so ozauavlu
227
def to_roman(n):
'''convert integer to Roman numeral'''
if not (0 < n < 5000): }2]
raise OutOfRangeError('number out of range (must be 1..4999)')
if not isinstance(n, int):
raise NotIntegerError('non-integers can not be converted')
result = ''
for numeral, integer in roman_numeral_map:
while n >= integer:
result += numeral
n -= integer
return result
def from_roman(s):
.
.
.
}1] IunlcI from_roman() nomusImo vuhoc uiavoval. Zmna so lyl jon vzoilu roman_numeral_
pattern. PiI ouiohnjsIm olIouu zjIslIlo, zo jsom v ivnI cslI ioguIinIlo vyiazu zmnII ma-
xImInI ocol noovInnycl znalu M z 3 na 4. TIm ovoIImo cIsIa ouovIuajIcI lounol az 4999
mIslo uvounI 3999. Samoln Iunlco from_roman() jo zcoIa ohocn. Zlilla jon lIou oalujIcI
so znaly iImslolo cIsIa a scIl ouovIuajIcI lounoly. Noslai so o lo, loIIlil so oalujI. DiIvo
nozvIuaIa 'MMMM' ouzo z lolo uuvouu, zo jsmo jI oxIIcIln zaslavIII na zlIau oiovnnI
s ioguIinIm vyiazom.
}2] Iunlco to_roman() sI vyzu jon jounu maIou zmnu v mIsl lonlioIy iozsalu. Kuo jsmo uiIvo
loslovaII 0 < n < 4000, huuomo lou lonlioIoval 0 < n < 5000. A lIsonI o clyh vyvoIvano
iIlazom raise zmnImo lal, ahy ouovIuaIo novomu ovoIonomu iozsalu (1..4999 mIslo
1..3999). Zhylol Iunlco nomusImo mnIl. Novo iIauy zvIu. (VosoIo iIuv 'M' io laz-
uou naIozonou lIsIcovlu. Kuyz uoslano 4000 vycliII 'MMMM'. DiIvo lonlo iIau nozvIuaIa jon
iolo, zo jsmo jI oxIIcIln zaslavIII iI lonlioIo iozsalu.)
Mozn oclyhujolo o lom, zo hy lylIo uv maIo zmny vyiosIIy vso, co oliohujomo. NomusIlo mI lo
viIl. ZlonlioIujlo sI lo samI.
you@localhost:~/diveintopython3/examples$ python3 romantest9.py -v
from_roman should fail with blank string ... ok
from_roman should fail with malformed antecedents ... ok
from_roman should fail with non-string input ... ok
from_roman should fail with repeated pairs of numerals ... ok
from_roman should fail with too many repeated numerals ... ok
from_roman should give known result with known input ... ok
1u.2. ZvIunI mnIcIcl so ozauavlu
228
to_roman should give known result with known input ... ok
from_roman(to_roman(n))==n for all n ... ok
to_roman should fail with negative input ... ok
to_roman should fail with non-integer input ... ok
to_roman should fail with large input ... ok
to_roman should fail with 0 input ... ok
----------------------------------------------------------------------
Ran 12 tests in 0.203s
OK }1]
}1] Vsoclny loslovacI iIauy iosIy. Pioslalo sl lou.
PiI ouzIvnI ohslIycl loslu jounolol nomusIlo soIolal na iogiamloia, lloiy iIl: ,Vi mI.
1u.8. RoIalloiIzaco
Na lomIoxnIm ouzIvnI loslu jounolol (unIl loslIng) nonI nojIosI lo, jal so cIlIlo, luyz vsoclny
loslovacI iIauy nalonoc iojuou, uolonco anI lo, jal so cIlIlo, luyz vs nluo nailno, zo jslo mu
olazIII jolo lou, a vy vo slulocnoslI muzolo doL0zu|, zo lomu lal nonI. Na loslocl jounolol jo nojIosI
vcI lo, zo vm uv voInosl nomIIosiun ioIalloiIzoval.
RoIalloiIzaco jo cInnoslI, luy vozmolo IungujIcI lou a uuIlo z nj josl IosI. ,LosI ohvylIo znamo-
n ,iyclIojsI, aIo muzo lo laly znamonal ,ouzIvajIcI mon amlI noho ,ouzIvajIcI monsI uIslovy
iosloi noho jo iosl ,oIoganlnjsI. RoIalloiIzaco jo z lIouIsla uIoulouoholo zuiavI lazuolo io-
giamu uuIozIl, al uz lo znamon coloIIv io vs, io vs iojoll noho io vaso oloII.
V iIau nasolo louu huuo ,IosI znamonal jal ,iyclIojsI, lal ,snaunjI uuizovaloIny. Konlioln
Iunlco from_roman() jo omaIojsI a sIozIljsI, noz hy so mI IIhIIo. Jo lo uno onIm voIlym, lnusnym
ioguIinIm vyiazom, lloiy so ouzIv io oviovnI, zua juo o iImslo cIsIo. Tou sI mozn omysIIlo:
,No jo. Ton ioguIinI vyiaz sIco jo voIly a sliaaly, aIo jal jInal hy so uaIo oviIl, zua jo IIhovoIny
iolzoc Ialnym iImslym cIsIom
Ouovu znI: Tcl cIsoI jo jon uuu. Pioc hyclom io n iosl nomolII vylvoiIl vylIouvacI lahuIlu
Ta mysIonla so vm huuo IIhIl josl vIc, luyz zjIslIlo, zo vIet neIudeme o|IeIovu| regu0rn vyruzy. PiI
huuovnI vylIouvacI lahuIly io iovou cIsoI na iImsl cIsIa muzomo soucasn vylviol oacnou vy-
lIouvacI lahuIlu io lonvoizI iImslycl cIsoI na coI cIsIa. PiI loslu, zua jo IIhovoIny iolzoc Ialnym
iImslym cIsIom, huuomo mIl l uIsozIcI vsoclna Ialn iImsl cIsIa. ,OvionI IalnoslI so iouulujo
na jouno vylIounI vo sIovnIlu.
1u.8. RoIalloiIzaco
229
A zo vsolo nojIosI jo, zo uz mmo l uIsozIcI Inou sauu loslu jounolol (unIl losl). V mouuIu muzo-
mo vymnIl lIIun oIovInu louu, aIo losly jounolol zuslanou slojno. To znamon, zo muzolo uolzal
samI soh a oslalnIm , zo novy lou Iungujo slojn uohio jalo lon uvounI.
class OutOfRangeError(ValueError): pass
class NotIntegerError(ValueError): pass
class InvalidRomanNumeralError(ValueError): pass
roman_numeral_map = (('M', 1000),
('CM', 900),
('D', 500),
('CD', 400),
('C', 100),
('XC', 90),
('L', 50),
('XL', 40),
('X', 10),
('IX', 9),
('V', 5),
('IV', 4),
('I', 1))
to_roman_table = [ None ]
from_roman_table = {}
def to_roman(n):
'''convert integer to Roman numeral'''
if not (0 < n < 5000):
raise OutOfRangeError('number out of range (must be 1..4999)')
if int(n) != n:
raise NotIntegerError('non-integers can not be converted')
return to_roman_table[n]
def from_roman(s):
'''convert Roman numeral to integer'''
if not isinstance(s, str):
raise InvalidRomanNumeralError('Input must be a string')
if not s:
raise InvalidRomanNumeralError('Input can not be blank')
if s not in from_roman_table:
raise InvalidRomanNumeralError('Invalid Roman numeral: {0}'.format(s))
return from_roman_table[s]
1u.8. RoIalloiIzaco
230
def build_lookup_tables():
def to_roman(n):
result = ''
for numeral, integer in roman_numeral_map:
if n >= integer:
result = numeral
n -= integer
break
if n > 0:
result += to_roman_table[n]
return result
for integer in range(1, 5000):
roman_numeral = to_roman(integer)
to_roman_table.append(roman_numeral)
from_roman_table[roman_numeral] = integer
build_lookup_tables()
RozuImo sI lo na sliavIloIno lously. PiolazaloIn nojuuIozIljsIm iulom jo lon osIounI:
build_lookup_tables()
JIsl sI vsImnolo, zo juo o voInI Iunlco. AIo nonI lu zuny ohaIujIcI iIlaz if. Tauy nojuo o hIol uvnIli
if __name__ == '__main__'. Iunlco so zavoI v oLum2Lu mor|u moduu. (Zuo jo uuIozIlo vul, zo
so mouuIy ImoilujI jon jounou a olo so amalujI vo vyiovnvacI amlI (caclo). Poluu Imoilujomo
uz jounou Imoilovany mouuI, nIc so noujo. Talzo uvouony lou huuo zavoIn jon iI ivnIm Imoilu
lololo mouuIu.)
Co vIasln Iunlco build_lookup_tables() uI To jsom iu, zo so llo.
to_roman_table = [ None ]
from_roman_table = {}
.
.
.
def build_lookup_tables():
def to_roman(n): }1]
result = ''
for numeral, integer in roman_numeral_map:
if n >= integer:
result = numeral
n -= integer
break
1u.8. RoIalloiIzaco
231
if n > 0:
result += to_roman_table[n]
return result
for integer in range(1, 5000):
roman_numeral = to_roman(integer) }2]
to_roman_table.append(roman_numeral) }8]
from_roman_table[roman_numeral] = integer
}1] TolIo jo lalovy clyliy iogiamloisly ohial... mozn az iIIIs clyliy. Iunlco to_roman() jo uo-
IInovna vyso. VylIouv lounoly vo vylIouvacI lahuIco a viacI jo. AIo Iunlco build_lookup_
tables() sI io ioaIIzacI iovouu vylviI svou vIaslnI uoIInIcI Iunlco to_roman() (slojnou, jal
so ouzIvaIa v iouclozIcl iIauocl, noz jsmo iIuaII vylIouvacI lahuIlu). IvnIli Iunlco
build_lookup_tables() so huuo voIal la iouoIInovan voizo Iunlco to_roman(). JalmIIo Iunlco
build_lookup_tables() sloncI, iouoIInovan voizo zmIzI. JojI uoIInIco jo Ialn jon IolIn,
uvnIli Iunlco build_lookup_tables().
}2] Na lomlo iulu louu so voI iouoIInovan Iunlco to_roman(), lloi vo slulocnoslI vylviI
iImslo cIsIo.
}8] JalmIIo mmo l uIsozIcI vysIouol (iouoIInovano Iunlco to_roman()), iIumo cIsIo a jomu
ouovIuajIcI iImslo cIsIo uo ohou vylIouvacIcl lahuIol.
JalmIIo jsou vylIouvacI lahuIly naInny, jo zhyvajIcI lou jounouucly a iyclIy.
def to_roman(n):
'''convert integer to Roman numeral'''
if not (0 < n < 5000):
raise OutOfRangeError('number out of range (must be 1..4999)')
if int(n) != n:
raise NotIntegerError('non-integers can not be converted')
return to_roman_table[n] }1]
def from_roman(s):
'''convert Roman numeral to integer'''
if not isinstance(s, str):
raise InvalidRomanNumeralError('Input must be a string')
if not s:
raise InvalidRomanNumeralError('Input can not be blank')
if s not in from_roman_table:
raise InvalidRomanNumeralError('Invalid Roman numeral: {0}'.format(s))
return from_roman_table[s] }2]
}1] Iunlco to_roman() iovouo slojno lonlioIy lianIcnIcl iIauu (jalo uiIvo) a olom jounouuso
najuo ouovIuajIcI lounolu vo vylIouvacI lahuIco a vilI jI.
1u.8. RoIalloiIzaco
232
}2] Talo Iunlco from_roman() jo iouulovna na lonlioIy a jouon iuol louu. Iz zuno ioguIinI
vyiazy. Iz zuno cylIy. Piovou na a z iImslolo cIsIa so sIozIloslI O(1) lj. v lonslanlnIm caso.
AIo Iungujo lo Pioc so llo Jasn zo Iungujo. A muzu lo uolzal.
you@localhost:~/diveintopython3/examples$ python3 romantest10.py -v
from_roman should fail with blank string ... ok
from_roman should fail with malformed antecedents ... ok
from_roman should fail with non-string input ... ok
from_roman should fail with repeated pairs of numerals ... ok
from_roman should fail with too many repeated numerals ... ok
from_roman should give known result with known input ... ok
to_roman should give known result with known input ... ok
from_roman(to_roman(n))==n for all n ... ok
to_roman should fail with negative input ... ok
to_roman should fail with non-integer input ... ok
to_roman should fail with large input ... ok
to_roman should fail with 0 input ... ok
----------------------------------------------------------------------
Ran 12 tests in 0.031s }1]
OK
}1] Touy, no zo hyslo so laII, aIo ono jo lo laly iyclIo! Sloio 1ulil iyclIojsI. NonI lo, samoziojm,
In Ioiovo siovnnI, iolozo u lolo voizo liv uoIo Imoil (huuujI so vylIouvacI lahuIly).
AIo iolozo so Imoil uI jon jounou, iozuslI so nlIaunosl iI slailu mozI voInI IunlcI
to_roman() a from_roman(). A iolozo so iI loslocl iovuI nloIIl lIsIc voInI IunlcI
(jon samolny liulovy losl jIcl iovouo 1u uuu), soiy so iyclIo nascIlajI!
A jal znI onauconI
- V jounouucloslI jo sIIa.
- ZvIsl loluy, luyz jsou uo lolo zaIolono ioguIinI vyiazy.
- DIly loslum jounolol (unIl losl) zIsllo sohouuviu a ouvalu l iovunI iozslIo ioIalloiIzaco.
1u.4. SlinulI
InIl loslIng (loslovnI jounolol) iouslavujo mocny loncol, lloiy iI sivno ImIomonlacI vouo
u uIoulouohycl iojollu jal l iouulcI nlIauu na uizhu, lal lo zvysonI iuznoslI. Soucasn sI aIo
musImo uvuomIl, zo loslovnI jounolol nonI vsoIol. Nasal uohio loslovo iIauy nonI jounouucl
vc a uuizol jo v alluInIm slavu vyzauujo uIscIIInu (zvIsl luyz zlaznIcI viIslajI, ahy hyIy oia-
1u.4. SlinulI
233
vony liIlIclo clyhy). InIl loslIng nonI nliauou oslalnIcl Ioiom loslovnI, zalinujIcIcl loslovnI
IunlcnoslI coIolo syslomu, InlogiacnI loslovnI (lj. losl soIuico jounolol) a uzIvaloIslo alcolacnI
losly. Tosly jounolol jsou aIo ioslo iozumno, IungujI, a luyz uz jo jounou uvIuIlo v cInnoslI, huuolo so
uIvIl, jal jslo so hoz nIcl molII ohojIl.
V i osIounIcl laIloIcl jsmo so sIiojI zahyvaII zlIauy, z nIclz mnolo uolonco nojsou socIIIc-
lo jon io Pyllon. Rmco io loslovnI jounolol (unIl loslIng Iiamovoils) jsou uosluno io mnolo
jazylu a vsoclny vyzauujI, ahyslo oiozumII lymz loncolum:
- Nvil loslovacIcl iIauu (losl caso), lloio jsou socIIIclo, aulomalIzovano a nozvIsIo.
- NasnI loslovacIcl iIauu Ied :unm Lodu, lloiy majI losloval.
- PsanI loslu, lloio loslujI sivno vsluy a lonlioIujI ocolvano vysIouly.
- PsanI loslu, lloio loslujI clyhno vsluy a lonlioIujI ocolvano clyhovo ioalco.
- PsanI a alluaIIzaco loslovacIcl iIauu lal, ahy ouizoIy novo ozauavly.
- NomIIosiun ioIalloiIzaco za coIom zvysonI vylonnoslI, slIovaloInoslI, cIloInoslI, uuizova-
loInoslI a jalyclloIIv jInycl -oslI, o lloiycl louzIlo.
1u.4. SlinulI
234
235
11. Soubory
11. KaIloIa
A nine mile walk is no joke, especially in the rain.
(JIl uovl mII nonI zun Iogiaco, zvIsl v uoslI.)
Haiiy KomoIman, The Nne Me WuL
236
Ohsal laIloIy
11. Soubory 235
11.1. Ponoimo so 237
11.2. ClonI z loxlovycl souhoiu 237
11.2.1. KouovnI znalu vyslilujo svou oslIIvou lIavu 237
11.2.2. Ohjolly lyu slioam 238
11.2.8. ClonI ual z loxlovolo souhoiu 239
11.2.4. ZavIinI souhoiu 241
11.2.. AulomalIclo zavIinI souhoiu 242
11.2.6. ClonI ual o iucIcl 243
11.8. ZIs uo loxlovycl souhoiu 245
11.8.1. A znovu louovnI znalu 246
11.4. BIninI souhoiy 246
11.. Ohjolly lyu slioam z nosouhoiovycl zuioju 247
11..1. Pico s lomiImovanymI souhoiy 249
11.6. SlanuaiunI vslu, vyslu a clyhovy vyslu 250
11.6.1. PiosmiovnI slanuaiunIlo vysluu 251
11.7. Piocllo sI 254
237
11.1. Ponoimo so
Noz jsom zacaI InslaIoval ivnI aIIlacI, ohsalovaIy WInuovs na mom Ialou 88 4u8 souhoiu. Po Insla-
IacI Pyllonu 8 l nIm iIhyIo lomi 8uuu uaIsIcl. Kazuy vyznamnjsI ooiacnI syslom ovazujo souhoiy
za zlIau ulIunI ual. Koncoco souhoiu jo lal zaloionn, zo hy iouslava jIno moznoslI uIaIa vlsIn
IIuI iohIomy. Ohiazn iocono, vs ocIlac so loI v souhoiocl.
11.2. ClonI z loxlovycl souhoiu
Noz muzomo zo souhoiu cIsl, musImo joj oloviIl. OlvIinI souhoiu v Pyllonu uz nomolIo hyl jounouussI.
a_file = open('examples/chinese.txt', encoding='utf-8')
V Pyllonu najuomo zahuuovanou IunlcI open(), lloi iohIi jmono souhoiu jalo aigumonl. Jmonom
souhoiu jo zuo 'examples/chinese.txt'. Na uvouonom jmon souhoiu najuomo l zajImavoslI:
1. NonI lo oulo jmono souhoiu. Jo lo lomhInaco auiosiovo cosly a jmona souhoiu. HyololIcl
Iunlco io olvIinI souhoiu hy molIa ozauoval uva aigumonly auiosiovou coslu a jmono
souhoiu. AIo Iunlco open() ozauujo jon jouon. KuyloIIv so o vs v Pyllonu ozauujo ,jmono
souhoiu, muzolo uo nj zalinoul lalo coIou auiosiovou coslu noho jojI csl.
2. Ivouon auiosiov cosla ouzIv noimInI IomIllo, aIo nouiosnII jsom, jaly ooiacnI syslom
ouzIvm. WInuovs ouzIvajI io ouuIovnI ouauiosiu zln IomIlla, zalImco Mac OS X
a LInux ouzIvajI ohycojn IomIlla. AIo v Pyllonu IungujI ohycojn IomIlla I ou WInuovs.
8. Ivouon auiosiov cosla nozacIn IomIllom noho Ismonom uIslu, lalzo jI nazyvmo reu|vn
te:|u. MolII hyslo so zolal ioIalIvnI l comu Zaclovojlo lIIu.
4. Jo lo iolzoc. Vsoclny mouoinI ooiacnI syslomy (uolonco I WInuovs!) ulIuajI jmona souhoiu
a auiosiu v InIcouo. Pyllon 8 In ouoiujo jmona cosl, lloi nomusI hyl vyliaun v ASCII.
. A nomusI vosl jon na vs IolInI uIsl. Muzolo mIl iIojony sIlovy uIsl. Dany ,souhoi muzo
hyl IIllIvnI soucslI zcoIa vIiluInIlo souhoiovolo syslomu. Poluu joj vs ocIlac ovazujo
za souhoi a muzo l nmu jalo l souhoiu iIsluoval, muzo joj Pyllon oloviIl lalo.
AIo voInI Iunlco open() noloncI zaunIm jmona souhoiu. Mmo zuo uaIsI aigumonl nazvany encoding
(louovnI). No nazuai. To znI iIsoin ovuom.
11.2.1. KouovnI znalu vyslilujo svou oslIIvou lIavu
Bajly jsou hajly, znaly jsou ahslialco. Rolzoc jo osIounoslI znalu v InIcouo. AIo souhoi na uIslu
nonI osIounoslI InIcouo znalu. Souhoi na uIslu jo osIounoslI hajlu. Talzo jal Pyllon iovuI o-
sIounosl hajlu na osIounosl znalu, luyz clomo ,loxlovy souhoi z uIslu Dolouujo hajly ouIo uicI-
lolo aIgoiIlmu io louovnI znalu a viacI osIounosl znalu v InIcouo (znmou lalo jalo iolzoc).
11.1. Ponoimo so
11.2. ClonI z loxlovycl souhoiu
238
# Tento pklad byl vytvoen pod Windows. Z dvod popsanch
# ne se na ostatnch platformch me chovat jinak.
>>> file = open('examples/chinese.txt')
>>> a_string = file.read()
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "C:\Python31\lib\encodings\cp1252.py", line 23, in decode
return codecs.charmap_decode(input,self.errors,decoding_table)[0]
UnicodeDecodeError: 'charmap' codec can't decode byte 0x8f in position 28: character maps to <undefined>
>>>
Co so lo vIasln slaIo NouicIII jsmo znalovo louovnI, lal-
zo Pyllon hyI uonucon ouzIl vyclozI louovnI. Co lo jo
vyclozI louovnI Poluu so oiun ouIvmo na liasova-
cI vyIs, vIuImo, zo sloncII uvnIli cp1252.py. To znamon,
zo Pyllon ouzII jalo vyclozI louovnI CP-122. (CP-122
jo hzno louovnI, lloio so ouzIv na ocIlacIcl s MIcio-
soIl WInuovs. To so lyl zaunI Lvioy. CoslIna a sIovonslIna ouzIvajI louovnI CP-12u.) Znalov
saua CP-122 noouoiujo znaly, lloio so v souhoiu naclzojI, lalzo clonI soIlv s nolnou clyhou
UnicodeDecodeError.
AIo oclojlo. Ono jo lo josl loisI! VyclozI louovnI jo z0v:6 nu u|[orm6, lalzo slojny lou hy na
vasom ocIlacI Iungoval moh (oluu hy vasIm vyclozIm louovnIm hyIo UTF-8). AIo oluu iogiam
ionosolo l nlomu jInomu (luo ouzIv jIno vyclozI louovnI, jalo lioha CP-122), uojuo l soIlnI.
> Poluu oliohujolo zjIslIl vyclozI znalovo louovnI, Imoilujlo mouuI locale a zavoIojlo
locale.getpreferredencoding(). Na mom Ialou s WInuovs Iunlco viacI 'cp1252', aIo
na mom IInuxovom sliojI v loinIm olojI so viacI 'UTF8'. Nojsom scloon uuizol slouu
uolonco anI vo svom vIaslnIm uom! Vo vasom iIau molou hyl vysIouly jIno (uolonco
I ou WInuovs) v zvIsIoslI na voizI ooiacnIlo syslomu, lloiy jslo naInslaIovaII, a na lonII-
guiacI iogIonInIcl a jazylovycl naslavonI. To jo uuvou, ioc jo lal uuIozIlo uvul louovnI
olazuo, luyz olvIimo souhoi.
11.2.2. Ohjolly lyu slioam
ZalIm vImo jon lo, zo Pyllon m zahuuovanou IunlcI zvanou open(). Iunlco open() viacI oIjeL| |yu
:|reum (clI }sliIm], iouu ual), lloiy oslylujo molouy a aliIhuly io zIslvnI InIoimacI o iouuu
znalu a io manIuIacI s nIm.
11.2. ClonI z loxlovycl souhoiu
Vchoz kdovn je zvisl
na platform.
239
>>> a_file = open('examples/chinese.txt', encoding='utf-8')
>>> a_file.name }1]
'examples/chinese.txt'
>>> a_file.encoding }2]
'utf-8'
>>> a_file.mode }8]
'r'
}1] AliIhul name zaclycujo jmono, lloio jsmo iI olvIinI souhoiu iouaII IunlcI open(). NonI
uiavono uo ouohy ahsoIulnI cosly.
}2] Pouohn aliIhul encoding zaclycujo louovnI, lloio jsmo iI olvIinI souhoiu iouaII IunlcI
open(). Poluu hyslo iI olvIinI souhoiu louovnI nouvouII (nooiuny vyvoji!), al hy
aliIhul encoding ouovIuaI vysIoulu locale.getpreferredencoding().
}8] Z aliIhulu mode oznmo, v jalom iozImu hyI souhoi olovion. IunlcI open() muzomo ioual
noovInny aiamoli mode (iozIm). PiI olvIinI lololo souhoiu jsmo iozIm nouicIII, lalzo Pyllon
ouzIjo vyclozI lounolu 'r', lloi m vyznam ,oloviIl jon io clonI, v loxlovom iozImu. Jal
uvIuImo v lolo laIloIo ozujI, InI iozIm olovionI souhoiu nloIIl coIu. Ruzno iozImy nm
umoznI uo souhoiu zaIsoval, iIojoval na lonoc souhoiu noho olvIial souhoi v hIninIm
iozImu (vo lloiom mIslo s iolzcI iacujomo s hajly).
> Soznam vsocl moznycl iozImu najuolo v uolumonlacI io IunlcI open().
11.2.8. ClonI ual z loxlovolo souhoiu
Po olovionI souhoiu io clonI z nj iavuouohn v uicIlom mIsl huuolo cllIl cIsl.
>>> a_file = open('examples/chinese.txt', encoding='utf-8')
>>> a_file.read() }1]
'Dive Into Python Python \n'
>>> a_file.read() }2]
''
}1] JalmIIo souhoi oloviomo (iI zaunI sivnolo louovnI), socIv clonI z nj v ioslom voInI
molouy read() ohjollu lyu slioam. VysIoulom jo iolzoc.
}2] Tioclu iolvaujIcI jo mozn lo, zo uaIsI clonI zo souhoiu novyvoI vyjImlu. Pyllon noova-
zujo clonI za loncom souhoiu za clyhu. VilI so jounouuso izuny iolzoc.
A co luyhyclom cllII souhoi cIsl znovu
11.2. ClonI z loxlovycl souhoiu
Pi otvrn souboru vdy
uvdjte parametr encoding.
240
# pokraovn pedchozho pkladu
>>> a_file.read() }1]
''
>>> a_file.seek(0) }2]
0
>>> a_file.read(16) }8]
'Dive Into Python'
>>> a_file.read(1) }4]
' '
>>> a_file.read(1)
''
>>> a_file.tell() }]
20
}1] Piolozo jsmo josl oiu na loncI souhoiu, uaIsI voInI molouy read() viacI izuny iolzoc.
}2] Moloua seek() zajIslI iosun v souhoiu na uiconou hajlovou ozIcI.
}8] Molou read() muzomo zaual noovInny aiamoli, lloiy uicujo ocol znalu, lloio so majI nacIsl.
}4] Poluu huuomo cllIl, muzomo cIsl lIIun I o jounom znalu.
}] 16 + 1 + 1 = . 2u
Zlusmo lo znovu.
# pokraovn pedchozho pkladu
>>> a_file.seek(17) }1]
17
>>> a_file.read(1) }2]
''
>>> a_file.tell() }8]
20
}1] Piosunomo so na 17. hajl.
}2] Pioclomo jouon znal.
}8] A najounou jsmo na 2u. hajlu.
Iz jslo na lo iIsII Molouy seek() a tell() ocIlajI vzuy o hajlocl, aIo iolozo jsmo souhoi olovioII
v loxlovom iozImu, clo moloua read() o znutth. Pio zalouovnI cInslycl znalu v UTF-8 oliohu-
jomo vIco hajlu. Pio lazuy angIIcly znal oliohujomo v souhoiu jon jouon hajl, lalzo hy vs lo molIo
svosl l myInomu zviu, zo molouy seek() a read() ocIlajI slojno jounolly. To aIo IalI jon io
nlloio znaly.
AIo momonl, zacIn lo hyl josl loisI!
11.2. ClonI z loxlovycl souhoiu
241
>>> a_file.seek(18) }1]
18
>>> a_file.read(1) }2]
Traceback (most recent call last):
File "<pyshell#12>", line 1, in <module>
a_file.read(1)
File "C:\Python31\lib\codecs.py", line 300, in decode
(result, consumed) = self._buffer_decode(data, self.errors, final)
UnicodeDecodeError: 'utf8' codec can't decode byte 0x98 in position 0: unexpected code byte
}1] Piosunomo so na 18. hajl a zlusImo iocIsl jouon znal.
}2] Pioc lo soIlaIo Piolozo na 18. hajlu nonI znal. NojhIIzsI znal zacIn na 17. hajlu (a zahIi liI hajly).
Polus o clonI znalu ou sliouu jolo louovano osIounoslI vouo l clyh UnicodeDecodeError.
11.2.4. ZavIinI souhoiu
Oloviono souhoiy zahIiajI syslomovo iosliouly a v zvIsIoslI na iozImu olovionI souhoiu l nIm nllo-
io iogiamy nomusI hyl sclony iIsluoval. Piolo jo uuIozIlo, ahyclom souhoiy zavIiaII lnou olo,
co s nImI ioslanomo iacoval.
# pokraovn pedchozho pkladu
>>> a_file.close()
Tal |ohe hyIo zlIamnI.
Ohjoll a_file lyu slioam oiu oxIslujo. VoInI jolo molouy close() novouo l jolo ziusonI. AIo uz
nonI njal zvIsl uzIlocny.
# pokraovn pedchozho pkladu
>>> a_file.read() }1]
Traceback (most recent call last):
File "<pyshell#24>", line 1, in <module>
a_file.read()
ValueError: I/O operation on closed file.
>>> a_file.seek(0) }2]
Traceback (most recent call last):
File "<pyshell#25>", line 1, in <module>
a_file.seek(0)
ValueError: I/O operation on closed file.
>>> a_file.tell() }8]
11.2. ClonI z loxlovycl souhoiu
242
Traceback (most recent call last):
File "<pyshell#26>", line 1, in <module>
a_file.tell()
ValueError: I/O operation on closed file.
>>> a_file.close() }4]
>>> a_file.closed }]
True
}1] Zo zavionolo ohjollu nomuzomo cIsl. VyvoI so lIm vyjImla IOError.
}2] V zavionom souhoiu nomuzomo anI iosunoval ozIcI (sool).
}8] I zavionolo souhoiu nooxIslujo zun alluInI ozIco, lalzo moloua tell() lalo soIzo.
}4] PiolvaonIm mozn jo, zo voInI molouy close() io ohjoll lyu slioam, joloz souhoi hyI uz
zaviony, novyvoI vyjImlu. Juo o izunou ooiacI.
}] Zaviony ohjoll lyu slioam m ioco jon jouon uzIlocny aliIhul. AliIhul closed olvizujo, zo
souhoi hyI uzavion.
11.2.. AulomalIclo zavIinI souhoiu
Ohjolly lyu slioam majI oxIIcIlnI molouu close(), aIo co so slano, luyz jo vo vasom iogiamu clyha
a zlavaiujo ioulIm, noz zavoIlo close() Souhoi hy looiolIcly molI zuslal oloviony mnolom uoIo,
noz hyclom oliohovaII. Poluu ziovna nco IauIlo na svom IolInIm ocIlacI, nonI lo lalovy iohIom.
AIo na ouzIvanom soivoiu uz mozn ano.
Pyllon 2 io lonlo iIau nahIzoI iosonI v ouoh hIolu
try..finally. V Pyllonu 8 lonlo ohial slIo Iungujo. Pio-
lo so s nIm muzolo sollal v louu nlloiycl iogiamloiu
noho vo slaisIm louu, lloiy hyI iovouon io Pyllon 8.
AIo Pyllon 2.6 zavouI cIslsI iosonI, lloio so v Pyllonu 8
slaIo ioIoiovanym. Juo o iIlaz with.
with open('examples/chinese.txt', encoding='utf-8') as a_file:
a_file.seek(17)
a_character = a_file.read(1)
print(a_character)
V lomlo louu so voI open(), aIo nIluo so v nm novoI a_file.close(). PiIlaz with zalajujo hIol
louu ouohn, jalo jo lomu u iIlazu if noho u cylIu for. IvnIli hIolu louu muzomo ouzIval
iomnnou a_file, lloiou ohjoll lyu slioam vilII jalo vysIouol voInI open(). K uIsozIcI mmo
vsoclny ohvylIo molouy ohjollu lyu slioam, jalo jsou seek(), read() a vsoclny oslalnI. Kuyz hIol
with sloncI, Fy|hon uu|omu|tLy zavoI a_file.close().
11.2. ClonI z loxlovycl souhoiu
Konstrukce try..finally je dobr.
with je lep.
243
Kuyz lo slinomo, Pyllon souhoi uzavio nozvIsIo na lom, jal a luy hIol with sloncI... I luyhy ,slon-
cII v uusIoulu noosoliono vyjImly. Tal lo oiavuu jo. I v iIau, luy lou vyvoI vyjImlu a coIy vs
iogiam so sliInIm zaslavI, uolcony souhoi huuo uzavion. Jo lo zaiucono.
> Z loclnIclolo olIouu iIlaz with vylviI ooiacnI lonloxl (iunlImo conloxl). Ohjoll lyu slio-
am jo v lcllo iIlIauocl vyuzIl jalo sivco lonloxlu (conloxl managoi). Pyllon vylvoiI ohjoll
a_file lyu slioam a iolno mu, zo vsluujo uo ooiacnIlo lonloxlu. JalmIIo hIol iIlazu vIll
sloncI, Pyllon suII ohjollu lyu slioam, zo oouslI ooiacnI lonloxl a ohjoll zavoI svou vIaslnI
molouu close(). DolaIIy lIouojlo v iIIozo B, ,TiIuy, lloio molou hyl ouzIly v hIolu vIll.
PiIlaz with nonI nIjal zvIsl zamion na souhoiy. Jo lo iosl ohocny imoc io vylvoionI ooiacnIlo
lonloxlu. Ohjoll so uozvI, zo vsluujo uo ooiacnIlo lonloxlu noho zo z nj vysluujo. Poluu jo uolco-
ny ohjoll lyu slioam, al iovouo uzIlocno ,souhoiovo vcI (jalo jo naiIlIau aulomalIclo uzavionI
souhoiu). AIo lolo clovnI jo uoIInovno uvnIli ohjollu lyu slioam a no v iIlazu with. Sivco lonlox-
lu muzo hyl ouzIl mnola jInymI zusohy, lloio nomajI so souhoiy nIc soIocnolo. Muzolo sI uolonco
vylvoiIl svolo vIaslnIlo sivco lonloxlu. Ilzomo sI lo o nco ozujI, aIo josl v lolo laIloIo.
11.2.6. ClonI ual o iucIcl
,Ruol loxlovolo souhoiu jo lo, co sI mysIIlo, zo hy lo mIo hyl naIsolo i sIov, slIslnolo ENTER
a najounou jslo na novom iulu. Ruol loxlu jo osIounosl znalu ouuIon... cIm vIasln Ono jo lo
lomIIlovano, iolozo loxlovo souhoiy molou io oznaconI lonco iulu ouzIl nloIIl iuznycl zna-
lu. Kazuy ooiacnI syslom m svou vIaslnI lonvoncI. Nlloio ouzIvajI znal nvialu vozIlu (caiiIago
ioluin), jIno ouzIvajI znal ioclouu na novy iuol (IIno Ioou) a nlloio ouzIvajI na loncI lazuolo
iulu oha zmInno znaly.
Tou sI muzolo s Iovou ouuoclnoul, iolozo Fy|hon zrutov0v0 Lonte I0dL uu|omu|tLy. Poluu iolnolo
,clcI iocIsl lonlo loxlovy souhoi iuol o iulu, Pyllon zjIslI, lloiy ly loncu iulu so v loxlovom
souhoiu ouzIv, a zaiIuI, zo lo iosl huuo Iungoval.
> Poluu oliohujolo zIslal uolaIInI lonlioIu nau lIm, co so ovazujo za lonoc iulu, muzolo IunlcI
open() ioual noovInny aiamoli newline. DolaIIy najuolo v uolumonlacI Iunlco open().
Talzo jal so lo vIasln uI Cllo zo souhoiu o iucIcl. Jo lo lal jounouuclo. V jounouucloslI jo lisa.
line_number = 0
with open('examples/favorite-people.txt', encoding='utf-8') as a_file: }1]
for a_line in a_file: }2]
line_number += 1
print('{:>4} {}'.format(line_number, a_line.rstrip())) }8]
11.2. ClonI z loxlovycl souhoiu
Ka.
244
}1] PouzIlIm vzoiu with uoslnomo hozocnolo olovionI souhoiu a noclmo Pyllon, ahy lo za-
vioI za ns.
}2] Pio clonI souhoiu o iucIcl vyuzIjomo cylIus for. To jo vso. Ohjolly lyu slioam ouoiujI
molouy jalo read(), aIo liom lolo je oIjeL| |yu :|reum |uL6 |er0|orem, lloiy vilI jouon iuol
olazuo, luyz joj ozulo o uaIsI lounolu.
}8] CIsIo iulu a iuol samolny muzomo zohiazIl s vyuzIlIm iolzcovo molouy format(). SocI-
IIlloi Ioimlu {:>4} iIl ,vylIslnI lonlo aigumonl zaiovnany uoiava na sIilu clyi ozIc.
Piomnn a_line ohsalujo coIy iuol, vcoln znalu uloncujIcIcl iuol. Rolzcov moloua
rstrip() ouslianI vsoclny loncovo hIIo znaly (vlIlosaco) vcoln znalu uloncujIcIcl iuol.
you@localhost:~/diveintopython3$ python3 examples/oneline.py
1 Dora
2 Ethan
3 Wesley
4 John
5 Anne
6 Mike
7 Chris
8 Sarah
9 Alex
10 Lizzie
SollaII jslo so s nsIouujIcI clyhou
you@localhost:~/diveintopython3$ python3 examples/oneline.py
Traceback (most recent call last):
File "examples/oneline.py", line 4, in <module>
print('{:>4} {}'.format(line_number, a_line.rstrip()))
ValueError: zero length field name in format
Poluu ano, iavuouohn ouzIvlo Pyllon 8.u. MII hyslo iovosl alluaIIzacI na Pyllon 8.1.
Pyllon 8.u sIco ouoiujo novy zusoh IoimlovnI iolzcu, aIo vyzauujo oxIIcIlnI IoimlovnI
socIIIlloiu Ioimlu. Pyllon 8.1 vm umoznI vo socIIIlloiocl Ioimlu Inuoxy aigumonlu
vynoclval. Voizo lomalIhIInI s Pyllonom 8.u jo io oiovnnI zuo:
print('{0:>4} {1}'.format(line_number, a_line.rstrip()))
11.2. ClonI z loxlovycl souhoiu
245
11.8. ZIs uo loxlovycl souhoiu
Do souhoiu muzomo zaIsoval voImI ouohnym zuso-
hom, jalym z nIcl clomo. Souhoi nojuiIvo oloviomo
a zIslmo ohjoll lyu slioam. Pio zIs uo souhoiu
ouzIjomo jolo molouy. Nalonoc souhoi zaviomo.
PiI olvIinI souhoiu io zIs ouzIjomo IunlcI open() a iouoIsomo iozIm zIsu. I souhoiu muzo-
mo ouzIl uva iozImy zIsu:
- RozIm ,viIlo (zIs) vouo l iosnI ohsalu souhoiu. IunlcI open() ioumo mode='w'.
- RozIm ,aonu iIuv uala na lonoc souhoiu. IunlcI open() ioumo mode='a'.
Poluu souhoi uosuu nooxIslujo, huuo iI ohou uvouonycl iozImocl vylvoion aulomalIcly. To znamon,
zo so nIluy nomusImo IIal s IunlcnoslI jalo ,oluu souhoi josl nooxIslujo, vylvoi novy, izuny
souhoi, ahyclom joj molII oivo oloviIl. Piosl souhoi oloviomo a zacnomo zaIsoval.
JalmIIo zIs uo souhoiu uoloncImo, mII hyclom joj vzuy zaviIl, ahy uosIo l uvoInnI uosliIloiu
souhoiu (IIIo lanuIo) a ahyclom zajIslIII, zo uosIo lo slulocnomu zIsu ual na uIsl. Slojn jalo v iIau
clonI ual muzomo souhoi zaviIl voInIm molouy close() ohjollu lyu slioam noho muzomo ouzIl iIlaz
with a ioual slaiosl o zavionI souhoiu Pyllonu. VsauIm so, zo ulounolo, lloiou loclnIlu uooiucujI.
>>> with open('test.log', mode='w', encoding='utf-8') as a_file: }1]
... a_file.write('test succeeded') }2]
>>> with open('test.log', encoding='utf-8') as a_file:
... print(a_file.read())
test succeeded
>>> with open('test.log', mode='a', encoding='utf-8') as a_file: }8]
... a_file.write('and again')
>>> with open('test.log', encoding='utf-8') as a_file:
... print(a_file.read())
test succeededand again }4]
}1] ZacaII jsmo ouvzn vylvoionIm novolo souhoiu test.log (noho iosnIm oxIslujIcIlo sou-
hoiu) a jolo olovionIm io zIs. Paiamoli mode='w' znamon ,oloviI souhoi io zIs. Ano,
jo lo oiavuu lal nohozocno, jal lo znI. DouIm, zo vm na uiIvjsIm ohsalu lololo souhoiu
nozIozoIo (oluu oxIslovaI), iolozo jolo ohsal iv zmIzoI.
}2] Do nov olovionolo souhoiu muzomo uala iIuval molouou write() ohjollu, lloiy vilIIa
Iunlco open(). JalmIIo hIol with sloncI, Pyllon souhoi aulomalIcly uzavio.
}8] To hyIo zhavno. Zlusmo lo znovu. AIo lonlolil ouzIjomo mode='a', ahyclom mIslo iosnI
souhoiu iIojIII uala na jolo lonoc. PiIsnI na lonoc (aonu) nLdy noznIcI oxIslujIcI
ohsal souhoiu.
11.8. ZIs uo loxlovycl souhoiu
Soubor prost otevete
a zante zapisovat.
246
}4] Jal uvoun zasany iuol, lal uiuly iuol, lloiy jsmo iIojIII lou, so naclzojI v souhoiu
test.log. VsImnlo sI lalo, zo noiIhyIy zuno znaly io nvial vozIlu noho io ouiulov-
nI. Souhoi jo noohsalujo, iolozo jsmo jo uo nj anI iI jouno iIIozIloslI oxIIcIln nozasaII.
Znal io nvial vozIlu (caiiIago ioluin) muzomo zasal jalo '\r', znal io ouiulovnI (IIno
Ioou) muzomo zasal '\n'. Piolozo jsmo nIc z lolo nouuIaII, sloncIIo vso, co jsmo zasaII
uo souhoiu, na jouInom iulu.
11.8.1. A znovu louovnI znalu
VsImII jslo sI aiamoliu encoding, lloiy jsmo iI olvIinI souhoiu io zIs iouvaII IunlcI open()
Jo uuIozIly. NIluy lo novynoclvojlo! Jal jsmo sI ulzaII na zacllu laIloIy, souhoiy noohsalujI
iolzco. Souhoiy ohsalujI hajly. Z loxlovolo souhoiu muzomo cIsl ,iolzco jon uIly lomu, zo jsmo
Pyllonu iolII, jalo m iI iovouu iouuu hajlu na iolzoc ouzIl louovnI. ZIs loxlu uo souhoiu
iouslavujo slojny iohIom, jon z oacno sliany. Do souhoiu nomuzomo zaIsoval znaly, iolozo
znaly jsou ahsliallnI. PiI zIsu uo souhoiu musI Pyllon vul, jal m iolzco iovul na osIou-
nosl hajlu. JouIny zusoh, jal so ujIslIl, zo so iovouo sivny iovou, socIv v uvouonI aiamoliu
encoding iI olvIinI souhoiu io zIs.
11.4. BIninI souhoiy
Vsoclny souhoiy noohsalujI loxl. Nlloio molou ohsaloval ohizly molo sa.
>>> an_image = open('examples/beauregard.jpg', mode='rb') }1]
>>> an_image.mode }2]
'rb'
>>> an_image.name }8]
'examples/beauregard.jpg'
>>> an_image.encoding }4]
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
AttributeError: '_io.BufferedReader' object has no attribute 'encoding'
}1] OlovionI souhoiu v hIninIm iozImu jo jounouuclo, aIo zIuuno. Vo siovnnI s olvIinIm v loxlo-
vom iozImu socIv jouIny iozuII v lom, zo aiamoli mode ohsalujo znal 'b'.
}2] Ohjoll lyu slioam, lloiy zIslmo olovionIm souhoiu v hIninIm iozImu, m mnolo slojnycl aliI-
hulu, vcoln aliIhulu mouo, lloiy ouovIu slojnojmonnomu aiamoliu iouanomu IunlcI open().
}8] BIninI ohjolly lyu slioam majI lalo aliIhul name slojn jalo loxlovo ohjolly lyu slioam.
}4] AIo jouon iozuII lauy ioslo jo. BIninI ohjolly lyu slioam nomajI aliIhul encoding. Dv lo
smysI, zo Clomo (noho zaIsujomo) hajly a no iolzco. Pyllon louy nomusI uIal zuny iovou.
Z hIninIlo souhoiu uoslanomo iosn lo, co jsmo uo nj vIozIII. Zun lonvoizo nonI nuln.
11.4. BIninI souhoiy
247
Iz jsom iolI, zo clomo hajly Ano, jo lo lal.
# pokraovn pedchozho pkladu
>>> an_image.tell()
0
>>> data = an_image.read(3) }1]
>>> data
b'\xff\xd8\xff'
>>> type(data) }2]
<class 'bytes'>
>>> an_image.tell() }8]
3
>>> an_image.seek(0)
0
>>> data = an_image.read()
>>> len(data)
3150
}1] Slojn jalo v iIau loxlovycl souhoiu lalo z hIninIcl souhoiu muzomo cIsl o louscIcl.
AIo jo lu jouon zsaunI iozuII...
}2] ... clomo hajly, no iolzco. Piolozo jsmo souhoi olovioII v hIninIm iozImu, iohIi moloua
read() jalo aigumonl ocol Iuj|, lloio so majI nacIsl, a no ocol znalu.
}8] To znamon, zo zuo nIluy nouojuo l noocolvanomu nosouIauu mozI cIsIom, lloio jsmo iouaII
molou read(), a ozIcnIm Inuoxom, lloiy nm viacI moloua tell(). Moloua read() clo hajly
a molouy seek() a tell() sIouujI ocol ioclonycl hajlu. I hIninIcl souhoiu huuou vzuy
v souIauu.
11.. Ohjolly lyu slioam z nosouhoiovycl zuioju
Piouslavlo sI, zo Isolo lnIlovnu a jouna z vasIcl lnIlovnIcl IunlcI m cIsl uala zo souhoiu. Iunlco
hy molIa jounouuso iovzIl jmono souhoiu v iolzcovo ouoh, oloviIl souhoi io clonI, iocIsl jolo
ohsal a iou slonconIm Iunlco joj uzaviIl. AIo lallIo hyslo lo uIal nomII. MIslo lolo hy iozlianI
vasI Iunlco (API) mIo iohIial libnvnlny nb|okt typu stroum.
V nojjounouussIm iIau jo ohjollom lyu slioam
coloIIv, co m molouu read(), lloi iohIi noovInny
aiamoli size (voIIlosl) a viacI iolzoc. Poluu jo moloua
read() zavoIna hoz uvouonI aiamoliu size, mIa hy zo
zuiojo InIoimacI iocIsl vsoclna zhyvajIcI uala a vilIl jo
jalo jounu lounolu. Poluu jo moloua zavoIna s aiamol-
11.. Ohjolly lyu slioam
z nosouhoiovycl zuioju
Z pedstranho souboru teme
jednodue volnm read().
248
iom size, ioclo zo zuiojo ozauovano mnozslvI ual a vilI jo. Poluu jo zavoIna znovu, oliacujo
ou mIsla, luo so clonIm ioslaIa, a viacI uaIsI csl ual.
Vyau lo, jalo luyhyclom ouzIvaII ohjoll lyu slioam vznIlIy olovionIm slulocnolo souhoiu. Roz-
uII jo v lom, zo so neomezujeme nu :Lu|etn6 :ouIory. Zuiojom InIoimacI, zo lloiolo ,clomo, muzo hyl
coloIIv: vohov slinla, iolzoc v amlI noho uolonco vyslu z jInolo iogiamu. Poluu vaso Iunlco
iohIi ohjoll lyu slioam a jounouuso voI jolo molouu read(), muzolo ziacovval IIhovoIny zuioj
InIoimacI, lloiy so lviI jalo souhoi, anIz hyslo musoII io lazuy uiul vsluu sl iuzny lou.
>>> a_string = 'PapayaWhip is the new black.'
>>> import io }1]
>>> a_file = io.StringIO(a_string) }2]
>>> a_file.read() }8]
'PapayaWhip is the new black.'
>>> a_file.read() }4]
''
>>> a_file.seek(0) }]
0
>>> a_file.read(10) }6]
'PapayaWhip'
>>> a_file.tell()
10
>>> a_file.seek(18)
18
>>> a_file.read()
'new black.'
}1] MouuI io uoIInujo liIuu StringIO, lloiou muzomo uoslnoul lolo, ahy so iolzoc v amlI
clovaI jalo souhoi.
}2] Kuyz clcomo z iolzco vylvoiIl ohjoll lyu slioam, vylvoiImo InslancI liIuy io.StringIO()
a ioumo jI iolzoc, lloiy clcomo ouzIl jalo zuioj ,souhoiovycl ual. Tou mmo l uIsozIcI
ohjoll lyu slioam a muzomo s nIm uIal vsoclny mozno ouovIuajIcI vcI.
}8] VoInIm molouy read() ,ioclomo coIy ,souhoi. V lalovom iIau ohjoll liIuy StringIO
jounouuso vilI uvounI iolzoc.
}4] Oalovano voInI molouy read() viacI izuny iolzoc slojn jalo u oiavuovolo souhoiu.
}] PouzIlIm molouy seek() ohjollu liIuy StringIO so muzomo oxIIcIln naslavIl na zaclol
iolzco slojn jalo iI voInI lozo molouy u oiavuovolo souhoiu.
}6] Poluu molou read() ioumo aiamoli size, muzomo cIsl o vlsIcl louscIcl I z iolzco.
> TiIua io.StringIO vm umoznI cloval so l iolzcI jalo l loxlovomu souhoiu. LxIslujo lalo
liIua io.BytesIO, lloi vm umoznI cloval so l oII hajlu jalo l hIninImu souhoiu.
11.. Ohjolly lyu slioam
z nosouhoiovycl zuioju
249
11..1. Pico s lomiImovanymI souhoiy
Pyllonovsl slanuaiunI lnIlovna ohsalujo mouuIy, lloio ouoiujI clonI a zIs lomiImovanycl
souhoiu. Ruznycl lomiImacnIcl sclomal oxIslujo coI iaua. MozI novInuovsovslymI syslomy aliI
mozI uva nojouIinjsI gzip a bzip2. (MolII jslo so sollal lalo s aiclIvy PKZIP a s aiclIvy GNI Tai.
V Pyllonu najuolo mouuIy I io lylo uva.)
MouuI gzip nm umoznI vylvoiIl ohjoll lyu slioam io clonI a zIs souhoiu lomiImovanycl
aIgoiIlmom gzip. PiIsIusny ohjoll ouoiujo molouu read() (oluu jsmo joj olovioII io clonI) noho
molouu write() (oluu jsmo joj olovioII io zIs). To znamon, zo L Im6mu z0:u neIo t|en :ouIo-
r Lomrmovunyth ugor|mem gz muzomo ouzIl molouy, lloio jsmo so uz naucIII ouzIval s noimI-
nImI souhoiy. NomusImo vylviol omocno souhoiy l ulIunI uolomiImovanycl ual.
Jalo honus navIc ouoiujo mouuI gzip I iIlaz with, lalzo uzavionI lomiImovanolo souhoiu muzo-
lo onoclal na Pyllonu.
you@localhost:~$ python3
>>> import gzip
>>> with gzip.open('out.log.gz', mode='wb') as z_file: }1]
... z_file.write('A nine mile walk is no joke, especially in the rain.'.encode('utf-8'))
...
>>> exit()
you@localhost:~$ ls -l out.log.gz }2]
-rw-r--r-- 1 mark mark 79 2009-07-19 14:29 out.log.gz
you@localhost:~$ gunzip out.log.gz }8]
you@localhost:~$ cat out.log }4]
A nine mile walk is no joke, especially in the rain.
}1] Souhoiy zahaIono gzip hyclom mII vzuy olvIial v hIninIm iozImu. (VsImnlo sI znalu 'b'
v aigumonlu mode.)
}2] Tonlo iIlIau jsom vylvoiII na LInuxu. Poluu vm lonlo iIlazovy iuol nIc noiIl, zohiazujo
vyIs oIozly souhoiu ,v uIoulom Ioimlu (v iacovnIm auiosiI). Souhoi jsmo iv vylvo-
iIII v yllonovslom sloIIu s vyuzIlIm lomioso gzip. Tonlo souhoi ulazujo, zo souhoi oxIslujo
(Iajn) a zo m voIIlosl 7u hajlu. Vo slulocnoslI jo vlsI noz iolzoc, so lloiym jsmo zacaII! Sou-
hoi vo Ioimlu gzI zalinujo lIavIclu ovno uoIly, lloi ohsalujo njalo InIoimaco o souhoiu.
Pio voImI maIo souhoiy jo lo louy nooIollIvnI.
}8] PiIlaz gunzip (vysIovujo so ,uzI anzI) uolomiImujo uany souhoi a ulIu jolo ohsal
uo novolo souhoiu so slojnym jmonom, aIo hoz iIony .gz.
}4] PiIlaz cat zohiazujo ohsal souhoiu. Souhoi ohsalujo iolzoc, lloiy jsmo uvoun zasaII
v yllonovslom sloIIu iImo uo lomiImovanolo souhoiu out.log.gz.
11.. Ohjolly lyu slioam
z nosouhoiovycl zuioju
250
SollaII jslo so s nsIouujIcI clyhou
>>> with gzip.open('out.log.gz', mode='wb') as z_file:
... z_file.write('A nine mile walk is no joke, especially in the
rain.'.encode('utf-8'))
...
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
AttributeError: 'GzipFile' object has no attribute '__exit__'
Poluu ano, iavuouohn ouzIvlo Pyllon 8.u. MII hyslo iovosl alluaIIzacI na Pyllon 8.1.
V Pyllonu 8.u so sIco mouuI gzip naclzoI, aIo noouoiovaI ouzIlI ohjollu lomiImovanycl
souhoiu jalo sivcu lonloxlu. V Pyllonu 8.1 hyIa iIuna moznosl ouzIval ohjolly gzip souhoiu
I v iIlazu with.
11.6. SlanuaiunI vslu, vyslu a clyhovy vyslu
MacliI na icI ios iIlazovy iuol uz loncol slanuaiunIlo vsluu, slanuaiunIlo vysluu a slan-
uaiunIlo clyhovolo vysluu znajI. Talo oulaIloIa jo uicona lm oslalnIm.
SlanuaiunI vyslu a slanuaiunI clyhovy vyslu (hzn
so zliacujI jalo stdout a stderr) jsou iouiy (Io), lloio
jsou zahuuovny uo lazuolo syslomu, lloiy jo ouvozon
ou UNIXU. PIalI lo I io Mac OS X a io LInux. Poluu
voIlo IunlcI print(), lIslny ohsal jo ouosIn uo iouiy
stdout. Poluu vs iogiam zlavaiujo a lIslno liasovacI
vyIs, osII joj uo iouiy stderr. Vo vyclozIm slavu jsou
oh uvouono iouiy naojony na loimInIovo olno, vo lloiom iacujolo. Kuyz vs iogiam nco lIslno,
zohiazujo so jolo vyslu vo vasom loimInIovom oln. Kuyz iogiam zlavaiujo, vIuIlo liasovacI vyIs
lalo vo svom loimInIovom oln. V giaIIclom yllonovslom sloIIu jsou iouiy stdout and stderr
iosmiovny uo vasolo ,InloiallIvnIlo olna.
>>> for i in range(3):
... print('PapayaWhip') }1]
PapayaWhip
PapayaWhip
PapayaWhip
>>> import sys
>>> for i in range(3):
11.6. SlanuaiunI vslu, vyslu
a clyhovy vyslu
sys.stdin,
sys.stdout,
sys.stderr.
251
... l = sys.stdout.write('is the') }2]
is theis theis the
>>> for i in range(3):
... l = sys.stderr.write('new black') }8]
new blacknew blacknew black
}1] Iunlco print() voIan v cylIu. Tauy nIc iolvaujIcIlo nonajuomo.
}2] stdout jo uoIInovn v mouuIu sys a juo o ohjoll lyu slioam. Kuyz zavoImo jolo molouu
write(), vylIslno lazuy iolzoc, lloiy jI ioumo. Iunlco print vo slulocnoslI uI iv lolIo.
Na lonoc lazuolo lIslnolo iolzco iIu znal uloncujIcI iuol a al voI sys.stdout.write.
}8] V nojjounouussIm iIau osIIajI sys.stdout a sys.stderr vyslu uo slojnolo mIsla:
uo yllonovslolo Inlogiovanolo vyvojovolo iosliouI (IDE, oluu v nm iacujomo) noho
uo loimInIovolo olna (oluu Pyllon souslImo z iIlazovolo iulu). SlanuaiunI clyhovy
vyslu (slojn jalo slanuaiunI vyslu) ioclou na novy iuol noiIuvajI. Poluu clcomo iojIl
na novy iuol, musImo zasal iIsIusno znaly io ioclou na novy iuol.
sys.stdout a sys.stderr jsou ohjolly lyu slioam, aIo u so uo nIcl ouzo zaIsoval. Polus o voInI
jojIcl molouy read() vzuy vyvoI vyjImlu IOError.
>>> import sys
>>> sys.stdout.read()
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
IOError: not readable
11.6.1. PiosmiovnI slanuaiunIlo vysluu
sys.stdout a sys.stderr jsou ohjolly lyu slioam, I luyz ouoiujI ouzo zIs. AIo nojsou lonslanl-
nI. Juo o iomnno. To znamon, zo uo nIcl muzomo iIiauIl novou lounolu njaly jIny ohjoll
lyu slioam a iosmioval jojIcl vyslu.
import sys
class RedirectStdoutTo:
def __init__(self, out_new):
self.out_new = out_new
def __enter__(self):
self.out_old = sys.stdout
sys.stdout = self.out_new
11.6. SlanuaiunI vslu, vyslu
a clyhovy vyslu
252
def __exit__(self, *args):
sys.stdout = self.out_old
print('A')
with open('out.log', mode='w', encoding='utf-8') as a_file, RedirectStdoutTo(a_file):
print('B')
print('C')
PouIvojlo so na lolIo:
you@localhost:~/diveintopython3/examples$ python3 stdout.py
A
C
you@localhost:~/diveintopython3/examples$ cat out.log
B
SollaII jslo so s nsIouujIcI clyhou
you@localhost:~/diveintopython3/examples$ python3 stdout.py
File "stdout.py", line 15
with open('out.log', mode='w', encoding='utf-8') as a_file, RedirectStdoutTo(a_file):
^
SyntaxError: invalid syntax
Poluu ano, iavuouohn ouzIvlo Pyllon 8.u. MII hyslo iovosl alluaIIzacI na Pyllon 8.1.
Pyllon 8.u ouoiovaI iIlaz with, aIo lazuy iIlaz molI ouzIval jon jounolo sivco lonloxlu.
Pyllon 8.1 umozujo ouzIl v jounom iIlazu with vIco sivcu lonloxlu.
PouIvojmo so nojuiIvo na osIounI csl.
print('A')
with open('out.log', mode='w', encoding='utf-8') as a_file, RedirectStdoutTo(a_file):
print('B')
print('C')
TonlIo iIlaz with jo uocoIa lomIIlovany. PioIsu lo uo lioclu siozumIloInjsI ouohy.
with open('out.log', mode='w', encoding='utf-8') as a_file:
with RedirectStdoutTo(a_file):
print('B')
11.6. SlanuaiunI vslu, vyslu
a clyhovy vyslu
253
Z ioIsu jo vIul, zo vo slulocnoslI juo o uva iIlazy with, z nIclz jouon jo zanoion uo uiulolo.
,VnjsI iIlaz with hy nm mI hyl ovuomy. OlvIi loxlovy souhoi zalouovany v UTF-8 a ojmo-
novany out.log io zIs a iIiazujo ohjoll lyu slioam uo iomnno ojmonovano a_file. AIo jo lu
josl jouna zvIslnosl.
with RedirectStdoutTo(a_file):
Kuoal jo csl as PiIlaz with jI vo slulocnoslI novyzauujo. Pouohn, jalo luyz voIlo IunlcI a Ignoiu-
jolo jojI nvialovou lounolu, muzolo ouzIl I iIlaz with, lloiy noiIiazujo lonloxl iIlazu with
uo njalo iomnno. V lomlo iIau ns zajImajI ouzo vouIojsI oIolly lonloxlu RedirectStdoutTo.
A jalo jsou ly vouIojsI oIolly NalIounmo uo liIuy RedirectStdoutTo. Talo liIua jo uzIvaloIsly uoII-
novanym sivcom lonloxlu. RoII sivco lonloxlu muzo lil lazu Iunlco, lloi uoIInujo socIInI
molouy __enter__() a __exit__().
class RedirectStdoutTo:
def __init__(self, out_new): }1]
self.out_new = out_new
def __enter__(self): }2]
self.out_old = sys.stdout
sys.stdout = self.out_new
def __exit__(self, *args): }8]
sys.stdout = self.out_old
}1] Moloua __init__() so voI hozioslioun o vylvoionI Inslanco. PiohIi jouon aiamoli
ohjoll lyu slioam, lloiy clcomo o uohu zIvolnoslI lonloxlu ouzIval jalo slanuaiunI vyslu.
Moloua uIozI oulaz na ohjoll lyu slioam uo InslancnI iomnno, ahy joj molIy ozujI ouzI-
val oslalnI molouy.
}2] Moloua __enter__() aliI mozI socIInI molouy liIuy. Pyllon jI voI v olamzIlu vsluu
uo lonloxlu (lj. na zacllu iIlazu with). Moloua ulIu alluInI lounolu sys.stdout
uo self.out_old a olo iosmiujo slanuaiunI vyslu iIiazonIm self.out_new uo sys.stdout.
}8] Moloua __exit__() jo uaIsI socIInI molouou liIuy. Pyllon jI voI iI oouslnI lonloxlu
(lj. na loncI iIlazu with). Moloua ohnovI uvounI nasmiovnI slanuaiunIlo vysluu
iIiazonIm uIozono lounoly self.out_old uo sys.stdout.
11.6. SlanuaiunI vslu, vyslu
a clyhovy vyslu
254
Sojmo lo vsoclno uoliomauy:
print('A') }1]
with open('out.log', mode='w', encoding='utf-8') as a_file, RedirectStdoutTo(a_file): }2]
print('B') }8]
print('C') }4]
}1] VysIouol so vylIslno v ,InloiallIvnIm oln IDE (noho v loimInIovom oln, oluu sliIl
souslImo z iIlazovolo iulu).
}2] Tonlo iIlaz with iohIi t0rLou odd6eny :eznum Lon|ex|. Ivouony soznam so clov jalo
osIounosl vnoionycl hIolu with. PivnI lonloxl v soznamu jo cln jalo ,vnjsI hIol,
osIounI jalo ,vnIlinI hIol. PivnI lonloxl olvIi souhoi, uiuly lonloxl iosmiovv sys.
stdout uo ohjollu lyu slioam, lloiy hyI vylvoion v ivnIm lonloxlu.
}8] Iunlco print() jo iovouona v lonloxlu vylvoionom iIlazom with, a iolo nohuuo lIslnoul
na ohiazovlu. MIslo lolo iovouo zIs uo souhoiu out.log.
}4] BIol louu v iIlazu with sloncII. Pyllon lazuomu sivcI lonloxlu oznmII, zo m uuIal
lo, co so m uuIal iI oouslnI lonloxlu. SivcI lonloxlu jsou uIozonI v zsohnIlu (LIIO).
Diuly lonloxl iI uloncovnI zmnII ohsal sys.stdout zl na uvounI lounolu a olom
ivnI lonloxl uzavioI souhoi ojmonovany out.log. A iolozo hyIo iosmiovnI slanuaiunI-
lo vysluu ohnovono na uvounI lounolu, huuo Iunlco print() lIslnoul zaso na ohiazovlu.
PiosmiovnI slanuaiunIlo clyhovolo vysluu Iungujo naioslo slojn. Jon so mIslo sys.stdout
ouzIjo sys.stderr.
11.7. Piocllo sI (vso angIIcly)
- Rouding und writing filos v oIIcIInI ucohnIcI Pyllon.oig
(lll:lluocs.yllon.oigly8llluloiIaIlInuloulul.llmIioauIng-anu-viIlIng-IIIos)
- io module slanuaiunI uolumonlaco
(lll:lluocs.yllon.oigly8llIIhiaiylIo.llmI)
- Stroum nb|octs slanuaiunI uolumonlaco
(lll:lluocs.yllon.oigly8llIIhiaiylslulyos.llmI)
- Cnntoxt munugor typos slanuaiunI uolumonlaco
(lll:lluocs.yllon.oigly8llIIhiaiylslulyos.llmI)
- sys.stdout and sys.stderr slanuaiunI uolumonlaco
(lll:lluocs.yllon.oigly8llIIhiaiylsys.llmI)
- FUSE nu Wikipodii (angIIcly; Izo ionoul na ouovIuajIcI coslo losIo)
(lll:llon.vIlIouIa.oiglvIlIlIIIosyslom_In_Isoisaco)
11.7. Piocllo sI (vso angIIcly)
255
12. XML
12. KaIloIa
In the archonship of Aristaechmus,
Draco enacted his ordinances.
(Za vIuy AiIslaoclma uzlonII
Dialon sv iavIuIa.)
AiIsloloIos
256
Ohsal laIloIy
12. XML 255
12.1. Ponoimo so 257
12.2. PlImInulovy iyclIoluiz XML 258
12.8. Sliulluia Alom Ioou 261
12.4. AnaIyza XML 263
12.4.1. LIomonly jsou ioiozonlovny soznamy 264
12.4.2. AliIhuly jsou ioiozonlovny sIovnIly 264
12.. VylIouvnI uzIu v XML uolumonlu 265
12.6. IxmI juo josl uI 268
12.7. GonoiovnI XML 270
12.8. AnaIyza oiusonolo XML 273
12.u. Piocllo sI 275
257
12.1. Ponoimo so
Tomi vsoclny laIloIy lolo lnIly so locI loIom iIlIauu louu. XML nosouvIsI s louom, aIo s ualy. Jou-
nIm z mIsl, luo so XML hzn ouzIv, jo ,uhIIlovany ohsal (synuIcalIon Ioous), vo lloiom so uuizujo
soznam osIounIcl cInlu hIogu, Ioia noho jInolo, caslo alluaIIzovanolo ohsalu vohovolo mIsla. Noj-
ouIinjsI hIogovacI iogiamy vylviojI ohsal (Ioou), a luyloIIv jo uhIIlovn novy cInol, uIslusnI
vIlno noho ziva na hIogu, lonlo ohsal alluaIIzujI. BIog muzomo sIouoval lal, zo so ,iIlIsImo
l ouhiu jolo ohsalu (Ioou). VIco hIogu muzomo sIouoval lal, zo ouzIjomo l lomu uicony ,nslioj
io suiuzovnI ohsalu (Ioou aggiogaloi), jalo jo naiIlIau GoogIo Roauoi.
V lolo laIloIo huuomo iacoval s nsIouujIcImI XML ualy. Juo o uhIIlovany ohsal (Ioou) lonlioln
o Alom synuIcalIon Ioou.
<?xml version='1.0' encoding='utf-8'?>
<feed xmlns='http://www.w3.org/2005/Atom' xml:lang='en'>
<title>dive into mark</title>
<subtitle>currently between addictions</subtitle>
<id>tag:diveintomark.org,2001-07-29:/</id>
<updated>2009-03-27T21:56:07Z</updated>
<link rel='alternate' type='text/html' href='http://diveintomark.org/'/>
<link rel='self' type='application/atom+xml' href='http://diveintomark.org/feed/'/>
<entry>
<author>
<name>Mark</name>
<uri>http://diveintomark.org/</uri>
</author>
<title>Dive into history, 2009 edition</title>
<link rel='alternate' type='text/html'
href='http://diveintomark.org/archives/2009/03/27/dive-into-history-2009-edition'/>
<id>tag:diveintomark.org,2009-03-27:/archives/20090327172042</id>
<updated>2009-03-27T21:56:07Z</updated>
<published>2009-03-27T17:20:42Z</published>
<category scheme='http://diveintomark.org' term='diveintopython'/>
<category scheme='http://diveintomark.org' term='docbook'/>
<category scheme='http://diveintomark.org' term='html'/>
<summary type='html'>Putting an entire chapter on one page sounds
bloated, but consider this &amp;mdash; my longest chapter so far
would be 75 printed pages, and it loads in under 5 seconds&amp;hellip;
On dialup.</summary>
</entry>
<entry>
<author>
<name>Mark</name>
12.1. Ponoimo so
258
<uri>http://diveintomark.org/</uri>
</author>
<title>Accessibility is a harsh mistress</title>
<link rel='alternate' type='text/html'
href='http://diveintomark.org/archives/2009/03/21/accessibility-is-a-harsh-mistress'/>
<id>tag:diveintomark.org,2009-03-21:/archives/20090321200928</id>
<updated>2009-03-22T01:05:37Z</updated>
<published>2009-03-21T20:09:28Z</published>
<category scheme='http://diveintomark.org' term='accessibility'/>
<summary type='html'>The accessibility orthodoxy does not permit people to
question the value of features that are rarely useful and rarely used.</summary>
</entry>
<entry>
<author>
<name>Mark</name>
</author>
<title>A gentle introduction to video encoding, part 1: container formats</title>
<link rel='alternate' type='text/html'
href='http://diveintomark.org/archives/2008/12/18/give-part-1-container-formats'/>
<id>tag:diveintomark.org,2008-12-18:/archives/20081218155422</id>
<updated>2009-01-11T19:39:22Z</updated>
<published>2008-12-18T15:54:22Z</published>
<category scheme='http://diveintomark.org' term='asf'/>
<category scheme='http://diveintomark.org' term='avi'/>
<category scheme='http://diveintomark.org' term='encoding'/>
<category scheme='http://diveintomark.org' term='flv'/>
<category scheme='http://diveintomark.org' term='GIVE'/>
<category scheme='http://diveintomark.org' term='mp4'/>
<category scheme='http://diveintomark.org' term='ogg'/>
<category scheme='http://diveintomark.org' term='video'/>
<summary type='html'>These notes will eventually become part of a
tech talk on video encoding.</summary>
</entry>
</feed>
12.2. PlImInulovy iyclIoluiz XML
Poluu uz o XML nco vIlo, muzolo lulo oulaIloIu ioslocIl.
XML iouslavujo zohocnny zusoh oIsu lIoiaiclIclycl sliulluiovanycl ual. XML-doLumen| ohsalujo
jouon noho vIco eemen|, lloio jsou ohrunteny ot0|etnm u Lontovym znutLum (lag). TolIo jo lom-
IolnI (I luyz onluu nuuny) XML uolumonl:
12.2. PlImInulovy iyclIoluiz XML
259
<foo> }1]
</foo> }2]
}1] Tolo jo ot0|etn znutLu oIomonlu foo.
}2] Tolo jo ouovIuajIcI Lontov0 znutLu oIomonlu foo. Kazu oclocnI znacla musI hyl uzaviona
(siovna s) ouovIuajIcI loncovou znaclou slojn, jalo musImo ioval zvoily v malomalI-
co noho v loxlu.
LIomonly Izo zunoIovu| uo IIhovoIno lIouhly. O oIomonlu bar uvnIli oIomonlu foo so iIl, zo jo :uI-
eemen|em noho o|omLem (clIIu) oIomonlu foo.
<foo>
<bar></bar>
</foo>
PivnImu oIomonlu v lazuom XML uolumonlu so iIl LoIenovy eemen| (iool oIomonl). XML uolumonl
muzo mIl jon jouon loionovy oIomonl. NsIouujIcI loxl non XML dnkumontom, iolozo ohsalujo uva
loionovo oIomonly:
<foo></foo>
<bar></bar>
LIomonly molou nosl u|rIu|y, coz jsou uvojIco jmono-lounola. AliIhuly so uvujI uvnIli oclocnI
znacly oIomonlu a ouuIujI so hIIymI znaly. IvnIli jounolo oIomonlu so jm6nu u|rIu| nosmjI oalo-
val. Hodno|y u|rIu| musI hyl uzaviony v uvozovlcl noho v aoslioIocl.
<foo lang='en'> }1]
<bar id='papayawhip' lang="fr"></bar> }2]
</foo>
}1] LIomonl foo m jouon aliIhul ojmonovany lang. Hounolou jolo aliIhulu lang jo en.
}2] LIomonl bar m uva aliIhuly ojmonovano id a lang. Jolo aliIhul lang m lounolu fr. Nouocl-
zI vuhoc l zunomu lonIIIllu s oIomonlom foo. Kazuy oIomonl m svou vIaslnI sauu aliIhulu.
Poluu jo v jounom oIomonlu uvouono vIc aliIhulu, al jojIcl oiauI nonI vyznamno. AliIhuly oIomonlu
lvoiI nousoiuanou mnozInu uvojIc lIIcu a lounol jalo yllonovsly sIovnIl. Pocol aliIhulu, lloio
muzomo u lazuolo oIomonlu uoIInoval, nonI nIjal omozon.
LIomonly molou oI:uhovu| |ex|.
<foo lang='en'>
<bar lang='fr'>PapayaWhip</bar>
</foo>
12.2. PlImInulovy iyclIoluiz XML
260
LIomonly, lloio noohsalujI zuny loxl a nomajI zuno olomly, jsou r0zdn6.
<foo></foo>
Pizuno oIomonly muzomo zaIsoval zlicon. Kuyz uo oclocnI znacly umIslImo znal /, muzomo
loncovou znaclu In vynoclal. XML uolumonl z iouclozIlo iIlIauu muzomo zlicon zasal lallo:
<Iool>
Pouohn jalo muzomo yllonovslo Iunlco uolIaioval v rznyth modueth, XML oIomonly muzomo uo-
lIaioval v iuznycl ro:|oreth jmen. Piosloiy jmon so ohvylIo ouohajI zIsu IRL. Vythoz ro:|or jmen
uoIInujomo omocI uolIaiaco xmlns. DolIaiaco iosloiu jmon vyau ouohn jalo zIs aliIhulu, aIo
InI ouIIsny coI.
<feed xmlns='http://www.w3.org/2005/Atom'> }1]
<title>dive into mark</title> }2]
</feed>
}1] LIomonl feed so naclzI v iosloiu jmon http://www.w3.org/2005/Atom.
}2] LIomonl title so lalo naclzI v iosloiu jmon http://www.w3.org/2005/Atom. DolIaiaco iosloiu
jmon ovIIvnI oIomonl, vo lloiom so uolIaiaco naclzI, a uIo vsoclny jolo ulslo oIomonly (olomly).
PiI uolIaiacI iosloiu jmon muzomo ouzIl lalo zIs xmlns:prefix, cImz iosloi jmon silnomo
so zauanym re[xem. V lalovom iIau musI hyl lazuy oIomonl lololo iosloiu jmon oxIIcIln
uolIaiovn so slojnym ioIIxom.
<atom:feed xmlns:atom='http://www.w3.org/2005/Atom'> }1]
<atom:title>dive into mark</atom:title> }2]
</atom:feed>
}1] LIomonl feed so naclzI v iosloiu jmon http://www.w3.org/2005/Atom.
}2] LIomonl title so lalo naclzI v iosloiu jmon http://www.w3.org/2005/Atom.
Z olIouu synlallIclolo anaIyzloiu io XML jsou ioclzojIcI uva XML uolumonly den|tL6. Piosloi
jmon + jmono oIomonlu = XML IuonlIla. PioIIxy so ouzIvajI ouzo l oulazu na iosloi jmon. To znamon,
zo lonliolnI jmono ioIIxu (atom:) jo noouslalno. Piosloiy jmon asujI, jmona oIomonlu so slouujI,
aliIhuly (noho nouvouonI aliIhulu) souI, loxlovy ohsal lazuolo oIomonlu so lalo slouujo. To znamon,
zo so joun o slojno XML uolumonly.
Na zvi uvoumo, zo XML uolumonly molou na ivnIm iulu, iou loionovym oIomonlom, uvul InIoi-
macI o znalovom louovnI. (Poluu vs zajIm, jal muzo uolumonl ohsaloval InIoimacI, lloi musI hyl
znma ioulIm, noz so uolumonl ziacovv, al uolaIIy iosonI lolo HIavy XXII lIouojlo v solcI I socIII-
laco XML (angIIcly).)
12.2. PlImInulovy iyclIoluiz XML
261
<?xml version='1.0' encoding='utf-8'?>
Tal a lou uz o XML vIlo uosl na lo, ahyslo molII hyl nohozocnI!
12.8. Sliulluia Alom Ioou
Vozmmo sI njaly vohIog noho v ouslal IIhovoIny vohovy soivoi s caslo alluaIIzovanym ohsalom,
jalo jo naiIlIau CNN.com. Soivoi m svuj nauIs (,CNN.com), ounauIs (,BioalIng Novs, I.S.,
WoiIu, Woalloi, LnloilaInmonl 8 VIuoo Novs), ualum osIounI alluaIIzaco (,uualou 12:48 .m. LDT,
Sal May 16, 2uuu) a soznam cInlu zvoiojnnycl v iuznycl casocl. Kazuy cInol m lalo nauIs,
ualum ivnIlo zvoiojnnI (a mozn lalo ualum osIounI alluaIIzaco, oluu zvoiojnIII uiosnnI noho
oiavIII iolIo) a jouInocno IRL.
Tho Atnm syndicutinn fnrmut jo navizon lal, ahy vsoclny lylo InIoimaco zaclylII vo slanuaiunIm
lvaiu. Muj vohIog a CNN.com so sIco voImI IIsI v nvilu, iozsalu a v nvslvnoslI, aIo oha majI slojnou
zlIaunI sliulluiu. CNN.com m nauIs, muj hIog m nauIs. CNN.com zvoiojujo cInly, j zvoiojujI
cInly.
Na nojvyssI iovnI so naclzI LoIenovy eemen|, lloiy ouzIvajI vsoclny ,Alom Ioou oIomonl feed
v iosloiu jmon http://www.w3.org/2005/Atom.
<feed xmlns='http://www.w3.org/2005/Atom' }1]
xml:lang='en'> }2]
}1] http://www.w3.org/2005/Atom jo iosloi jmon io Alom.
}2] LIhovoIny oIomonl muzo ohsaloval aliIhul xml:lang, lloiy uolIaiujo jazyl oIomonlu a jolo
olomlu. V lomlo iIau jo aliIhul xml:lang uolIaiovn jon jounou, v loionovom oIomonlu.
To znamon, zo coIy ohsal (Ioou) jo v angIIclIn.
Alom Ioou (clojlo lonlo nzov jalo ojom) ohsalujo i InIoimacI I o uolumonlu samolnom (louy
o soh). Jsou uolIaiovny jalo olomcI loionovolo oIomonlu feed.
<feed xmlns='http://www.w3.org/2005/Atom' xml:lang='en'>
<title>dive into mark</title> }1]
<subtitle>currently between addictions</subtitle> }2]
<id>tag:diveintomark.org,2001-07-29:/</id> }8]
<updated>2009-03-27T21:56:07Z</updated> }4]
<link rel='alternate' type='text/html' href='http://diveintomark.org/'/> }]
}1] NauIs ohsalu jo dive into mark.
}2] PounauIs ohsalu jo currently between addictions.
12.8. Sliulluia Alom Ioou
262
}8] Kazuy ohsal (Ioou) oliohujo gIohIn jounoznacny IuonlIIIlloi. V uolumonlu RFC 4151 najuo-
lo, jal so u vylvoiIl.
}4] Tonlo ohsal hyI naosIouy alluaIIzovn 27. hiozna 2uuu v 21.6 GMT. OhvylIo so slouujo
s casom osIounI mouIIIlaco nojnovjsIlo cInlu.
}] Tou lo zacno hyl zajImavo. Tonlo oIomonl link nom zuny loxlovy ohsal, aIo m liI aliIhuly: rel,
type a href. Hounola aliIhulu rel iIl, jalolo uiulu oulaz jo. Hounola rel='alternate' vyjauiu-
jo, zo juo o oulaz na aIloinalIvnI ioiozonlacI lololo ohsalu (Ioou). AliIhul type='text/html' iIl,
zo juo o oulaz na HTML slinlu. CII oulazu jo uvouon v aliIhulu href.
Tou uz vImo, zo juo o ohsal (Ioou) io mIslo zvano ,uIvo Inlo mail, lloio so naclzI
na http://diveintomark.org/ a hyIo naosIouy alluaIIzovno 27. hiozna 2uuu.
> AcloIIv v nlloiycl XML uolumonlocl muzo hyl oiauI oIomonlu uuIozIlo, io Alom Ioou
lo noIalI.
Po molaualocl vzanycl na coIy uolumonl (Ioou) so naclzI soznam nojnovjsIcl cInlu. CInol
vyau lallo:
<entry>
<author> }1]
<name>Mark</name>
<uri>http://diveintomark.org/</uri>
</author>
<title>Dive into history, 2009 edition</title> }2]
<link rel='alternate' type='text/html' }8]
href='http://diveintomark.org/archives/2009/03/27/dive-into-history-2009-edition'/>
<id>tag:diveintomark.org,2009-03-27:/archives/20090327172042</id> }4]
<updated>2009-03-27T21:56:07Z</updated> }]
<published>2009-03-27T17:20:42Z</published>
<category scheme='http://diveintomark.org' term='diveintopython'/> }6]
<category scheme='http://diveintomark.org' term='docbook'/>
<category scheme='http://diveintomark.org' term='html'/>
<summary type='html'>Putting an entire chapter on one page sounds }7]
bloated, but consider this &amp;mdash; my longest chapter so far
would be 75 printed pages, and it loads in under 5 seconds&amp;hellip;
On dialup.</summary>
</entry> }8]
}1] LIomonl author iIl, luo cInol nasaI: njaly manIl jmonom Mail, lloiy so oIIalujo nluo
na http://diveintomark.org/. (Jo lo slojn lounola, jalo aIloinalIvnI oulaz v molaualocl
l Ioou, aIo nomusI lomu lal hyl. Mnolo vohIogu vyuzIv vIco auloiu najounou a lazuy z nIcl
mIv jIny osohnI vohovy soivoi.)
12.8. Sliulluia Alom Ioou
263
}2] LIomonl title noso nzov cInlu ,DIvo Inlo lIsloiy, 2uuu ouIlIon.
}8] LIomonl link ohsalujo auiosu HTML voizo lololo cInlu, ouohn jalo v iIau aIloinalIvnIlo
oulazu na iovnI coIolo ohsalu (Ioou).
}4] PoIozly (entry), slojn jalo coIy ohsal (Ioou), oliohujI jounoznacny IuonlIIIlloi.
}] PoIozly nosou uv uala: ualum ivnIlo zvoiojnnI (published) a ualum osIounI mouIIIlaco
(updated).
}6] PoIozly molou nosl IIhovoIny ocol lalogoiII (category). Tonlo cInol jo zaiazon
ou diveintopython, docbook a HTML.
}7] LIomonl summary noso sliucno slinulI ohsalu cInlu. (LxIslujo I element conlonl lj. ohsal
, lloiy zuo nonI ouzIl. Jo uicon io vIozonI coIolo loxlu cInlu.) Tonlo oIomonl summary
noso aliIhul type='html', lloiy jo socIIIcly io Alom. RIl, zo uvouono slinulI nonI iosly
loxl, aIo iyvol vo Ioimlu HTML. Ta InIoimaco jo uuIozIl, iolozo so v nm naclzojI vcI so-
cIIIclo io HTML (&mdash; a &hellip;), lloio so nomajI zvIuIloIoval jalo loxl, aIo jalo ,- a ,.
}8] A na zvi jo lu loncov znacla oIomonlu entry, lloi sIgnaIIzujo lonoc molaual io lonlo cInol.
12.4. AnaIyza XML
Pyllon uovouo anaIyzoval XML uolumonly nloIIla zusohy. Najuomo zuo liauIcnI synlallIclo anaIyz-
loiy (lalo aisoiy) uom a sax. My so aIo zamiImo na jInou lnIlovnu zvanou LIomonlTioo.
>>> import xml.etree.ElementTree as etree }1]
>>> tree = etree.parse('examples/feed.xml') }2]
>>> root = tree.getroot() }8]
>>> root }4]
<Element {http://www.w3.org/2005/Atom}feed at cd1eb0>
}1] KnIlovna LIomonlTioo jo soucslI slanuaiunI yllonovslo lnIlovny.
NaclzI so v xml.etree.ElementTree.
}2] PiIminIm vslunIm houom lnIlovny LIomonlTioo jo Iunlco parse(), lloi iohIi huu jmono
souhoiu noho souhoiu so ouohajIcI ohjoll. Iunlco ziacujo coIy uolumonl najounou. Poluu
clcomo soliIl amlI, oxIslujI zusohy, jal muzomo XML uolumonl ziacovval oslun.
}8] Iunlco aiso() viacI ohjoll, lloiy ioiozonlujo coIy uolumonl. AIo nen lo loionovy oIomonl.
Poluu clcomo zIslal oulaz na loionovy oIomonl, zavoImo molouu getroot().
}4] Jal so uaIo colal, loionovym oIomonlom jo oIomonl feed, lloiy so naclzI v iosloiu jmon
http://www.w3.org/2005/Atom. Rolzcov ioiozonlaco lololo ohjollu v ns osIIujo uuIozIly
olIou: XML oIomonl jo lomhInacI svolo iosloiu jmon a jmona svo znacly (lloi so loz nazyv
oL0n jm6no). Kazuy oIomonl lololo uolumonlu so naclzI v iosloiu jmon Alom, lalzo loio-
novy oIomonl jo ioiozonlovn jalo {http://www.w3.org/2005/Atom}feed.
> LIomonlTioo ioiozonlujo XML oIomonly jalo {prostor_jmen}lokln_jmno. Tonlo Ioiml uvI-
uImo a huuomo ouzIval na mnola mIslocl aIIlacnIlo iozlianI LIomonlTioo.
12.4. AnaIyza XML
264
12.4.1. LIomonly jsou ioiozonlovny soznamy
V aIIlacnIm iozlianI LIomonlTioo so oIomonly clovajI jalo soznamy. PoIozlamI soznamu jsou oIo-
monly olomlu (clIIu).
# pokraovn pedchozho pkladu
>>> root.tag }1]
'{http://www.w3.org/2005/Atom}feed'
>>> len(root) }2]
8
>>> for child in root: }8]
... print(child) }4]
...
<Element {http://www.w3.org/2005/Atom}title at e2b5d0>
<Element {http://www.w3.org/2005/Atom}subtitle at e2b4e0>
<Element {http://www.w3.org/2005/Atom}id at e2b6c0>
<Element {http://www.w3.org/2005/Atom}updated at e2b6f0>
<Element {http://www.w3.org/2005/Atom}link at e2b4b0>
<Element {http://www.w3.org/2005/Atom}entry at e2b720>
<Element {http://www.w3.org/2005/Atom}entry at e2b510>
<Element {http://www.w3.org/2005/Atom}entry at e2b750>
}1] Poliacujmo v iouclozIm iIlIauu. Koionovy oIomonl jo {http://www.w3.org/2005/Atom}feed.
}2] ,DoIlou loionovolo oIomonlu iozumImo ocol ulslycl oIomonlu (olomlu, clIIu).
}8] Ohjoll oIomonlu muzomo ouzIl jalo Iloiloi, lloiy zajIslI iuclou vsomI svymI
ulslymI oIomonly.
}4] Na vysluu vIuImo, zo ohsalujo ocolvanycl 8 olomlu: molauala aliIcI l Ioou (title,
subtitle, id, updated a link) nsIouovan liomI oIomonly entry.
AsI uz jslo lo oulauII, aIo zuuiaznmo lo josl oxIIcIln: soznam ulslycl oIomonlu zalinujo ouzo
Im6 olomly. Kazuy z oIomonlu entry ohsalujo svo vIaslnI olomly, aIo lI v lomlo soznamu uvouonI
nojsou. Jalo ulslo oIomonly jsou soucslI soznamu oIomonlu entry, aIo nojsou zalinuly mozI olomly
oIomonlu feed. LxIslujI zusohy, jal muzomo oIomonly vylIoual nozvIsIo na lom, jal lIuholo jsou
zanoiono. Na uva lalovo zusohy so v lolo laIloIo ouIvmo ozujI.
12.4.2. AliIhuly jsou ioiozonlovny sIovnIly
XML nonI jon loIolcI oIomonlu. Kazuy oIomonl m svou vIaslnI sauu aliIhulu. JalmIIo mmo oulaz
na lonliolnI oIomonl, muzomo jolo aliIhuly snauno zIslal jalo yllonovsly sIovnIl.
12.4. AnaIyza XML
265
# pokraovn pedchozho pkladu
>>> root.attrib }1]
{'{http://www.w3.org/XML/1998/namespace}lang': 'en'}
>>> root[4] }2]
<Element {http://www.w3.org/2005/Atom}link at e181b0>
>>> root[4].attrib }8]
{'href': 'http://diveintomark.org/',
'type': 'text/html',
'rel': 'alternate'}
>>> root[3] }4]
<Element {http://www.w3.org/2005/Atom}updated at e2b4e0>
>>> root[3].attrib }]
{}
}1] VIaslnosl attrib jo sIovnIlom aliIhulu oIomonlu. PuvounI znacla vyauaIa lallo:
<feed xmlns='http://www.w3.org/2005/Atom' xml:lang='en'>. PioIIx xml: so vzlalujo
l zahuuovanomu iosloiu jmon, lloiy muzomo ouzIval v lazuom XML uolumonlu, anIz
hyclom joj musoII uolIaioval.
}2] Plym olomlom [4] ouovIu InuoxovnI soznamu ou nuIy jo oIomonl link.
}8] LIomonl IInl m liI aliIhuly: href, type a rel.
}4] Clvilym olomlom [3] ouovIu InuoxovnI soznamu ou nuIy jo oIomonl updated.
}] LIomonl updated nom zuno aliIhuly, lalzo jolo vIaslnosl .attrib jo iosl izuny sIovnIl.
12.. VylIouvnI uzIu v XML uolumonlu
ZalIm jsmo s uvouonym XML uolumonlom iacovaII ,sloia uoIu. ZacaII jsmo u loionovolo oIomonlu,
ziIslunIII jsmo sI oIomonly jolo olomlu a lal uIo naiIc uolumonlom. AIo iI mnola ouzIlIcl
XML so ozauujo naIozonI uicIlolo oIomonlu. Llioo lo umI lalo.
>>> import xml.etree.ElementTree as etree
>>> tree = etree.parse('examples/feed.xml')
>>> root = tree.getroot()
>>> root.findall('{http://www.w3.org/2005/Atom}entry') }1]
[<Element {http://www.w3.org/2005/Atom}entry at e2b4e0>,
<Element {http://www.w3.org/2005/Atom}entry at e2b510>,
<Element {http://www.w3.org/2005/Atom}entry at e2b540>]
>>> root.tag
'{http://www.w3.org/2005/Atom}feed'
>>> root.findall('{http://www.w3.org/2005/Atom}feed') }2]
[]
>>> root.findall('{http://www.w3.org/2005/Atom}author') }8]
[]
12.. VylIouvnI uzIu v XML uolumonlu
266
}1] Moloua findall() najuo vsoclny ulslo oIomonly, lloio ouovIuajI uicIlomu uolazu. (O Ioim-
lu uolazu sI iolnomo za mInullu.)
}2] Kazuy oIomonl vcoln loionovolo oIomonlu, aIo lalo ulslycl oIomonlu m molouu
findall(). Ta mozI olomly najuo vsoclny ouovIuajIcI oIomonly. AIo ioc lu nojsou zuno
vysIouly AcloIIv lo nomusI hyl In ziojmo, lonlo uolaz iolIouv jon oIomonly olomlu.
A iolozo loionovy oIomonl feed nom zunolo olomla jmonom feed, viacI uolaz izuny
soznam.
}8] Tonlo vysIouol vs mozn lalo iolvaI. V lomlo uolumonlu so naclzI oIomonl author.
Vo slulocnoslI jsou v nm liI (jouon v lazuom oIomonlu entry). AIo oIomonly author nojsou
Imym o|omLy loionovolo oIomonlu. Jsou lo jolo ,vnucI (uosIova olomcI olomlu).
Poluu lIoulo oIomonly author na IIhovoIno iovnI zanoionI, jo lo mozno iovosl, aIo Ioiml
uolazu so mIin IIsI.
>>> tree.findall('{http://www.w3.org/2005/Atom}entry') }1]
[<Element {http://www.w3.org/2005/Atom}entry at e2b4e0>,
<Element {http://www.w3.org/2005/Atom}entry at e2b510>,
<Element {http://www.w3.org/2005/Atom}entry at e2b540>]
>>> tree.findall('{http://www.w3.org/2005/Atom}author') }2]
[]
}1] Z iallIclycl uuvouu m ohjoll tree (viacony IunlcI etree.parse()) nloIIl molou, lloio
ouovIuajI moloum loionovolo oIomonlu. VysIouly jsou slojno, jalo luyhyclom zavoIaII
molouu tree.getroot().findall().
}2] Tonlo uolaz, mozn lioslu iolvaIv, v uolumonlu nonajuo oIomonly author. Pioc no Piolozo
jo lo zlialla io tree.getroot().findall('{http://www.w3.org/2005/Atom}author'), coz
znamon ,najuI vsoclny oIomonly author, lloio jsou olomly loionovolo oIomonlu. LIomonly
author nojsou olomly loionovolo oIomonlu. Jsou lo olomcI oIomonlu entry. Talzo uvouony
uolaz nonajuo zunou slouu.
LxIslujo lalo moloua find(), lloi viacI ivnI vylovujIcI oIomonl. HouI so v sIluacIcl, luy ocolvmo
ouzo jouon vyslyl, noho luyz jo vyslylu vIc, aIo zajIm ns jon ivnI.
>>> entries = tree.findall('{http://www.w3.org/2005/Atom}entry') }1]
>>> len(entries)
3
>>> title_element = entries[0].find('{http://www.w3.org/2005/Atom}title') }2]
>>> title_element.text
'Dive into history, 2009 edition'
>>> foo_element = entries[0].find('{http://www.w3.org/2005/Atom}foo') }8]
>>> foo_element
>>> type(foo_element)
<class 'NoneType'>
12.. VylIouvnI uzIu v XML uolumonlu
267
}1] TolIo jsmo vIuII v iouclozIm iIlIauu. NaIoznou so vsoclny oIomonly atom:entry.
}2] Moloua find() iohIi uolaz a viacI ivnI vylovujIcI oIomonl.
}8] IvnIli oIomonlu nojsou zuno oIozly nazvano foo, lalzo so viacI None.
> S molouou find() jo sojon ,clyll, lloiy vs jounou uoslano. Ohjoll oIomonlu z LIomonlTioo
so v hooIoovslom lonloxlu vylounocujo jalo False v iIau, luy noohsalujo zuno olomly
(lj. joslIIzo len(element) jo iovno nuIo). To znamon, zo zIs if element.find('...') nolos-
lujo, zua moloua find() naIozIa vylovujIcI oIomonl. Toslujo, zua vylovujIcI oIomonl m njalo
olomly! Poluu clcomo losloval, zua moloua find() vilIIa njaly oIomonl, musImo ouzIl
zIs if element.find('...') is not None.
On aIo oxIslujo zusoh, jal najIl oIomonly vosloiycl IIuznyth o|omL, lj. ulI, vnulu a uaIsIcl
oIomonlu na IIhovoIno iovnI zanoionI.
>>> all_links = tree.findall('//{http://www.w3.org/2005/Atom}link') }1]
>>> all_links
[<Element {http://www.w3.org/2005/Atom}link at e181b0>,
<Element {http://www.w3.org/2005/Atom}link at e2b570>,
<Element {http://www.w3.org/2005/Atom}link at e2b480>,
<Element {http://www.w3.org/2005/Atom}link at e2b5a0>]
>>> all_links[0].attrib }2]
{'href': 'http://diveintomark.org/',
'type': 'text/html',
'rel': 'alternate'}
>>> all_links[1].attrib }8]
{'href': 'http://diveintomark.org/archives/2009/03/27/dive-into-history-2009-edition',
'type': 'text/html',
'rel': 'alternate'}
>>> all_links[2].attrib
{'href': 'http://diveintomark.org/archives/2009/03/21/accessibility-is-a-harsh-mistress',
'type': 'text/html',
'rel': 'alternate'}
>>> all_links[3].attrib
{'href': 'http://diveintomark.org/archives/2008/12/18/give-part-1-container-formats',
'type': 'text/html',
'rel': 'alternate'}
}1] Tonlo uolaz //{http://www.w3.org/2005/Atom}link jo lm z iouclozIcl iIlIauu voImI
ouohny. JouInou ouIIsnoslI jsou uv IomIlla na zacllu uolazu. Talo uv IomIlla znamonajI:
,NouIvoj so jon na iImo olomly. ClcI najIl juL6Lov oIomonly, nozvIsIo na iovnI zanoionI.
Talzo vysIoulom jo soznam clyi oIomonlu link a nojon jounolo.
12.. VylIouvnI uzIu v XML uolumonlu
268
}2] PivnI vysIouol jo iImym olomlom loionovolo oIomonlu. Jal vIuImo z jolo aliIhulu, juo
o aIloinalIvnI oulaz z iovn coIolo ohsalu (Ioou). Oulazujo na HTML voizI vohovolo mIsla,
lloio zvoiojovany ohsal oIsujo.
}8] OslalnI liI vysIouly jsou aIloinalIvnI oulazy z lazuolo oIomonlu entry. Kazuy oIomonl entry
ohsalujo jouon ulsly oIomonl link. A iolozo jo na zacllu uolazu uvouona uvojIco IomIlol,
najuo uolaz vsoclny.
CoIlov vzalo jo moloua findall() ohjollu liIuy LIomonlTioo voImI mocnym nsliojom, aIo uolazovacI
jazyl muzo iInosl i iolvaonI. OIIcIIn so o nm Iso jalo o ,omozono ouoio vyiazu XPall.
XPall jo W8C slanuaiuom io uolazovnI v XML uolumonlocl. DolazovacI jazyl ImIomonlovany liI-
uou LIomonlTioo so XPall ouoh uo lo mIiy, zo so louI io zlIaunI vylIouvnI. AIo oluu uz znlo
XPall, molou vs iozuIIy iozcIIoval. Tou so ouIvmo na XML lnIlovnu liolI sliany, lloi iozsIiujo
aIIlacnI iozlianI LIomonlTioo o Inou ouoiu XPall.
12.6. IxmI juo josl uI
lxml jo oon souico lnIlovna liolI sliany, lloi jo vyhuuovna nau ouIinIm aisoiom libxml2.
Poslylujo aIIlacnI iozlianI, lloio jo 1uu sIucIloIno s LIomonlTioo a iozsIiujo lo o Inou ouoiu
XPall 1.u a o i uaIsIcl vyIosonI. K uIsozIcI jsou InslaIloiy io WInuovs. IzIvaloIo LInuxu hy
mII zlusIl naInslaIoval ioulomIIovany hIninI lvai z aiclIvu iosliounIclvIm nslioju iIsIusno
uIsliIhuco, jalo jo lioha yum noho apt-get. Poluu hy lo nosIo, musoII hyslo lxml naInslaIoval iucn.
>>> from lxml import etree }1]
>>> tree = etree.parse('examples/feed.xml') }2]
>>> root = tree.getroot() }8]
>>> root.findall('{http://www.w3.org/2005/Atom}entry') }4]
[<Element {http://www.w3.org/2005/Atom}entry at e2b4e0>,
<Element {http://www.w3.org/2005/Atom}entry at e2b510>,
<Element {http://www.w3.org/2005/Atom}entry at e2b540>]
}1] JalmIIo lxml naImoilujomo, mmo l uIsozIcI slojno aIIlacnI iozlianI jalo u zahuuovano
lnIlovny LIomonlTioo.
}2] Iunlco parse() slojn jalo u LIomonlTioo.
}8] Moloua getroot() lalo slojn.
}4] Moloua findall() naioslo slojn.
Pio voIlo xml uolumonly jo lxml vyiazn iyclIojsI noz zahuuovan lnIlovna LIomonlTioo. Poluu o-
uzIvlo ouzo aIIlacnI iozlianI LIomonlTioo a clcolo ouzIval nojiyclIojsI uoslunou ImIomonlacI,
muzolo vyzlousol naImoiloval lxml so zclianou v ouoh zahuuovano LIomonlTioo.
12.6. IxmI juo josl uI
269
try:
from lxml import etree
except ImportError:
import xml.etree.ElementTree as etree
AIo lxml jo vIc noz oul iyclIojsI ouoha LIomonlTioo. JojI ImIomonlaco molouy findall() ouo-
iujo lomIIlovanjsI vyiazy.
>>> import lxml.etree }1]
>>> tree = lxml.etree.parse('examples/feed.xml')
>>> tree.findall('//{http://www.w3.org/2005/Atom}*[@href]') }2]
[<Element {http://www.w3.org/2005/Atom}link at eeb8a0>,
<Element {http://www.w3.org/2005/Atom}link at eeb990>,
<Element {http://www.w3.org/2005/Atom}link at eeb960>,
<Element {http://www.w3.org/2005/Atom}link at eeb9c0>]
>>> tree.findall("//{http://www.w3.org/2005/Atom}*[@href='http://diveintomark.org/']") }8]
[<Element {http://www.w3.org/2005/Atom}link at eeb930>]
>>> NS = '{http://www.w3.org/2005/Atom}'
>>> tree.findall('//{NS}author[{NS}uri]'.format(NS=NS)) }4]
[<Element {http://www.w3.org/2005/Atom}author at eeba80>,
<Element {http://www.w3.org/2005/Atom}author at eebba0>]
}1] V lomlo iIlIauu iovouomo import lxml.etree. Clcomo zuo zuuiaznIl, zo juo o vIaslnoslI
socIIIclo io lxml (lalzo nonaIsomo, uojmo lomu, from lxml import etree).
}2] Tonlo uolaz najuo vsoclny oIomonly z iosloiu jmon Alom, lloio majI aliIhul href
al uz so naclzojI v uolumonlu luoloIIv. Dv IomIlla (//) na zacllu uolazu znamonajI
,oIomonly naclzojIcI so luoloIIv (no jonom olomcI noho loionovy oIomonl).
{http://www.w3.org/2005/Atom} znamon ,jon oIomonly z iosloiu jmon Alom.
* znamon ,oIomonly s IIhovoInym IolInIm jmonom. A [@href] znamon, ,lloio majI
aliIhul href.
}8] Tonlo uolaz najuo vsoclny oIomonly z Alom, lloio majI href s lounolou
http://diveintomark.org/.
}4] S vyuzIlIm jounouuclolo IoimlovacIlo iolzco (iolozo jInal hy so lylo sIozono uolazy slaIy
nonosn uIoulo) zIslmo uolaz, lloiy v iosloiu Alom lIou oIomonly author, lloio majI
mozI svymI olomly oIomonl uri. VilI so jon uva oIomonly author jon z ivnIlo a uiulolo
oIomonlu entry. LIomonl aulloi v osIounIm entry ohsalujo jon name uri mu clyhI.
Josl lolo nomlo uosl Do lxml jo zalinula I ouoia io IIhovoIno vyiazy XPall 1.u. Nohuuu so
uo lIouhly zahyval synlaxI XPall. To hy samo o soh vyuaIo na coIou lnIlu! AIo ulzomo sI, jalym
zusohom jo ouoia XPall uo lxml zalinula.
12.6. IxmI juo josl uI
270
>>> import lxml.etree
>>> tree = lxml.etree.parse('examples/feed.xml')
>>> NSMAP = {'atom': 'http://www.w3.org/2005/Atom'} }1]
>>> entries = tree.xpath("//atom:category[@term='accessibility']/..", }2]
... namespaces=NSMAP)
>>> entries }8]
[<Element {http://www.w3.org/2005/Atom}entry at e2b630>]
>>> entry = entries[0]
>>> entry.xpath('./atom:title/text()', namespaces=NSMAP) }4]
['Accessibility is a harsh mistress']
}1] Ahyclom molII iovul uolazy XPall nau oIomonly z njalolo iosloiu jmon, musImo
uoIInoval zohiazonI ioIIxu na iosloi jmon. Jo lo iosl yllonovsly sIovnIl.
}2] Tauy mmo uolaz v XPall. Vyiaz v XPall lIou oIomonly category (z iosloiu jmon Alom),
lloio ohsalujI aliIhul term s lounolou accessibility. To aIo josl nonI vysIoulom uolazu.
PouIvojlo so na Iny lonoc iolzco uolazu. VsImII jslo sI solu l.. Ton znamon ,a vial
l iv naIozonomu oIomonlu category jolo iouIcovsly oIomonl. Talzo lonlo jouIny uolaz
XPall najuo vsoclny oIomonly olomly <category term='accessibility'>.
}8] Iunlco xpath() viacI soznam ohjollu liIuy LIomonlTioo. V lomlo uolumonlu so naclzI
jouIny zznam ohsalujIcI category, joloz loim m lounolu accessibility.
}4] XPall vyiaz noviacI vzuycly soznam oIomonlu. DOM (Documonl Ohjocl MouoI; ohjollovy mouoI
uolumonlu), lloiy vznIlI na zlIau ziacovnI (aisIng) XML uolumonlu, noohsalujo z locl-
nIclolo lIouIsla oIomonly, aIo uzy. IzIy molou (ouIo lyu) ioiozonloval oIomonly, aliIhuly
noho uolonco loxlovy ohsal. VysIoulom XPall uolazu jo soznam uzIu. Tonlo uolaz viacI so-
znam loxlovycl uzIu: loxlovy ohsal (text()) oIomonlu title (atom:title), lloiy jo olomlom
alluInIlo oIomonlu (./).
12.7. GonoiovnI XML
Pouoia XML v Pyllonu nonI omozona na anaIyzu (aisIng) oxIslujIcIcl uolumonlu. Muzomo lalo
vylviol XML uolumonly zcoIa ou zlIauu.
>>> import xml.etree.ElementTree as etree
>>> new_feed = etree.Element('{http://www.w3.org/2005/Atom}feed', }1]
... attrib={'{http://www.w3.org/XML/1998/namespace}lang': 'en'}) }2]
>>> print(etree.tostring(new_feed)) }8]
<ns0:feed xmlns:ns0='http://www.w3.org/2005/Atom' xml:lang='en'/>
}1] Novy oIomonl vznIlno vylvoionIm Inslanco liIuy Element. Jalo ivnI aigumonl iouvmo jmo-
no oIomonlu (iosloi jmon + IolInI jmono). TImlo iIlazom so vylvoiI oIomonl feed v iosloiu
jmon Alom. To huuo loionovy oIomonl nasolo novolo uolumonlu.
12.7. GonoiovnI XML
271
}2] AliIhuly l nov vylvoionomu oIomonlu iIumo iounIm sIovnIlu so jmony a lounolamI
aliIhulu aigumonlom attrib. Poznamonojmo, zo jmona aliIhulu musI hyl uvouona vo lvaiu
io LIomonlTioo {prostor jmen}lokln jmno.
}8] KloiyloIIv oIomonl (a jolo olomly) muzomo luyloIIv iovosl na iolzoc (soiIaIIzoval) voI-
nIm Iunlco tostring() z LIomonlTioo.
Jslo vysIoulom soiIaIIzaco iolvaonI Zusoh, jalym LIomonlTioo soiIaIIzujo XML oIomonly s ioslo-
iom jmon, jo sIco z loclnIclolo lIouIsla iosny, aIo nonI olImInI. Vzoiovy XML uolumonl zo zacllu
lolo laIloIy uoIInovaI vythoz ro:|or jmen (xmlns='http://www.w3.org/2005/Atom'). I uolumonlu,
luo so vsoclny oIomonly naclzojI vo slojnom iosloiu jmon jalo u Alom Ioous jo uoIInIco vy-
clozIlo iosloiu jmon uzIlocn, iolozo jI uvouomo jon jounou a oIomonly al muzomo uolIaioval jon
jojIcl IolInIm jmonom (<feed>, <link>, <entry>). Poluu nooliohujomo uolIaioval oIomonly z jInolo
iosloiu jmon, nomusImo ioIIxy uvul.
XML aisoi ,novIuI mozI XML uolumonlom s vyclozIm iosloiom jmon a mozI XML uolumonlom s ioII-
xovanym iosloiom jmon zuny iozuII. VysIouny DOM s nsIouujIcI soiIaIIzacI:
<ns0:feed xmlns:ns0='http://www.w3.org/2005/Atom' xml:lang='en'/>
jo lolozny s DOM s loulo soiIaIIzacI:
<feed xmlns='http://www.w3.org/2005/Atom' xml:lang='en'/>
JouIny iallIcly iozuII socIv v lom, zo uiul soiIaIIzaco jo o i znalu lialsI. Kuyhyclom cllII coIy
vzoiol nasolo ohsalu (Ioou) iosal s ioIIxom ns0: v lazuo oclocnI a loncovo znacco, iIuaIo hy
lo 4 znaly na lazuou znaclu 7u znacol + 4 znaly io vIaslnI uolIaiacI iosloiu jmon, lo jo coIlom
82u znalu. Za iouolIauu, zo ouzIvmo louovnI UTF-8, lo jo 82u hajlu navIc. (Po zahaIonI omocI
gzip so iozuII zmonsI na 21 hajlu, aIo 21 hajlu jo oiu 21 hajlu.) Pio vs lo mozn nIc noznamon,
aIo io nco lalovolo jalo jo Alom Ioou, lloiy muzo hyl slalovn nloIIlalIsIclil, luyloIIv uojuo
lo zmn, so muzo soia i hajlu na uolaz iyclIo nascIlal.
Zahuuovan lnIlovna LIomonlTioo lal jomno ovIunI soiIaIIzaco oIomonlu z iosloiu jmon nonahIzI,
aIo lxml ano.
>>> import lxml.etree
>>> NSMAP = {None: 'http://www.w3.org/2005/Atom'} }1]
>>> new_feed = lxml.etree.Element('feed', nsmap=NSMAP) }2]
>>> print(lxml.etree.tounicode(new_feed)) }8]
<feed xmlns='http://www.w3.org/2005/Atom'/>
>>> new_feed.set('{http://www.w3.org/XML/1998/namespace}lang', 'en') }4]
>>> print(lxml.etree.tounicode(new_feed))
<feed xmlns='http://www.w3.org/2005/Atom' xml:lang='en'/>
12.7. GonoiovnI XML
272
}1] Zacnomo lIm, zo uoIInujomo zohiazonI iosloiu jmon v ouoh sIovnIlu. HounolamI sIovnIlu
jsou iosloiy jmon, lIIcI jsou ozauovano ioIIxy. PouzIlIm None v ioII lIIco uoIInujomo vyclo-
zI iosloi jmon.
}2] Kuyz lou iI vylvionI oIomonlu ioumo sIovnIl aigumonlom nsmap (jo socIIIcly io lxml),
huuo lxml iosolloval ioIIxy iosloiu jmon, lloio jsmo uoIInovaII.
}8] Talo soiIaIIzaco ouIo ocolvnI uoIInujo iosloi jmon Alom jalo vyclozI iosloi jmon a uolIa-
iujo oIomonl feed hoz ioIIxu iosloiu jmon.
}4] Jojua! ZaomnII jsmo iIual aliIhul xml:lang. LIhovoIny aliIhul muzomo l IIhovoInomu oIomon-
lu iIual molouou set(). PiohIi uva aigumonly: jmono aliIhulu vo Ioimlu io LIomonlTioo
a lounolu aliIhulu. (Talo moloua nonI socIIIcl io lxml. JouInou cslI socIIIclou io lxml hyI
v lomlo iIlIauu aigumonl nsmap, lloiy v soiIaIIzovanom vysluu ovIu ioIIxovnI iosloiom
jmon.)
Muzo so v XML uolumonlocl vyslyloval jon jouon oIomonl na uolumonl Samoziojm zo no. Snauno
muzomo vylvoiIl I oIomonly olomlu.
>>> title = lxml.etree.SubElement(new_feed, 'title', }1]
... attrib={'type':'html'}) }2]
>>> print(lxml.etree.tounicode(new_feed)) }8]
<feed xmlns='http://www.w3.org/2005/Atom' xml:lang='en'><title type='html'/></feed>
>>> title.text = 'dive into &hellip;' }4]
>>> print(lxml.etree.tounicode(new_feed)) }]
<feed xmlns='http://www.w3.org/2005/Atom' xml:lang='en'><title type='html'>dive into
&amp;hellip;</title></feed>
>>> print(lxml.etree.tounicode(new_feed, pretty_print=True)) }6]
<feed xmlns='http://www.w3.org/2005/Atom' xml:lang='en'>
<title type='html'>dive into&amp;hellip;</title>
</feed>
}1] PiI vylvionI ulslolo oIomonlu l oxIslujIcImu oIomonlu vylviImo InslancI liIuy SubElement.
JouInymI ovInnymI aigumonly jsou zuo iouIcovsly oIomonl (v nasom iIau new_feed)
a jmono novolo oIomonlu. Piolozo m ulsly oIomonl uuIl maovnI (zohiazonI) iosloiu
jmon ou svolo iouIco, nomusImo zuo iosloj jmon noho ioIIx znovu uolIaioval.
}2] Muzomo lalo ioual sIovnIl aliIhulu. KIIco liajI ioII jmon aliIhulu, lounoly jsou lounolamI
aliIhulu.
}8] PouIo ocolvnI hyI v iosloiu jmon Alom vylvoion oIomonl title a hyI vIozon jalo olomol
uo oIomonlu feed. Piolozo oIomonl title noohsalovaI zuny loxl a nomI svo vIaslnI olomly,
soiIaIIzujo joj lxml jalo izuny oIomonl (zlicony zIs s /> na loncI).
}4] Poluu clcomo oIomonlu naslavIl loxlovy ohsal, iIiauImo joj jounouuso uo vIaslnoslI .text.
}] Tou uz so oIomonl title soiIaIIzujo I so svym loxlovym ohsalom. Kazuy loxl, lloiy ohsalujo
znaly monsI noz noho ampersand, musI hyl iI soiIaIIzacI iovouon na socIInI osIounoslI.
lxml so o lo oslai aulomalIcly.
12.7. GonoiovnI XML
273
}6] PiI soiIaIIzacI muzomo iouosal lalo ,lIsl v lnom lvaiu. Za loncovo znacly a za oclocnI
znacly oIomonlu, lloio ohsalujI olomly, aIo no loxl, so vIozI ioclouy na novy iuol. Vyj-
uiono loclnIclymI ojmy, lxml iIu ,novyznamno hIIo znaly za coIom zvysonI cIloInoslI
vysluu.
> Mozn hyslo so cllII milnoul lalo na xmlwitch, coz jo uaIsI lnIlovna liolI sliany io gonoio-
vnI XML. Ahy hyI lou io gonoiovnI XML cIloInjsI, sIioco so v nI vyuzIv iIlazu with.
12.8. AnaIyza oiusonolo XML
SocIIIlaco XML naiIzujo, ahy vsoclny XML aisoiy, lloio clljI socIIIlacI vylovl, ouzIvaIy ,uialonIc-
lou ohsIulu clyh. To znamon, zo musI s vyiaznym oIollom zaslavIl, jalmIIo v XML uolumonlu naiazI
na jalyloIIv ioliosol iolI loiollnI ouoh. Pioliosly iolI sivno Ioim zalinujI nosiovano oc-
locnI a loncovo znacly, nouoIInovano onlIly (socIInI osIounoslI io znaly), noIogInI InIcouo znaly
a iauu uaIsIcl osoloiIclycl iavIuoI. To jo v iIliom lonliaslu s jInymI hznymI Ioimly, jalo jo naiI-
lIau HTML. Vs iolIIzoc noioslano zohiazoval slinlu, vo lloio zaomonolo uvosl uzavIiacI znaclu HTML
noho luyz zaomonolo zasal amoisanu v aliIhulu jalo socIInI solvoncI. (Bznym omyIom jo, zo HTML
nom uoIInovno osolionI clyh. OsoliovnI clyh v HTML jo vo slulocnoslI uoIInovno voImI uohio, aIo
jo vyiazn lomIIlovanjsI, noz ,zaslav a zacnI loiol v olamzIlu, luy so naiazI na ivnI clyhu.)
NlloiI IIuo viI (a j aliIm mozI n), zo ozauavol na uialonIclou ohsIulu clyh hyI zo sliany lvuicu
XML noiImiony. Noclojlo m saln. ZjounouusonI iavIuoI io osolionI clyh m svo louzIo. AIo
v iaxI jo loncoco ,loiollnoslI Ioimlu osIunjsI, noz lo vyau zvIsl u XML (jalo jo Alom Ioous),
lloio jsou zvoiojovny na vohu a ziIsluovny iololoIom HTTP. I ios vyziIosl Ioimlu XML,
lloiy slanuaiuIzovaI uialonIcl iavIuIa io osoliovnI clyh v ioco 1uu7, iuzlumy slIo ulazujI, zo
vyznamn csl uolumonlu Alom Ioous naclzojIcIcl so na vohu jo zamoiona clyhamI Ioimlu.
Talzo mm jal looiolIclo, lal iallIclo uuvouy lo ziacovnI (aiso) XML uolumonlu ,za lazuou
conu. To znamon, zo netht s liavIom zaslavIl iI ivnIm iolioslu iolI loiollnoslI Ioimlu.
Poluu zjIslIlo, zo lo cIlIlo ouohn, muzo vm omocI LXML.
Tauy mmo lousol oiusonolo XML uolumonlu. Pioliosly iolI loiollnoslI jsom zvyiaznII.
<?xml version='1.0' encoding='utf-8'?>
<feed xmlns='http://www.w3.org/2005/Atom' xml:lang='en'>
<title>dive into &hellip;</title>
...
</feed>
Tal lolIo jo clyha, iolozo onlIla &hellip; nonI v XML uoIInovna. (Jo uoIInovna v HTML.) Poluu so
lallo oiusony ohsal (Ioou) olusIlo ziacoval (aiso), lxml so zalucl na nouoIInovano onlIl.
12.8. AnaIyza oiusonolo XML
274
>>> import lxml.etree
>>> tree = lxml.etree.parse('examples/feed-broken.xml')
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "lxml.etree.pyx", line 2693, in lxml.etree.parse (src/lxml/lxml.etree.c:52591)
File "parser.pxi", line 1478, in lxml.etree._parseDocument (src/lxml/lxml.etree.c:75665)
File "parser.pxi", line 1507, in lxml.etree._parseDocumentFromURL (src/lxml/lxml.etree.c:75993)
File "parser.pxi", line 1407, in lxml.etree._parseDocFromFile (src/lxml/lxml.etree.c:75002)
File "parser.pxi", line 965, in lxml.etree._BaseParser._parseDocFromFile (src/lxml/lxml.etree.c:72023)
File "parser.pxi", line 539, in lxml.etree._ParserContext._handleParseResultDoc (src/lxml/lxml.
etree.c:67830)
File "parser.pxi", line 625, in lxml.etree._handleParseResult (src/lxml/lxml.etree.c:68877)
File "parser.pxi", line 565, in lxml.etree._raiseParseError (src/lxml/lxml.etree.c:68125)
lxml.etree.XMLSyntaxError: Entity 'hellip' not defined, line 3, column 28
Ahyclom hyII sclonI lallo oiusony XML uolumonl ziacoval (navzuoiy iolioslu iolI loiollnImu
Ioimlu), musImo vylvoiIl vIaslnI XML aisoi.
>>> parser = lxml.etree.XMLParser(recover=True) }1]
>>> tree = lxml.etree.parse('examples/feed-broken.xml', parser) }2]
>>> parser.error_log }8]
examples/feed-broken.xml:3:28:FATAL:PARSER:ERR_UNDECLARED_ENTITY: Entity 'hellip' not defined
>>> tree.findall('{http://www.w3.org/2005/Atom}title')
[<Element {http://www.w3.org/2005/Atom}title at ead510>]
>>> title = tree.findall('{http://www.w3.org/2005/Atom}title')[0]
>>> title.text }4]
'dive into '
>>> print(lxml.etree.tounicode(tree.getroot())) }]
<feed xmlns='http://www.w3.org/2005/Atom' xml:lang='en'>
<title>dive into </title>
.
. [zbvajc serializace pro strunost vynechny]
.
}1] IzIvaloIsly aisoi (synlallIcly anaIyzloi) vznIlno vylvoionIm Inslanco liIuy lxml.etree.
XMLParser. Lzo jI ioual coIou iauu ojmonovanycl aigumonlu. Ns momonlIn zajIm aigu-
monl recover. Poluu joj naslavImo na lounolu True, XML aisoi uuI, co jo v jolo sIIcl, ahy
so z clyh iolI loiollnImu Ioimlu ,zolavII.
}2] Ns XML uolumonl ziacujomo omocI uzIvaloIslolo aisoiu lal, zo ohjoll parser ioumo
IunlcI parse() jalo uiuly aigumonl. VsImnlo sI, zo lxml lvuII nouoIInovano onlIl &hellip;
novyvoIaI zunou vyjImlu.
12.8. AnaIyza oiusonolo XML
275
}8] SynlallIcly anaIyzloi vosloio ioliosly iolI loiollnImu Ioimlu zaznamonv. (Vo slulocnos-
lI jo zaznamonv nozvIsIo na lom, zua jsmo mu naslavIII zolavovacI iozIm o clyh noho no.)
}4] Piolozo novuI, co m s nouoIInovanou onlIlou &hellip; uIal, aisoi jI jounouuso vyuslII.
Talzo loxlovy ohsal, lloiy so naclzI za oIomonlom title, so zmnI na 'dive into '.
}] Jal vIuIlo zo soiIaIIzovano lounoly, onlIla &hellip; so nIlam noiosunuIa. ByIa jounouuso
vyuslna.
Poluu ouzIvmo synlallIclo anaIyzloiy XML so ,zolavonIm, al jo nulno znovu zoaloval, zo no-
oxIslujo zdn zruku vz|omn snucinnnsti. JIny aisoi so molI iozlounoul, zo juo o onlIlu &hellip;
z HTML, a naliauI jI osIounoslI &amp;hellip;. Jo lo ,IosI Mozn. Jo lo ,sivnjsI No. Oha iIa-
uy jsou slojn nosivno. Sivno clovnI (ouIo socIIIlaco XML) socIv v lom, zo aisoi ,zaslavI
a zacno loiol. Poluu jslo so iozlouII, zo lo nouuIlo, jo lo vaso vc.
12.u. Piocllo sI
- XML nu Wikipodiu.nrg
(lll:llon.vIlIouIa.oiglvIlIlXML)
(cosly zuo lll:llcs.vIlIouIa.oiglvIlIlLxlonsIhIo_Mailu_Languago)
- Tho FlomontTroo XML API
(lll:lluocs.yllon.oigly8llIIhiaiylxmI.olioo.oIomonllioo.llmI)
- Flomonts und Flomont Troos
(lll:lloIIhol.oiglzonoloIomonl.llm)
- XPuth Suppnrt in FlomontTroo
(lll:lloIIhol.oiglzonoloIomonl-xall.llm)
- Tho FlomontTroo itorpurso Functinn
(lll:lloIIhol.oiglzonoloIomonl-Iloiaiso.llm)
- lxml
(lll:llcouosoal.nollIxmIl)
- Pursing XML und HTML with lxml
(lll:llcouosoal.nollIxmIl1.8laisIng.llmI)
- XPuth und XSLT with lxml
(lll:llcouosoal.nollIxmIl1.8lxallxsIl.llmI)
- xmlwitch
(llls:llgIlluh.comlgaIvozlxmIvIlcl)

12.u. Piocllo sI
276
277
13. Serializace pythonovskch
objekt
18. KaIloIa
Every Saturday since weve lived in this apartment, I have
awakened at 6:15, poured myself a bowl of cereal, added
a quarter-cup of 2% milk, sat on this end of this couch,
turned on BBC America, and watched Doctor Who.
(Kazuou soholu, ou lo uohy co zIjI v lomlo hyl, jsom vslaI
v 6.1, nasyaI uo soho mIslu coioIII, iIuaI jsom linol
2 mIola, souI jsom sI na tontn lonoc ttn olovly, zanuI
jsom BBC AmoiIca a uIvaI jsom so na Docloi Wlo.)
SloIuon, The g ung Theory
278
Ohsal laIloIy
13. Serializace pythonovskch objekt 277
18.1. Ponoimo so 279
18.1.1. Sliucn oznmla l iIlIauum v lolo laIloIo 279
18.2. IIozonI ual uo ,IclIo souhoiu 280
18.8. NacIlnI ual z ,IclIo souhoiu 281
18.4. ,PIlIonI hoz souhoiu 283
18.. Bajly a iolzco znovu zvouajI
svo oslIIvo lIavy 284
18.6. LaunI ,IclIo souhoiu 284
18.7. SoiIaIIzaco yllonovslycl ohjollu
io clonI z jInycl jazylu 286
18.8. IIozonI ual uo JSON souhoiu 287
18.u. ZohiazonI yllonovslycl ualovycl
lyu uo JSON 289
18.1u. SoiIaIIzaco ualovycl lyu, lloio
JSON noouoiujo 289
18.11. NacIlnI ual z JSON souhoiu 293
18.12. Piocllo sI 295
279
18.1. Ponoimo so
MysIonla soiIaIIzaco vyau na ivnI olIou jounouuso. Mmo ualovou sliulluiu v amlI, lloiou
clcomo uIozIl, znovu ouzIl noho zasIal nlomu jInomu. Jal hyclom lo uuIaII ZIozI lo na lom, jal
jI clcomo uIozIl, jal jI clcomo znovu ouzIl a lomu jI clcomo osIal. Mnolo loi umozujo, ahyslo
sI iI ulonconI uIozIII slav a iI iIslIm suslnI oliacovaII ou lololo mIsla uI. (Vo slulocnoslI lo
umozujo I mnolo aIIlacI, lloio nomajI s liamI nIc soIocnolo.) V lalovom iIau musI hyl ualov
sliulluia, lloi zaclycujo ,vs uosavaunI oliol, iI ulonconI uIozona na uIsl a iI olnom susl-
nI z uIslu naclona. Dala jsou uicona jon io ouzIlI so slojnym iogiamom, lloiy jo vylvoiII. NIluy so
noosIIajI o sIlI a nIluy jo noclo nIc jInolo noz iogiam, lloiy jo vylvoiII. To znamon, zo zIozIlosl
soucInnoslI so omozujo ouzo na lo, ahy hyIa nsIouujIcI voizo iogiamu sclona nacIsl uala zasan
iouclozImI voizomI.
Pio lylo iIauy so IuoIn louI mouuI pickle. Jo soucslI yllonovslo slanuaiunI lnIlovny, lalzo jo
luyloIIv l uIsozIcI. Jo iyclIy. Jolo vlsI csl jo nasna v jazyco C, slojn jalo vIaslnI Inloiiol Pyllo-
nu. Dolzo uIozIl IIhovoIn sIozIlo yllonovslo ualovo sliulluiy.
Co vIasln mouuI pickle uolzo uIozIl
- Vsoclny Pyllonom ouoiovano iIiozono ualovo lyy: hooIoan, coI I ioIn cIsIa, lomIoxnI
cIsIa, iolzco, ohjolly lyu bytes, oIo hajlu a None.
- Soznamy, n-lIco, sIovnIly a mnozIny, lloio ohsalujI IIhovoInou lomhInacI iIiozonycl ualovycl lyu.
- Soznamy, n-lIco, sIovnIly a mnozIny, lloio ohsalujI IIhovoInou lomhInacI soznamu, n-lIc,
sIovnIlu a mnozIn, lloio ohsalujI IIhovoInou lomhInacI iIiozonycl ualovycl lyu
(a lal uIo az uo maxImInI lIouhly zanoionI, lloiou Pyllon ouoiujo).
- Iunlco, liIuy a Inslanco liIu (s uozoinnIm na uicIl nohozocI).
- A oluu so vm lo zu mIo, mouuI pickle jo navIc iozsIiIloIny. Poluu vs moznosl iozsIiIloI-
noslI zajIm, ouIvojlo so na oulazy v oulaIloIo Piocllo sI na loncI laIloIy.
18.1.1. Sliucn oznmla l iIlIauum v lolo laIloIo
Talo laIloIa vyivI iIhl s uvma yllonovslymI sloIIy. Vsoclny iIlIauy v laIloIo jsou cslI
jouno IInIo iIhlu. Blom iouvunI mouuIu pickle a json huuomo ioclzol z jounolo yllonov-
slolo sloIIu uo uiulolo.
Ahyclom oha ou soho oznaII, oloviolo jouon yllonovsly sloII a uoIInujlo nsIouujIcI iomnnou:
>>> shell = 1
Olno noclojlo oloviono. Tou oloviolo uiuly yllonovsly sloII a uoIInujlo iomnnou:
>>> shell = 2
18.1. Ponoimo so
280
Blom laIloIy huuomo ouzIval iomnnou sloII l InuIlacI lolo, lloiy yllonovsly sloII so
u lazuolo iIlIauu ouzIv.
18.2. IIozonI ual uo ,IclIo souhoiu
MouuI pickle iacujo s ualovymI sliulluiamI. Jounu lalovou sI iIiavImo.
>>> shell }1]
1
>>> entry = {} }2]
>>> entry['title'] = 'Dive into history, 2009 edition'
>>> entry['article_link'] = 'http://diveintomark.org/archives/2009/03/27/dive-into-history-2009-edition'
>>> entry['comments_link'] = None
>>> entry['internal_id'] = b'\xDE\xD5\xB4\xF8'
>>> entry['tags'] = ('diveintopython', 'docbook', 'html')
>>> entry['published'] = True
>>> import time
>>> entry['published_date'] = time.strptime('Fri Mar 27 22:20:42 2009') }8]
>>> entry['published_date']
time.struct_time(tm_year=2009, tm_mon=3, tm_mday=27, tm_hour=22, tm_min=20, tm_sec=42, tm_wday=4,
tm_yday=86, tm_isdst=-1)
}1] Buuomo iacoval v yllonovslom sloIIu c. 1.
}2] ZlIaunI mysIonla socIv vo vylvoionI yllonovslolo sIovnIlu, lloiy ioiozonlujo nco uzIloc-
nolo, jalo naiIlIau zznam v Alom Ioou. AIo soucasn hy mI ohsaloval nloIIl iuznycl lyu
ual, ahyclom molII mouuI pickle iouvosl. Nosluuujlo uvouono lounoly zhylocn ouiohn.
}8] MouuI lImo uoIInujo ualovou sliulluiu (struct_time), lloi so ouzIv l ioiozonlacI casu
(s iosnoslI na mIIIsolunuy), a Iunlco, lloio s loulo sliulluiou manIuIujI. Iunlco strptime()
iohIi Ioimlovany iolzoc a iovuI joj uo ouohy struct_time. Tonlo iolzoc jo vo vyclozIm
lvaiu, aIo muzolo joj ovIIvnIl IoimlovacImI znaclamI. PouiohnoslI lIouojlo v uolumonlacI
l mouuIu time.
Talzo lu mmo lisn vyauajIcI yllonovsly sIovnIl. IIozmo joj uo souhoiu.
>>> shell }1]
1
>>> import pickle
>>> with open('entry.pickle', 'wb') as f: }2]
... pickle.dump(entry, f) }8]
...
18.2. IIozonI ual uo ,IclIo souhoiu
281
}1] Poiu so naclzImo v yllonovslom sloIIu c. 1.
}2] K olovionI souhoiu ouzIjomo IunlcI open(). RozIm souhoiu naslavImo na 'wb', ahyclom joj
olovioII io zIs v hIninIm iozImu. ZahaIImo joj uo iIlazu with, ahyclom zajIslIII, zo so
o uolonconI iacI sm zavio.
}8] Iunlco dump() z mouuIu IclIo iohIi yllonovslou soiIaIIzovaloInou ualovou sliulluiu,
soiIaIIzujo jI uo hIninIlo ouohy (jo socIIIcl io Pyllon a ouzIv osIounI voizI iololoIu
io pickle) a uIozI jI uo olovionolo souhoiu.
PosIounI vla jo voImI uuIozIl.
- MouuI pickle iohIi yllonovslou ualovou sliulluiu a uIozI jI uo souhoiu.
- Ahy lo molI uuIal, :eruzuje ualovou sliulluiu s vyuzIlIm ualovolo Ioimlu zvanolo ,IclIo
iololoI. (Poznmla iolIaualoIo: MIIuju angIIcly mIuvIcI lvuico, lloiI uvajI lonsliulcIm
a moclanIsmum ,iozlomII jmona. Piavuouohn zlIaunIm vyznamom angIIclolo IclIo
jo ,nIov a m lalo iauu uaIsIcl vyznamu. Jonzo zluslo lo naasoval na cosly loxl vnovany
iogiamovacImu jazylu. JouIno, co mI soIolIIv iIclzI na mysI, jsou iyvly IsnIcly...
,Kujmo IlIo, IlIo lujmo, soluIujmo, InliIlujmo, IosIlo nIc nonI nau oiuny IlIonI.
Kuo novI, guuugII.)
- PIclIo iololoI jo socIIIcly io Pyllon. Zun ziula mozIjazylovo lomalIhIIIly nooxIslujo.
Piavuouohn nonI mozno, ahyslo vzaII souhoi entry.pickle, lloiy jsmo ziovna vylvoiIII,
a uuIaII s nIm nco iozumnolo v PoiIu, v PHP, v Jav noho v njalom jInom jazyco.
- MouuI pickle nouolzo soiIaIIzoval lazuou yllonovslou ualovou sliulluiu. Pickle iololoI
so nloIIlil zmnII s lIm, jal hyIy uo jazyla Pyllon iIuvny novo ualovo lyy. AIo nlloi
omozonI iolivvajI.
- VysIoulom lcllo zmn jo I lo, zo nooxIslujo zun ziula lomalIhIIIly uolonco anI mozI
iuznymI voizomI Pyllonu. NovjsI voizo Pyllonu ouoiujI slaisI soiIaIIzacnI Ioimly, aIo
slaisI voizo Pyllonu noouoiujI novo Ioimly (iolozo noouoiujI novjsI ualovo lyy).
- Poluu nouicIlo jInal, huuou Iunlco z mouuIu pickle ouzIval osIounI voizo IclIo iololoIu.
TIm jo zajIslna maxImInI iuznosl z lIouIsla lyu soiIaIIzovaloInycl ual, aIo lalo lo znamo-
n, zo vysIouny souhoi nohuuo cIloIny slaisImI voizomI Pyllonu, lloio osIounI voizI IclIo
iololoIu noouoiujI.
- PosIounI voizo IclIo iololoIu ouzIv hIninI Ioiml. IjIsllo so, zo souhoiy io ,IlIonI
olvIilo v hIninIm iozImu. V oacnom iIau uojuo hlom zIsu l oiusonI ual.
18.8. NacIlnI ual z ,IclIo souhoiu
Tou so ionomo uo uiulolo yllonovslolo sloIIu lj. uo lolo, vo lloiom jsmo novylvioII sIovnIl
entry.
18.8. NacIlnI ual z ,IclIo souhoiu
282
>>> shell }1]
2
>>> entry }2]
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
NameError: name 'entry' is not defined
>>> import pickle
>>> with open('entry.pickle', 'rb') as f: }8]
... entry = pickle.load(f) }4]
...
>>> entry }]
{'comments_link': None,
'internal_id': b'\xDE\xD5\xB4\xF8',
'title': 'Dive into history, 2009 edition',
'tags': ('diveintopython', 'docbook', 'html'),
'article_link':
'http://diveintomark.org/archives/2009/03/27/dive-into-history-2009-edition',
'published_date': time.struct_time(tm_year=2009, tm_mon=3, tm_mday=27, tm_hour=22,
tm_min=20, tm_sec=42, tm_wday=4, tm_yday=86, tm_isdst=-1),
'published': True}
}1] TolIo jo yllonovsly sloII c. 2.
}2] NonI zuo uoIInovna zun iomnn entry. Piomnnou entry jsmo uoIInovaII v yllonov-
slom sloIIu c. 1, aIo lon so naclzI v In jInom iosliouI a uuizujo svuj vIaslnI slav.
}8] Oloviomo souhoi entry.pickle, lloiy jsmo vylvoiIII v yllonovslom sloIIu c. 1. MouuI pickle
ouzIv hIninI ualovy Ioiml, lalzo hyslo joj mII vzuy olvIial v hIninIm iozImu.
}4] Iunlco pickle.load() iohIi ohjoll lyu slioam, clo z nj soiIaIIzovan uala, vylviI novy
yllonovsly ohjoll, iolonsliuujo v nm soiIaIIzovan uala a novy yllonovsly ohjoll viacI.
}] NynI iomnn entry ohsalujo sIovnIl s uuvin znmymI lIIcI a lounolamI.
Kioly pickle.dump() / pickle.load() vouou l vylvoionI novo ualovo sliulluiy, lloi so slouujo
s uvounI ualovou sliulluiou.
>>> shell }1]
1
>>> with open('entry.pickle', 'rb') as f: }2]
... entry2 = pickle.load(f) }8]
...
>>> entry2 == entry }4]
True
>>> entry2 is entry }]
False
>>> entry2['tags'] }6]
18.8. NacIlnI ual z ,IclIo souhoiu
283
('diveintopython', 'docbook', 'html')
>>> entry2['internal_id']
b'\xDE\xD5\xB4\xF8'
}1] Pionomo so zl uo yllonovslolo sloIIu c. 1.
}2] Oloviomo souhoi entry.pickle.
}8] Naclomo soiIaIIzovan uala uo novo iomnno entry2.
}4] Pyllon olvizujo, zo so sIovnIly entry a entry2 slouujI. V lomlo sloIIu jsmo sliulluiu entry
vyhuuovaII ou zlIauu. ZacaII jsmo izunym sIovnIlom a iucn jsmo jounolIIvym lIIcum iIiauIII
uicIlo lounoly. SIovnIl jsmo soiIaIIzovaII a uIozIII uo souhoiu entry.pickle. Tou jsmo soiIaIIzova-
n uala z uvouonolo souhoiu nacolII a vylvoiIII jsmo oiIollnI ioIIlu uvounI ualovo sliulluiy.
}] Slounosl aIo nozamujmo za loloznosl. RolI jsom, zo jsmo vylvoiIII er[eL|n reLu uvounI
ualovo sliulluiy, coz jo iavua. AIo oiu jo lo jon loIo.
}6] Z uuvouu, lloio huuou ohjasnny v lolo laIloIo ozujI, clcI uozoinIl na lo, zo lIIcI 'tags'
hyIa iIiazona lounola v ouoh n-lIco a lIIcI 'internal_id' hyI iIiazon ohjoll lyu bytes.
18.4. ,PIlIonI hoz souhoiu
SoiIaIIzacI yllonovslycl ohjollu iImo uo souhoiu na uIsl jsmo sI ulzaII na iIlIauocl v iouclozI
oulaIloIo. AIo co luyz souhoi noclcomo noho nooliohujomo SoiIaIIzacI muzomo iovosl lalo
uo ohjollu lyu bytes, lloiy so naclzI v amlI.
>>> shell
1
>>> b = pickle.dumps(entry) }1]
>>> type(b) }2]
<class 'bytes'>
>>> entry3 = pickle.loads(b) }8]
>>> entry3 == entry }4]
True
}1] Iunlco pickle.dumps() (vsImnlo sI 's' na loncI jmona Iunlco) iovuI slojnou soiIaIIzacI
jalo Iunlco pickle.dump(). AIo noiovozmo ohjoll lyu slioam a soiIaIIzovan uala nozaIso
uo souhoiu na uIsl. MIslo lolo soiIaIIzovan uala jounouuso vilI.
}2] A iolozo pickle iololoI ouzIv hIninI ualovy Ioiml, vilI Iunlco pickle.dumps() ohjoll
lyu bytes.
}8] Iunlco pickle.loads() (ol sI vsImnlo 's' na loncI jmona Iunlco) iovuI slojnou uosoiIa-
IIzacI jalo Iunlco pickle.load(). MIslo clonI soiIaIIzovanycl ual zo souhoiu (ios ohjoll lyu
slioam) iohIi ohjoll lyu bytes, lloiy soiIaIIzovan uala ohsalujo lalovy, jaly vilIIa
Iunlco pickle.dumps().
}4] Konocny vysIouol jo slojny: oiIollnI ioIIla uvounIlo sIovnIlu.
18.4. ,PIlIonI hoz souhoiu
284
18.. Bajly a iolzco znovu zvouajI svo oslIIvo lIavy
PIclIo iololoI so ouzIv uz coIou iauu Iol a vysIvaI soIu s uosIvnIm Pyllonu. V soucasnoslI
oxIslujI clyiI iuzno voizo IclIo iololoIu.
- Pyllon 1.x ouzIvaI uva IclIo iololoIy: loxlovy Ioiml (,voizo u) a hIninI Ioiml (,voizo 1).
- Pyllon 2.8 zavouI novy IclIo iololoI (,voizo 2), lloiy so vyiovnvaI s novou IunlcnoslI
v yllonovslycl ohjollocl liIu. Jolo Ioiml jo hIninI.
- Pyllon 8.u zavouI uaIsI IclIo iololoI (,voizo 8) s oxIIcIlnI ouoiou io ohjolly lyu bytes
a io oIo hajlu. Jolo Ioiml jo hIninI.
Pozoi, iozuII mozI hajly a iolzcI zaso vyslilujo svou oslIIvou lIavu. (Poluu jslo uvaII ozoi, nojslo
iolvaonI.) V iaxI lo znamon, zo zalImco Pyllon 8 umI cIsl uala soiIaIIzovan iololoIom voizo 2,
Pyllon 2 noumI cIsl uala ,zaIlIon iololoIom voizo 8.
18.6. LaunI ,IclIo souhoiu
Jal vIasln IclIo iololoI vyau Vyslocmo na clvIII z yllonovslolo sloIIu a ouIvojmo so
na souhoi entry.pickle, lloiy jsmo vylvoiIII.
you@localhost:~/diveintopython3/examples$ ls -l entry.pickle
-rw-r--r-- 1 you you 358 Aug 3 13:34 entry.pickle
you@localhost:~/diveintopython3/examples$ cat entry.pickle
comments_linkqNXtagsqXdiveintopythonqXdocbookqXhtmlq?qX publishedq?
XlinkXJhttp://diveintomark.org/archives/2009/03/27/dive-into-history-2009-edition
q Xpublished_dateq
ctime
struct_time
?qRqXtitleqXDive into history, 2009 editionqu.
No, moc nm lo louy noomolIo. VIuImo iolzco, aIo oslalnI ualovo lyy loncI jalo nolIslnuloIno
(noho iInojmonsIm nocIloIno) znaly. PoIo zjovn nojsou ouuIona mozoiamI noho lahuIloiy. NonI
lo ziovna Ioiml, lloiy hyclom cllII anaIyzoval samI.
>>> shell
1
>>> import pickletools
>>> with open('entry.pickle', 'rb') as f:
... pickletools.dis(f)
0: \x80 PROTO 3
2: } EMPTY_DICT
3: q BINPUT 0
18.. Bajly a iolzco znovu zvouajI
svo oslIIvo lIavy
18.6. LaunI ,IclIo souhoiu
285
5: ( MARK
6: X BINUNICODE 'published_date'
25: q BINPUT 1
27: c GLOBAL 'time struct_time'
45: q BINPUT 2
47: ( MARK
48: M BININT2 2009
51: K BININT1 3
53: K BININT1 27
55: K BININT1 22
57: K BININT1 20
59: K BININT1 42
61: K BININT1 4
63: K BININT1 86
65: J BININT -1
70: t TUPLE (MARK at 47)
71: q BINPUT 3
73: } EMPTY_DICT
74: q BINPUT 4
76: \x86 TUPLE2
77: q BINPUT 5
79: R REDUCE
80: q BINPUT 6
82: X BINUNICODE 'comments_link'
100: q BINPUT 7
102: N NONE
103: X BINUNICODE 'internal_id'
119: q BINPUT 8
121: C SHORT_BINBYTES ''
127: q BINPUT 9
129: X BINUNICODE 'tags'
138: q BINPUT 10
140: X BINUNICODE 'diveintopython'
159: q BINPUT 11
161: X BINUNICODE 'docbook'
173: q BINPUT 12
175: X BINUNICODE 'html'
184: q BINPUT 13
186: \x87 TUPLE3
187: q BINPUT 14
189: X BINUNICODE 'title'
199: q BINPUT 15
201: X BINUNICODE 'Dive into history, 2009 edition'
18.6. LaunI ,IclIo souhoiu
286
237: q BINPUT 16
239: X BINUNICODE 'article_link'
256: q BINPUT 17
258: X BINUNICODE 'http://diveintomark.org/archives/2009/03/27/dive-into-history-2009-edition'
337: q BINPUT 18
339: X BINUNICODE 'published'
353: q BINPUT 19
355: \x88 NEWTRUE
356: u SETITEMS (MARK at 5)
357: . STOP
highest protocol among opcodes = 3
NojzajImavjsI InIoimacI v lomlo iovoiznIm iolIauu najuomo na osIounIm iulu. Ohsalujo lolIz
voizI IclIo iololoIu, lloiym hyI lonlo souhoi vylvoion. PIclIo iololoI noohsalujo zunou oxIIcIl-
nI znaclu, lloi hy uicovaIa voizI. Ahyclom voizI iololoIu uicIII, musImo iolIIzol znacly (,oo-
iacnI louy) uvnIli soiIaIIzovanycl ual a iIuIl so ouIo lolo, lloiy ooiacnI lou hyI zavouon jalou
voizI IclIo iololoIu. Piosn lo uI Iunlco pickle.dis(). VysIouol vylIslno na osIounIm iulu
iovoiznIlo iolIauu. Tauy mmo IunlcI, lloi vilI cIsIo voizo, anIz hy nco lIslIa:
import pickletools
def protocol_version(file_object):
maxproto = -1
for opcode, arg, pos in pickletools.genops(file_object):
maxproto = max(maxproto, opcode.proto)
return maxproto
A lauy jI vIuImo v alcI:
>>> import pickleversion
>>> with open('entry.pickle', 'rb') as f:
... v = pickleversion.protocol_version(f)
>>> v
3
18.7. SoiIaIIzaco yllonovslycl ohjollu io clonI z jInycl jazylu
Dalovy Ioiml ouzIvany mouuIom pickle jo socIIIcly io Pyllon. NIjal so noolousI o lomalIhI-
IIlu s jInymI iogiamovacImI jazyly. Poluu jo vasIm cIIom mozIjazylov lomalIhIIIla, al so musIlo
oolIounoul o jInycl soiIaIIzacnIcl Ioimlocl. JounIm z nIcl jo JSON. Zlialla ,JSON znamon
,JavaSciIl Ohjocl NolalIon, aIo nonocllo so lIm jmonom zmsl. JSON jo oxIIcIln navizon io ouzI-
lI naiIc iuznymI iogiamovacImI jazyly.
18.7. SoiIaIIzaco yllonovslycl ohjollu
io clonI z jInycl jazylu
287
V Pyllonu 8 jo mouuI json soucslI slanuaiunI lnIlovny. MouuI json m (slojn jalo mouuI pick-
le) Iunlco io soiIaIIzacI ualovycl sliullui, io ulIunI soiIaIIzovanycl ual na uIsl, io nacIlnI
soiIaIIzovanycl ual z uIslu a io uosoiIaIIzacI ual zl uo ouohy novolo yllonovslolo ohjollu. AIo
najuomo zuo lalo uuIozIlo ouIIsnoslI. Zo vsolo nojuiIv uvoumo, zo ualovy Ioiml JSON jo loxlovy a no
hIninI. Ioiml json a zusoh louovnI iuznycl lyu ual jo uoIInovn v RIC 4627. NaiIlIau hooIo-
ovsl lounola jo uIozona huu jalo lIznalovy iolzoc 'false' noho jalo clyiznalovy iolzoc 'true'.
Vsoclny lounoly ouzIvano v json jsou cIlIIvo na voIIlosl Ismon.
Za uiulo lu mmo jalo u vsocl loxlovycl Ioimlu iohIom s hIIymI znaly (vlIlosaco). JSON
uovoIujo, ahy so mozI lounolamI vyslylovaIo IIhovoIno mnozslvI hIIycl znalu (mozoiy, lahuIloiy, n-
vial vozIlu CR, ioclou na novy iuol LI). Tylo hIIo znaly jsou novyznamno. To znamon, zo louoiy
JSON molou iIual hIIo znaly uIo vIaslnIlo uvzonI. Po uolouoiocl JSON so ozauujo, ahy hIIo znaly
mozI lounolamI IgnoiovaIy. To umozujo, ahy hyIa json uala ,ln naIoimlovna (iolly-iInl).
Hounoly molou hyl ln vnoiony uo jInycl lounol iI ouzIlI iuznycl iovnI ousazonI, lalzo uala
huuou uohio cIloIn v loxlovom ouIloiu noho vo slanuaiunIm iolIIzocI. V yllonovslom mouuIu
json najuomo voIhu, lloi iI iocosu louovnI zajIslI ,lno IoimlovnI.
Za liolI lu mmo iolivvajIcI iohIom s louovnIm znalu. json louujo lounoly uo ouohy ioslolo
loxlu, aIo my uz vImo, zo nIc jalo ,iosly loxl nooxIslujo. json musI hyl uIozon v louovnI InIcouo
(v ITI-82, v ITI-16 noho vo vyclozIm UTF-8). Solco 8 uolumonlu RIC 4627 uoIInujo, jal mmo iIcl,
lloio louovnI jo ouzIlo.
18.8. IIozonI ual uo JSON souhoiu
JSON so naun ouoh ualovym sliulluim, lloio hyslo molII iucn uoIInoval v JavaSciIlu. NonI lo
zun nloua. Vo slulocnoslI muzolo io ,uolouovnI ual soiIaIIzovanycl uo JSON ouzIl javasciIl-
ovou IunlcI eval(). (PIalI zuo ohvylI vysliala o nouuviylounycl zuiojIcl, aIo vc so m lal,
zo json oiavuu jo Ialny JavaSciIl.) V lomlo smysIu uz so vm JSON muzo zul uuvin znmy.
>>> shell
1
>>> basic_entry = {} }1]
>>> basic_entry['id'] = 256
>>> basic_entry['title'] = 'Dive into history, 2009 edition'
>>> basic_entry['tags'] = ('diveintopython', 'docbook', 'html')
>>> basic_entry['published'] = True
>>> basic_entry['comments_link'] = None
>>> import json
>>> with open('basic.json', mode='w', encoding='utf-8') as f: }2]
... json.dump(basic_entry, f) }8]
}1] MIslo znovuouzIlI oxIslujIcI ualovo sliulluiy entry sI lou vylvoiImo novou ualovou sliulluiu.
18.8. IIozonI ual uo JSON souhoiu
288
PozujI sI v lolo laIloIo ulzomo, co so slano, luyz so uo JSON olusImo zalouoval sIozIljsI
ualovou sliulluiu.
}2] JSON jo loxlovy Ioiml, coz znamon, zo souhoi musImo oloviIl v loxlovom iozImu a musImo
uicIl znalovo louovnI. NIluy nouuIlo clyhu, luyz ouzIjolo UTF-8.
}8] MouuI JSON (slojn jalo mouuI pickle) uoIInujo IunlcI dump(), lloi iohIi yllonovslou
ualovou sliulluiu a ohjoll lyu slioam iIiavony io zIs. Iunlco dump() soiIaIIzujo yllo-
novslou ualovou sliulluiu a zaIso jI uo ohjollu lyu slioam. VIozonIm voInI uo iIlazu with
zajIslImo, zo o uolonconI ooiaco huuo souhoi loiolln uzavion.
Talzo jal vIasln vysIouol soiIaIIzaco uo json vyau
you@localhost:~/diveintopython3/examples$ cat basic.json
{"published": true, "tags": ["diveintopython", "docbook", "html"], "comments_link": null,
"id": 256, "title": "Dive into history, 2009 edition"}
Tal lolIo jo uicIl mnolom cIloInjsI noz ,zaIlIony souhoi. NavIc JSON muzo mozI lounolamI
ohsaloval IIhovoIno hIIo znaly a mouuI json nahIzI snauny zusoh, jal lolo vyuzIl. DIly lomu
muzomo vylvoiIl josl mnolom cIloInjsI JSON souhoiy.
>>> shell
1
>>> with open('basic-pretty.json', mode='w', encoding='utf-8') as f:
... json.dump(basic_entry, f, indent=2) }1]
}1] Poluu IunlcI json.dump() ioumo aiamoli indent (lj. ousazonI), muzo hyl vysIouny JSON souhoi
mnolom cIloInjsI za conu zvlsonI voIIloslI souhoiu. Paiamoli indent jo coIo cIsIo. u znamon
,umIslI lazuou lounolu na zvIslnI iuol. CIsIo vlsI noz u znamon ,umIslI lazuou lounolu
na zvIslnI iuol a ouzIj lonlo ocol mozoi io ousazovnI zanoionycl ualovycl sliullui.
A lallIo vyau vysIouol:
you@localhost:~/diveintopython3/examples$ cat basic-pretty.json
{
"published": true,
"tags": [
"diveintopython",
"docbook",
"html"
],
"comments_link": null,
"id": 256,
"title": "Dive into history, 2009 edition"
}
18.8. IIozonI ual uo JSON souhoiu
289
18.u. ZohiazonI yllonovslycl ualovycl lyu uo JSON
Piolozo json nonI uicon io Pyllon, najuomo iI zohiazovnI yllonovslycl ualovycl lyu uicIlo
nosiovnaIoslI. Nlloio z nIcl jsou jon iozuIIy v nzvocl, aIo uva uuIozIlo yllonovslo ualovo lyy
v nm In clyhI. SclvIn, joslII sI jIcl vsImnolo:
Poznmky JSON Python 3
ohjoll sIovnIl
oIo soznam
iolzoc iolzoc
Inlogoi Inlogoi
ioIno cIsIo IIoal
* true True
* false False
* null None
* Vsoclny lounoly ouzIvano v JSON jsou cIlIIvo na voIIlosl Ismon.
VsImII jslo sI, co clyhI N-lIco a hajly! JSON uoIInujo ly oIo, lloio mouuI JSON zohiazujo na y-
llonovsly soznam, aIo nouoIInujo ouuIony ly io ,zmiazon oIo (n-lIco). A acloIIv JSON uocoIa
ln ouoiujo iolzco, noouoiujo ohjolly lyu bytes noho oIo hajlu.
18.1u. SoiIaIIzaco ualovycl lyu, lloio JSON noouoiujo
I luyz JSON nom zunou zahuuovanou ouoiu io hajly, noznamon lo, zo hyclom ohjolly lyu
bytes nomolII soiIaIIzoval. MouuI json oslylujo iozsIiujIcI iozlianI (oxlonsIhIIIly lools) io louo-
vnI a uolouovnI noznmycl ualovycl lyu. (SIovom ,noznmy iozumjmo ,nouoIInovany v JSON.
MouuI json zjovn oIo hajlu zn, aIo jo svzn omozonImI socIIIlaco JSON.) Poluu clcomo zalouo-
val hajly noho jIno ualovo lyy, lloio JSON v zlIauu noouoiujo, musImo io n uoual uzIvaloIslo
louoiy a uolouoiy.
>>> shell
1
>>> entry }1]
{'comments_link': None,
'internal_id': b'\xDE\xD5\xB4\xF8',
'title': 'Dive into history, 2009 edition',
'tags': ('diveintopython', 'docbook', 'html'),
'article_link': 'http://diveintomark.org/archives/2009/03/27/dive-into-history-2009-edition',
18.u. ZohiazonI yllonovslycl
ualovycl lyu uo JSON
18.1u. SoiIaIIzaco ualovycl lyu,
lloio JSON noouoiujo
290
'published_date': time.struct_time(tm_year=2009, tm_mon=3, tm_mday=27, tm_hour=22,
tm_min=20, tm_sec=42, tm_wday=4, tm_yday=86, tm_isdst=-1),
'published': True}
>>> import json
>>> with open('entry.json', 'w', encoding='utf-8') as f: }2]
... json.dump(entry, f) }8]
...
Traceback (most recent call last):
File "<stdin>", line 5, in <module>
File "C:\Python31\lib\json\__init__.py", line 178, in dump
for chunk in iterable:
File "C:\Python31\lib\json\encoder.py", line 408, in _iterencode
for chunk in _iterencode_dict(o, _current_indent_level):
File "C:\Python31\lib\json\encoder.py", line 382, in _iterencode_dict
for chunk in chunks:
File "C:\Python31\lib\json\encoder.py", line 416, in _iterencode
o = _default(o)
File "C:\Python31\lib\json\encoder.py", line 170, in default
raise TypeError(repr(o) + " is not JSON serializable")
TypeError: b'\xDE\xD5\xB4\xF8' is not JSON serializable
}1] NaslaI cas l lomu, ahyclom so znovu ouIvaII na ualovou sliulluiu entry. Ohsalujo nsIouujIcI:
hooIoovslou lounolu, lounolu None, iolzoc, n-lIcI iolzcu, ohjoll lyu bytes a sliulluiu time.
}2] J vIm. RIlaI jsom lo uz uiIvo, aIo slojI lo za zoalovnI: JSON jo loxlovy Ioiml. JSON souhoiy
so musI olvIial vzuy v loxlovom iozImu a so znalovym louovnIm UTF-8.
}8] Hmm, lolIo nonI uohio. Co so lo vIasln slaIo
SlaIo so nsIouujIcI: Iunlco json.dump() so olusIIa o soiIaIIzacI ohjollu lyu hylos s lounolou
b'\xDE\xD5\xB4\xF8', aIo soIlaIa, iolozo v JSON ouoia ohjollu lyu bytes clyhI. Poluu jo aIo
io ns ulIunI hajlu uuIozIlo, muzomo sI uoIInoval ns vIaslnI ,mInIsoiIaIIzacnI Ioiml.
def to_json(python_object): }1]
if isinstance(python_object, bytes): }2]
return {'__class__': 'bytes',
'__value__': list(python_object)} }8]
raise TypeError(repr(python_object) + ' is not JSON serializable') }4]
}1] Ahyclom uoIInovaII vIaslnI ,mInIsoiIaIIzacnI Ioiml io ualovy ly, lloiy JSON iIiozon
noouoiujo, musImo uoIInoval IunlcI, lloi iohIi yllonovsly ohjoll jalo aiamoli. TImlo
yllonovslym ohjollom huuo slulocny ohjoll, lloiy Iunlco json.dump() nonI sclona sama
soiIaIIzoval. V nasom iIau jo lo ohjoll lyu hylos s lounolou b'\xDE\xD5\xB4\xF8'.
18.1u. SoiIaIIzaco ualovycl lyu,
lloio JSON noouoiujo
291
}2] Naso uzIvaloIsl soiIaIIzacnI Iunlco hy mIa zlonlioIoval ly yllonovslolo ohjollu, lloiy jI
iouaIa Iunlco json.dump(). Poluu Iunlco soiIaIIzujo jon jouon ualovy ly, nonI lo nozhyln
nulno. Na uiulou slianu so lIm vyjasujo, cIm so Iunlco zahyv. A oluu huuomo ozujI
oliohoval iIual soiIaIIzacI io vIco ualovycl lyu, ujuo lo snaunjI.
}8] V lomlo iIau jsom so iozlouI iovosl ohjoll lyu bytes na sIovnIl. KIIc __class__ huuo
ohsaloval uvounI ualovy ly (v iolzcovo ouoh, 'bytes') a lIIc __value__ huuo ohsaloval
alluInI lounolu. Nomuzo lo, samoziojm, hyl ohjoll lyu bytes. CoIy vlI socIv v iovouu
na nco, co muzo hyl soiIaIIzovno v JSON! Ohjoll lyu hylos jo osIounoslI coIycl cIsoI, luo
lazuo cIsIo nahyv lounol z iozsalu u2. Pio iovou ohjollu lyu hylos na soznam cIsoI
muzomo ouzIl IunlcI list(). Talzo z b'\xDE\xD5\xB4\xF8' so slano [222, 213, 180, 248].
(PocIlojlo! Iungujo lo! Bajl zasany soslncllov \xDE jo uolauIcly 222, \xD5 jo 213 a lal uIo.)
}4] Tonlo iuol jo uuIozIly. Dalov sliulluia, lloiou soiIaIIzujolo, muzo ohsaloval lyy, lloio
nojsou anI zahuuovano uo soiIaIIzloiu json a nozvIuno jo anI ns uzIvaloIsly soiIaIIzloi.
V lalovom iIau musI ns uzIvaloIsly soiIaIIzloi vyvoIal vyjImlu TypeError, ahy so Iunlco
json.dump() uozvuIa, zo ns uzIvaloIsly soiIaIIzloi uany ly nozn.
A lo jo vso. NomusImo uIal nIc jInolo. Konlioln lalo uzIvaloIsl soiIaIIzacnI Iunlco vrut y|honov-
:Ly :ovnL a no iolzoc. NomusImo samI ioaIIzoval coIou ,soiIaIIzacI uo JSON. Piovouomo ouzo csl
,lonvoizo na ouoiovany ualovy ly. Iunlco json.dump() uuI zhylol.
>>> shell
1
>>> import customserializer }1]
>>> with open('entry.json', 'w', encoding='utf-8') as f: }2]
... json.dump(entry, f, default=customserializer.to_json) }8]
...
Traceback (most recent call last):
File "<stdin>", line 9, in <module>
json.dump(entry, f, default=customserializer.to_json)
File "C:\Python31\lib\json\__init__.py", line 178, in dump
for chunk in iterable:
File "C:\Python31\lib\json\encoder.py", line 408, in _iterencode
for chunk in _iterencode_dict(o, _current_indent_level):
File "C:\Python31\lib\json\encoder.py", line 382, in _iterencode_dict
for chunk in chunks:
File "C:\Python31\lib\json\encoder.py", line 416, in _iterencode
o = _default(o)
File "/Users/pilgrim/diveintopython3/examples/customserializer.py", line 12, in to_json
raise TypeError(repr(python_object) + ' is not JSON serializable') }4]
TypeError: time.struct_time(tm_year=2009, tm_mon=3, tm_mday=27, tm_hour=22, tm_min=20,
tm_sec=42, tm_wday=4, tm_yday=86, tm_isdst=-1) is not JSON serializable
18.1u. SoiIaIIzaco ualovycl lyu,
lloio JSON noouoiujo
292
}1] Jmono customserializer aliI mouuIu, vo lloiom jsmo (v iouclozIm iIlIauu) uoIInovaII
IunlcI to_json().
}2] Toxlovy iozIm, louovnI UTF-8 alu., alu. (Jounou na lo zaomonolo! J na lo laly ohcas zaomonu!
A vsoclno huuo Iungoval sivn az uo clvIIo, luy so lo olazI. AIo al so lo olazI so vsI aiuou.)
}8] TolIo jo uuIozIl csl. Ahyclom navsIII svou iovounI IunlcI na IunlcI json.dump(), ioumo
jI iI voInI Iunlco json.dump() jalo lounolu aiamoliu default. (Hui! V Pyllonu jo ohjollom
vsoclno.)
}4] No uohi, ono lo vsoclno noIungujo. AIo ouIvojlo so na vyjImlu. Iunlco json.dump() uz sI
noslzujo na lo, zo nonI sclona soiIaIIzoval ohjoll lyu bytes. Tou uz sI slzujo na In jIny
ohjoll time.struct_time.
MolIo hy so zul, zo vyslyl jIno vyjImly nonI znmlou oliolu. Jonzo on oiavuu jo znmlou olio-
lu! Buuo slacIl jouno maIo oslouclnulI a iolonmo I lolIo.
import time
def to_json(python_object):
if isinstance(python_object, time.struct_time): }1]
return {'__class__': 'time.asctime',
'__value__': time.asctime(python_object)} }2]
if isinstance(python_object, bytes):
return {'__class__': 'bytes',
'__value__': list(python_object)}
raise TypeError(repr(python_object) + ' is not JSON serializable')
}1] PiI iozsIiovnI oxIslujIcI Iunlco customserializer.to_json() oliohujomo zlonlioIoval, zua
jo yllonovsly ohjoll (s lloiym m Iunlco json.dump() olIzo) lyu time.struct_time.
}2] Poluu lomu lal jo, uuImo ouohny iovou jalo v iIau ohjollu lyu bytes. Ohjoll lyu
time.struct_time iovouomo na sIovnIl, lloiy huuo ohsaloval ouzo lounoly, lloio Izo soiIaIIzoval
uo JSON. V nasom iIau jo nojsnaunjsI zusoh iovouu uala a casu na lounolu soiIaIIzovaloInou
uo JSON zaIozon na iovouu na iolzoc omocI Iunlco time.asctime(). Iunlco time.asctime()
iovuI ouoin vyauajIcI time.struct_time na iolzoc 'Fri Mar 27 22:20:42 2009'.
PiI ouzIlI lcllo uvou uzIvaloIslycl lonvoizI iohlno soiIaIIzaco coIo ualovo sliulluiy entry
uo JSON hoz uaIsIcl iohIomu.
>>> shell
1
>>> with open('entry.json', 'w', encoding='utf-8') as f:
... json.dump(entry, f, default=customserializer.to_json)
...
18.1u. SoiIaIIzaco ualovycl lyu,
lloio JSON noouoiujo
293
you@localhost:~/diveintopython3/examples$ ls -l example.json
-rw-r--r-- 1 you you 391 Aug 3 13:34 entry.json
you@localhost:~/diveintopython3/examples$ cat example.json
{"published_date": {"__class__": "time.asctime", "__value__": "Fri Mar 27 22:20:42 2009"},
"comments_link": null, "internal_id": {"__class__": "bytes", "__value__": [222, 213, 180, 248]},
"tags": ["diveintopython", "docbook", "html"], "title": "Dive into history, 2009 edition",
"article_link": "http://diveintomark.org/archives/2009/03/27/dive-into-history-2009-edition",
"published": true}
18.11. NacIlnI ual z JSON souhoiu
MouuI json ohsalujo (slojn jalo mouuI pickle) IunlcI load(), lloi iohIi ohjoll lyu slioam,
clo z nj uala v nolacI JSON a vylviI novy yllonovsly ohjoll, lloiy ouizI ualovou sliulluiu JSON.
>>> shell
2
>>> del entry }1]
>>> entry
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
NameError: name 'entry' is not defined
>>> import json
>>> with open('entry.json', 'r', encoding='utf-8') as f:
... entry = json.load(f) }2]
...
>>> entry }8]
{'comments_link': None,
'internal_id': {'__class__': 'bytes', '__value__': [222, 213, 180, 248]},
'title': 'Dive into history, 2009 edition',
'tags': ['diveintopython', 'docbook', 'html'],
'article_link': 'http://diveintomark.org/archives/2009/03/27/dive-into-history-2009-edition',
'published_date': {'__class__': 'time.asctime', '__value__': 'Fri Mar 27 22:20:42 2009'},
'published': True}
}1] Pio uomonsliacnI coIy so ionomo uo yllonovslolo sloIIu c. 2 a ziusImo lam ualovou
sliulluiu entry, lloiou jsmo v lolo laIloIo vylvoiIII uiIvo, ouzIlIm mouuIu pickle.
}2] V nojjounouussIm iIau iacujo Iunlco json.load() slojn jalo Iunlco pickle.load().
Pioumo jI ohjoll lyu slioam a viacI novy yllonovsly ohjoll.
}8] Mm io vs uohiou a salnou zivu. NojuiIvo lu uohiou. Iunlco json.load() ssn
iocolIa souhoi entry.json, lloiy jsmo vylvoiIII v yllonovslom sloIIu c. 1, a vylvoiIIa novy
yllonovsly ohjoll, lloiy uala ohsalujo. Tou la saln ziva. NovznIlIa lIm uvounI ualov
sliulluia entry. Hounoly 'internal_id' a 'published_date' hyIy vylvoiony jalo sIovnIly.
18.11. NacIlnI ual z JSON souhoiu
294
Juo lonlioln o sIovnIly ohsalujIcI lounoly sIucIloIno s JSON, lloio jsmo vylvoiIII iovounI
IunlcI to_json().
Iunlco json.load() novI nIc o lonvoiznIcl IunlcIcl, lloio jslo molII ioual IunlcI json.dump().
Poliohujomo vylvoiIl IunlcI, lloi jo oalom l IunlcI to_json(). Poliohujomo IunlcI, lloi iovozmo
uzIvaloIsly iovouony ohjoll JSON a lonvoilujo joj zl na uvounI yllonovsly ualovy ly.
# do customserializer.py pidejte nsledujc
def from_json(json_object): }1]
if '__class__' in json_object: }2]
if json_object['__class__'] == 'time.asctime':
return time.strptime(json_object['__value__']) }8]
if json_object['__class__'] == 'bytes':
return bytes(json_object['__value__']) }4]
return json_object
}1] Talo iovounI Iunlco lalo iohIi jouon aiamoli a viacI jounu lounolu. AIo aiamoliom
nonI iolzoc. Jo jIm yllonovsly ohjoll, lloiy jo vysIoulom uosoiIaIIzaco iolzco v nolacI JSON
uo yllonovslolo ohjollu.
}2] Poliohujomo ouzo zlonlioIoval, zua lonlo ohjoll ohsalujo lIIc '__class__', lloiy vylvoiIIa
Iunlco to_json(). Poluu lomu lal jo, iIl lounola lIIco '__class__', jal mmo lounolu
uolouoval zl na uvounI yllonovsly ualovy ly.
}8] K uolouovnI iolzco s casom, lloiy vilIIa Iunlco time.asctime(), ouzIjomo IunlcI time.strptime().
Talo Iunlco iohIi naIoimlovany iolzoc s ualom a casom (v uiavIloInom Ioimlu, aIo s vyclo-
zIm lvaiom slojnym, jaly ouzIv Iunlco time.asctime()) a viacI time.struct_time.
}4] Pio iovou soznamu coIycl cIsoI na ohjoll lyu bytes muzomo ouzIl IunlcI bytes().
A jo lo. Vo IunlcI to_json() so uiavovaIy jon uva ualovo lyy. Slojno ualovo lyy jsmo lou ziacovaII
IunlcI from_json(). A lallIo vyau vysIouol:
>>> shell
2
>>> import customserializer
>>> with open('entry.json', 'r', encoding='utf-8') as f:
... entry = json.load(f, object_hook=customserializer.from_json) }1]
...
>>> entry }2]
{'comments_link': None,
'internal_id': b'\xDE\xD5\xB4\xF8',
'title': 'Dive into history, 2009 edition',
'tags': ['diveintopython', 'docbook', 'html'],
'article_link': 'http://diveintomark.org/archives/2009/03/27/dive-into-history-2009-edition',
18.11. NacIlnI ual z JSON souhoiu
295
'published_date': time.struct_time(tm_year=2009, tm_mon=3, tm_mday=27, tm_hour=22,
tm_min=20, tm_sec=42, tm_wday=4, tm_yday=86, tm_isdst=-1),
'published': True}
}1] IunlcI from_json() l uosoiIaIIzacnImu iocosu iIojImo lIm, zo jI ioumo jalo aiamoli
object_hook IunlcI json.load(). Iunlco, lloi iohIi IunlcI. Jal sIlovno!
}2] Dalov sliulluia entry lou ohsalujo lIIc 'internal_id', joloz lounolou jo ohjoll lyu bytes.
Ohsalujo lalo lIIc 'published_date', joloz lounolou jo ohjoll lyu time.struct_time.
AIo m lo josl jounu mouclu.
>>> shell
1
>>> import customserializer
>>> with open('entry.json', 'r', encoding='utf-8') as f:
... entry2 = json.load(f, object_hook=customserializer.from_json)
...
>>> entry2 == entry }1]
False
>>> entry['tags'] }2]
('diveintopython', 'docbook', 'html')
>>> entry2['tags'] }8]
['diveintopython', 'docbook', 'html']
}1] Dolonco anI o iIojonI Iunlco to_json() l soiIaIIzacI a iIojonI Iunlco from_json()
l uosoiIaIIzacI so nm slIo noouaiIIo vylvoiIl uolonaIou ioIIlu uvounI ualovo sliulluiy.
Pioc lomu lal jo
}2] V uvounI ualovo sliulluio entry hyIa lounolou lIIco 'tags' n-lIco liI iolzcu (louy liojIco
iolzcu).
}8] AIo v ualovo sliulluio entry2, lloiou jsmo uoslaII iovouom lam a zaso zl, m lIIc 'tags'
lounolu soznamu lcllo liI iolzcu. JSON nouI iozuII mozI n-lIcomI a soznamy. Zn jon
jouon soznamu so ouohajIcI ualovy ly ly oIo. MouuI json hlom soiIaIIzaco olIclu
lonvoilujo jal n-lIco, lal soznamy na oIo v JSON. PiI vlsIn ouzIlI muzolo iozuII mozI
n-lIcomI a soznamy Ignoioval. AIo oluu iacujolo s mouuIom json, mII hyslo na lo mysIol.
18.12. Piocllo sI
> Raua cInlu o mouuIu pickle so oulazujo na cPickle. V Pyllonu 2 oxIslovaIy uv ImIomonlaco
mouuIu pickle. Jouna hyIa nasna v Pyllonu a uiul v jazyco C (aIo uaIa so voIal z Pyllonu).
V Pyllonu 8 hyIy lylo mouuIy sojony, lalzo olazuo iovuImo jon Imoil pickle. ZmInno
cInly molou hyl uzIlocno, aIo InIoimacI o cPickle (lloi jo nynI zaslaiaI) hyslo mII Ignoioval.
18.12. Piocllo sI
296
O ,IlIonI s mouuIom pickle:
- pickle mndulo
(lll:lluocs.yllon.oigly8llIIhiaiylIclIo.llmI)
- pickle and cPickle Pythnn nb|oct soriulizutinn
(lll:llvvv.uougloIImann.comlPyMOTWlIclIo)
- Using pickle
(lll:llvIlI.yllon.oiglmoInlIsIngPIclIo)
- Pythnn porsistonco munugomont
(vvv.Ihm.comluovoIooivoilslIIhiaiylI-yois.llmI)
O JSON a o mouuIu json:
- json JuvuScript Ob|oct Nntutinn Soriulizor
(vvv.uougloIImann.comlPyMOTWljsonl)
- JSON oncnding und ocnding with custnm nb|octs in Pythnn
(lll:llhIog.qualoinIo.noll2uuulu7l16ljson-oncouIng-anu-uocouIng-vIll-cuslom-ohjocls-In-yllonl)
O iozsIiIloInoslI mouuIu pickle:
- Pickling cluss instuncos
- Porsistonco nf oxtornul nb|octs
- Hundling stutoful nb|octs
(vso na lll:lluocs.yllon.oigly8llIIhiaiylIclIo.llmI)
18.12. Piocllo sI
297
14. Webov sluby nad HTTP
14. KaIloIa
A ruffled mind makes a restless pillow.
(Rozhouion mysI jo noolouIny oIsli.)
ClaiIollo Bionloov
298
Ohsal laIloIy
14. Webov sluby nad HTTP 297
14.1. Ponoimo so 299
14.2. VIaslnoslI HTTP 300
14.2.1. PouzIvnI mozIamlI 300
14.2.2. KonlioIa Lasl-MouIIIou 301
14.2.8. KonlioIa LTag 303
14.2.4. Komioso 304
14.2.. PiosmiovnI 304
14.8. Jal so nouoslal l ualum ios HTTP 305
14.4. Co zo lo mmo na uil 306
14.. Piouslavujomo httplib2 309
14..1. Kill ouhocla vysvlIujIcI,
ioc httplib2 viacI hajly mIslo iolzcu 311
14..2. Jal httplib2 zaclzI s mozIamlI 312
14..8. Jal httplib2 zaclzI s lIavIclamI
Last-Modified a ETag 315
14..4. Jal http2lib iacujo s lomiosI 318
14... Jal httplib2 iosI iosmiovnI 318
14.6. Za lianIcomI HTTP GLT 322
14.7. Za lianIcomI HTTP POST 326
14.8. Piocllo sI 328
299
14.1. Ponoimo so
Z IIIozoIIclolo lIouIsla muzomo vohovo sIuzhy nau HTTP (HyoiToxl TiansIoi PiolocoI) osal uovIlI
sIovy: vymna ual so vzuIonymI soivoiy ouzo s ouzIlIm ooiacI iololoIu HTTP. Poluu clcomo
zo soivoiu zIslal uala, ouzIjomo HTTP GET. Poluu clcomo nov uala na soivoi zasIal, ouzIjomo HTTP
POST. Nlloi oliocIIojsI aIIlacnI iozlianI (API) vohovycl sIuzoh nau HTTP umozujI lalo vylvionI,
mouIIIlacI a iusonI ual ouzIlIm http PUT a HTTP DELETE. To jo vso. Zuno iogIsliy, zuno ohIly, zuny
ohaIujIcI lou, zuno lunoIovnI. ,SIovosa, lloi jsou soucslI lll iololoIu (GET, POST, PUT a DELETE)
iImo ouovIuajI ooiacIm na aIIlacnI iovnI io zIslvnI, vylvionI, mouIIIlacI a iusonI ual.
HIavnI vylouou lololo iIsluu jo jounouuclosl a iv jounouuclosl vouIa l jolo ohIIh. Dala
ohvylIo XML noho JSON molou hyl vylvoiona a uIozona jalo slalIcl, noho molou hyl gonoiovna
uynamIcly, sliIlom na slian soivoiu. Vsoclny lIavnI iogiamovacI jazyly (samoziojm vcoln
Pyllonu) umozujI slalovnI lcllo ual iosliounIclvIm svycl HTTP-lnIlovon. JounouussI jo I IaunI.
Kazuy iosliouol (iosouico) vohovo sIuzhy nau HTTP m jounoznacnou auiosu v ouoh URL. Po zau-
nI uo vohovolo iolIIzoco uojuo l naclonI a lnou vIuIlo suiov uala.
PiIlIauy vohovycl sIuzoh nau HTTP:
- Aplikucn rnzhrun Gnnglo Dutu vm umoznI uzIvaloIsly iacoval s coIou iauou sIuzoh
GoogIo, vcoln Blnggor a YnuTubo.
- Flickr Sorvicos vm umoznI ouosIIal a slaloval IologiaIIo z Flickr.
- Twittor API vm umoznI zvoiojoval lillo zivy na Twittor.
- .u rudu dulsch
Pio InloialcI s vohovymI sIuzhamI nau HTTP jsou v Pyllonu 8 l uIsozIcI uv iuzno lnIlovny:
- http.client jo nIzloiovov lnIlovna, lloi ImIomonlujo RFC 2616, louy HTTP-iololoI.
- urllib.request jo lnIlovna na vyssI iovnI ahslialco, vyhuuovan nau http.client. Posly-
lujo slanuaiunI aIIlacnI iozlianI io ziIsluovnI jal HTTP, lal FTP soivoiu, aulomalIcly
nsIouujo iosmiovnI HTTP a ouoiujo nlloio hzno Ioimy aulonlIzaco v HTTP.
Talzo lloiy mm ouzIl Z lcllo uvou zuny. MIslo lolo hyslo mII ouzIl httplib2, coz jo oon
souico lnIlovna liolI sliany, lloi ImIomonlujo HTTP uo vlsIcl uolaIIu noz http.client. Soucasn
ouzIv IosI ahslialco noz urllib.request.
Ahyslo oiozumII lomu, ioc jo httplib2 lou sivnou voIhou, musIlo nojuiIvo oiozuml HTTP.
14.1. Ponoimo so
300
14.2. VIaslnoslI HTTP
Kazuy HTTP lIIonl hy mI ouoioval l uuIozIlycl vIaslnoslI.
14.2.1. PouzIvnI mozIamlI
NojuuIozIljsI vcI, lloio musImo v souvIsIoslI s IIhovoI-
nym lyom vohovo sIuzhy iozuml, jo lo, zo iIslu
l sIlI jo voImI uialy. Nomm na mysII conu ,v onzIcl
(I luyz sIila ionosovolo sma nonI zauaimo). Mm
na mysII lo, zo liozn uIoulou uohu zahoio olovionI so-
jonI, ouosInI ozauavlu a zIslnI ouozvy zo vzuIonolo
soivoiu. Dolonco I v iIau nojiyclIojsIlo uoslunolo
sojonI muzo hyl u|ente (lj. cas mozI zasInIm ozauavlu a zaljonIm iIjImnI ual ouovuI) vyssI,
noz hyslo iouolIuaII. Smiovaco molou zaIungoval uIvn, alol so zlialI, na mozIIolIy soivoi
nluo zalocII... Na voiojno Inloinolovo sIlI nonI nIluy lIIun clvIIla a nIc s lIm nonauIlo.
PiI nvilu HTTP so ocIlaIo s vyuzIvnIm mozIamlI (caclo). LxIslujo uolonco samoslaln liIua
zaiIzonI (zvanycl ,mozIamlovo ioxy-soivoiy, angIIcly ,claclIng ioxIos), jojIclz jouInou iacI
jo Iozol mozI vmI a zhyllom svla a mInImaIIzoval zalzovnI sIl. Vaso IIima noho vs oslylovaloI
iIojonI (ISP) lomi jIsl mozIamlovo ioxy-soivoiy uuizujo, I luyz sI lolo nomusIlo hyl vuomI.
IungujI, iolozo ouzIvnI mozIamlI (caclIng) jo soucslI HTTP iololoIu.
NsIouujo lonliolnI iIlIau lolo, jal lo Iungujo. PiosliounIclvIm svolo iolIIzoco navslIvIlo
diveintomark.org. Ivouon slinla ouzIv io ozauI ohizol wearehugh.com/m.jpg. Kuyz vs
iolIIzoc ohizol sllno, soivoi l nmu iIIozI nsIouujIcI HTTP lIavIcly:
HTTP/1.1 200 OK
Date: Sun, 31 May 2009 17:14:04 GMT
Server: Apache
Last-Modified: Fri, 22 Aug 2008 04:28:16 GMT
ETag: "3075-ddc8d800"
Accept-Ranges: bytes
Content-Length: 12405
Cache-Control: max-age=31536000, public
Expires: Mon, 31 May 2010 17:14:04 GMT
Connection: close
Content-Type: image/jpeg
HIavIcly Cache-Control a Expires iIlajI vasomu iolIIzocI (a vsom mozIamlovym ioxy-soivoium
mozI vmI a soivoiom), zo so lonlo ohizol muzo zIslval z mozIamlI az jouon iol. Cey roL! A oluu
14.2. VIaslnoslI HTTP
Cache-Control: max-age
znamen neotravujte m
a do ptho tdne..
301
nluy v iIslIm ioco navslIvIlo jInou slinlu, lloi lalo ohsalujo oulaz na lonlo ohizol, vs iolII-
zoc joj naclo zo svo mozIamlI, un2 Iy vyvou juLouLov :|ovou uL|v|u.
AIo oclojlo, huuo lo josl IosI. Dojmo lomu, zo vs iolIIzoc ohizol z IolInI mozIamlI z njalo-
lo uuvouu ouslianI. Mozn mu uosIo mIslo na uIslu, mozn jslo mozIaml vyizunIII iucn.
Z jalololoIIv uuvouu. AIo HTTP lIavIcly iIlajI, zo lalo uala molou hyl uclovvna voiojnymI mozI-
amlovymI ioxy-soivoiy. (Z loclnIclolo olIouu jo uuIozIlo, co lIavIcly neILuj. HIavIcla Cache-
Control nouvuI lIIcovo sIovo private, lalzo uala molou hyl uIozona v mozIamlI aulomalIcly.)
MozIamlovo ioxy-soivoiy jsou navizony lal, zo majI l uIsozIcI ohiovslo mnozslvI Ioznolo
iosloiu iavuouohn lo majI mnolom vIco, noz m vyliazono vs IolInI iolIIzoc.
Poluu vaso IIima noho vs oslylovaloI iIojonI siavujo mozIamlovy ioxy-soivoi, muzo so v jolo
mozIamlI ohizol oiu josl naclzol. Poluu navslIvIlo diveintomark.org znovu, ouIv so vs
iolIIzoc o ohizlu uo IolInI mozIamlI, aIo nonajuo joj. Talzo vylvoiI sIlovy ozauavol a olusI
so ohizol sllnoul zo vzuIonolo soivoiu. Poluu aIo mozIamlovy ioxy-soivoi oiu m loII
uvouonolo ohizlu, vs ozauavol zaclylI a uou vm ohizol zo svo mozIamlI. To znamon, zo so
vs ozauavol lo vzuIonomu soivoiu nIluy nouoslano. Vo slulocnoslI nomusI ouslIl vasI IIiomnI sIl.
ZIslnI ohizlu jo iyclIojsI (mon slolu o sIlI) a vaso IIima usoliI onIzo (z vnjsIlo svla so slalujo
mon ual).
PouzIlI mozIamlI v HTTP Iungujo, oluu vsoclny sliany uIajI, co majI. Na jouno slian musI soivoiy
v ouovuIcl osIIal sivno lIavIcly. Na uiulo slian musI lIIonlI lIavIclm iozuml, iosolloval
jo a nozual slojn uala uvalil. MozIIolIo ioxy-soivoiy nojsou vsoIolom. Molou hyl ,clylio jon
uo lo mIiy, uo jalo jIm lo soivoiy a lIIonlI umoznI.
SlanuaiunI yllonovslo lnIlovny io HTTP ouzIvnI mozIamlI noouoiujI, aIo httplib2 ano.
14.2.2. KonlioIa Lasl-MouIIIou
Nlloi uala so nomnI nIluy, zalImco jIn uala so mnI oiu. A mozI lIm jo ohiovslo mnozslvI ual,
lloi so molIa zmnIl, aIo nozmnIIa so. PuhIIlovany ohsal (Ioou) soivoiu CNN.com so mnI lazuycl
i mInul, aIo uhIIlovany ohsal molo vohIogu so nomusI zmnIl coIo uny noho lyuny. I luyhy lo
hyI lon uiuly iIau, noclcI lIIonlum iIcl, ahy sI muj uhIIlovany ohsal hiaII z mozIamlI coIo
lyuny, iolozo oluu hycl uooiavuy nco novolo zvoiojnII, IIuo hy so o lom coIo lyuny nouozvuII
(iolozo hy iosollovaII mo lIavIcly lylajIcI so mozIamlI, lloio iIlajI ,noohlzujlo so s lonlioIou
lololo uhIIlovanolo ohsalu o coIo lyuny). Na uiulou slianu zaso noclcI, ahy lIIonlI slalovaII coIy
uhIIlovany ohsal (Ioou) lazuou louInu, oluu so vuhoc nozmnII!
HTTP nahIzI iosonI I io lonlo iIau. Poluu o uala zu-
mo oivo, soivoi muzo zl osIal lIavIclu Last-Modi-
fied (naosIouy zmnno). Jo lo iosn lo, jal lo vyau:
14.2. VIaslnoslI HTTP
304: Not Modified znamen
stejn nesmysly, jin den.
302
ualum a cas, luy so uala naosIouy zmnIIa. Ohizol ozauI, na lloiy vouI oulaz z diveintomark.
org, uoiovzoIa lIavIcla Last-Modified.
HTTP/1.1 200 OK
Date: Sun, 31 May 2009 17:14:04 GMT
Server: Apache
Last-Modified: Fri, 22 Aug 2008 04:28:16 GMT
ETag: "3075-ddc8d800"
Accept-Ranges: bytes
Content-Length: 12405
Cache-Control: max-age=31536000, public
Expires: Mon, 31 May 2010 17:14:04 GMT
Connection: close
Content-Type: image/jpeg
Poluu ozauujomo slojn uala ouiulo (noho oliolI noho oclvilo), muzomo v uolazu osIal lIavIc-
lu If-Modified-Since (oluu hyIo zmnno ou) s lounolou uala a casu, lloio jsmo ou soivoiu uoslaII
mInuIo. Poluu so uala ou lo uohy zmnIIa, al soivoi vilI nov uala uoInn o slavovy lou 200. AIo
oluu so uala ou lo uohy nezm6nu, soivoi osIo zl socIInI slavovy lou iololoIu HTTP 304.
Ton iIl ,ou uohy, luy sos naosIouy laI, so lalo uala nozmnIIa. Z iIlazovolo iulu sI lo muzomo
oviIl nsliojom curl:
you@localhost:~$ curl -I -H "If-Modified-Since: Fri, 22 Aug 2008 04:28:16 GMT" http://wearehugh.
com/m.jpg
HTTP/1.1 304 Not Modified
Date: Sun, 31 May 2009 18:04:39 GMT
Server: Apache
Connection: close
ETag: "3075-ddc8d800"
Expires: Mon, 31 May 2010 18:04:39 GMT
Cache-Control: max-age=31536000, public
A ioc hy lo mIo hyl vyIosonI Piolozo luyz soivoi osIo 304, neo:0 du|u znovu. Doslanomo ouzo
slavovy lou. KonlioIa osIounI mouIIIlaco zajIslI, zo so nozmnn uala nohuuou slaloval ouiulo
I v iIau, luy uosIo l vyisonI IalnoslI loIo v IolInI mozIamlI. (Jalo honus navIc ohsalujo
ouovu 304 lalo lIavIcly io mozIaml. Pioxy-soivoiy sI loII ual uizI, uolonco I luyz oIIcIIn
,oxIiovaIa, v naujI, zo so uala ve :Lu|etno:| nozmnIIa a zo uaIsI ozauavol ovouo l ouovuI
so slavovym louom 304 a s alluaIIzovanymI InIoimacomI io mozIaml.)
SlanuaiunI yllonovslo lnIlovny io HTTP noouoiujI lonlioIu uala osIounI mouIIIlaco,
aIo httplib2 ano.
14.2. VIaslnoslI HTTP
303
14.2.8. KonlioIa LTag
LTagy (lag = znacla) iouslavujI aIloinalIvnI zusoh uosazonI slojnolo oIollu jalo v iIau lonlioIy
Iasl-mouIIIou. PiI ouzIlI LTagu osII soivoi soIu s ozauovanymI ualy v lIavIcco ETag s los-louom
(lasl). (Jal so iosn los-lounola uicI, lo zvIsI zcoIa na soivoiu. JouIny ozauavol jo lalovy, ahy so
zmnIIa, oluu so zmnI uala.) Ohizol ozauI, na lloiy vouI oulaz z diveintomark.org, uoiovzoIa
lIavIcla ETag.
HTTP/1.1 200 OK
Date: Sun, 31 May 2009 17:14:04 GMT
Server: Apache
Last-Modified: Fri, 22 Aug 2008 04:28:16 GMT
ETag: "3075-ddc8d800"
Accept-Ranges: bytes
Content-Length: 12405
Cache-Control: max-age=31536000, public
Expires: Mon, 31 May 2010 17:14:04 GMT
Connection: close
Content-Type: image/jpeg
Poluu slojn uala ozauujomo ouiulo, iIIozImo los-
lounolu v lIavIcco oiauavlu If-None-Match (oluu
zun uala noouovIuajI). Poluu so uala nozmnIIa, soivoi
osIo zl slavovy lou 304. Soivoi slojn jalo v iIau
lonlioIy zaIozono na caso osIounI mouIIIlaco osIo
zl ouze slavovy lou 304. Slojn uala znovu noosII.
PiIIozonIm los-lounoly v LTagu iI uiulom ozauavlu soivoiu iIlmo, zo iI slou loso nonI nulno
osIIal slojn uala znovu, iolozo jo oiu mmo sclovan ou mInuIa.
Ol vyzlousImo omocI curl:
you@localhost:~$ curl -I -H "If-None-Match: \"3075-ddc8d800\"" http://wearehugh.com/m.jpg }1]
HTTP/1.1 304 Not Modified
Date: Sun, 31 May 2009 18:04:39 GMT
Server: Apache
Connection: close
ETag: "3075-ddc8d800"
Expires: Mon, 31 May 2010 18:04:39 GMT
Cache-Control: max-age=31536000, public
}1] LTagy so hzn uzavIiajI uo uvozovol, aIo |y|o uvozovLy j:ou :out0:| hodno|y. To znamon,
zo v lIavIcco If-None-Match musImo soivoiu osIal zl I uvozovly.
14.2. VIaslnoslI HTTP
ETag vyjaduje nic novho
pod sluncem.
304
SlanuaiunI yllonovslo lnIlovny io HTTP ouzIvnI LTagu noouoiujI, aIo httplib2 ano.
14.2.4. Komioso
Poluu so havImo o vohovycl sIuzhcl nau HTTP, al so lomi vzuy havImo o iosunovnI loxlovycl
ual o uilocl lam a zaso zl. Mozn jsou vo Ioimlu XML, mozn jsou v JSON, mozn jo lo iosly loxl.
Toxl so u uohio lomiImoval nozvIsIo na ouzIlom Ioimlu. PiIlIau uhIIlovanolo ohsalu (Ioou)
z laIloIy XML m nolomiImovany 8u7u hajlu, aIo o lomiosI aIgoiIlmom gzip m u41 hajlu. To jo
jon 8u uvounI voIIloslI!
HTTP ouoiujo nloIIl lomiImacnIcl aIgoiIlmu. MozI uva nojhznjsI aliI gzip a deflate. Poluu
ios HTTP ozauujomo njaly iosliouol (iosouico), muzomo soivoiu iIcI, ahy lo osIaI v lomiImova-
nom Ioimlu. Do ozauavlu vIozImo lIavIclu Accept-encoding, vo lloio vyjmonujomo nmI ouo-
iovano lomiImacnI aIgoiIlmy. Poluu soivoi nlloiy z lcllo aIgoiIlmu ouoiujo, osIo nm zl
lomiImovan uala (s lIavIclou Content-encoding, lloi iIl, jaly aIgoiIlmus hyI ouzIl).
O uolomiosI so uz musImo oslaial samI.
> DuIozIly lI io vyvojio louu na slian soivoiu: IjIsllo so, zo lomiImovan ouoha zuiojo
uoslano iIuIonou jInou znaclu Llag noz nolomiImovan voizo. V oacnom iIau hy uosIo
lo zmalonI mozIamlovycl ioxy-soivoiu a ly hy molIy lIIonlum viacol lomiImovanou
voizI, so lloiou hy sI lIIonl nomusoI oiauIl. VIco uolaIIu o lolo uoIIllnI zIozIloslI sI muzolo
iocIsl v uIslusI Aaclo hug 8u727.
SlanuaiunI yllonovslo lnIlovny io HTTP lomiosI noouoiujI, aIo httplib2 ano.
14.2.. PiosmiovnI
SonzacnI URI so nomnI, aIo mnol uiI jsou oiavuu... nosonzacnI. Wohov mIsla so iooiganIzujI,
slinly so iosouvajI na novo auiosy. Dolonco I vohovo sIuzhy molou hyl iooiganIzovny.
PuhIIlovany ohsal (synuIcalou Ioou) molI hyl iosunul z http://example.com/index.xml
uo http://example.com/xml/atom.xml.
Noho so iI iozsIiovnI a iooiganIzacI IIimy molIa iosunoul coI uomona.
Z http://www.example.com/index.xml so mnI na http://server-farm-1.example.com/index.xml.
Polazuo, luyz HTTP soivoi ozumo o njaly zuioj (iosou-
ico), viacI v ouovuI slavovy lou. Slavovy lou 200 zna-
mon ,vso v oiulu, lauy jo ozauovan slinla. Slavovy
lou 404 znamon ,slinla nonaIozona. (Clyhu 4u4 jslo uz
asI iI hiouzunI o vohu vIuII.) Slavovo louy vo sluIn
8uu vyjauiujI njalou Ioimu iosmiovnI.
14.2. VIaslnoslI HTTP
Location znamen
podvej se tmhle!
Ka.
305
HTTP nahIzI nloIIl zusohu, jalymI so u oznmIl, zo so ozauovano zuiojo iosunuIy. Dv nojhznj-
sI loclnIly ouzIvajI slavovo louy 302 a 301. Slavovy lou 302 oznacujo dotu:n6 Ie:m6rov0n. Znamo-
n ,ojlIo, jo lo uocasn iosunulo (a v lIavIcco LocalIon so vilI uocasn auiosa). Slavovy lou 301
oznacujo |rvu6 Ie:m6rov0n. Znamon ,ojlIo, jo lo livaIo iosunulo (a v lIavIcco Location so
viacI nov auiosa). Poluu ohuizIlo slavovy lou 302 a novou auiosu, al mlo ouIo socIIIlaco HTTP
io ozauovanou vc ouzIl novou auiosu. AIo az so huuolo na slojny zuioj InIoimacI ll iIsl,
mlo lo znovu zlusIl s uvounI auiosou. Poluu aIo ohuizIlo slavovy lou 301 a l nmu novou auiosu,
ocolv so ou vs, zo ou lolo olamzIlu zacnolo ouzIval novou auiosu.
MouuI urllib.request iI ohuizonI iIsIusnolo slavovolo louu ou HTTP soivoiu sIco ,nsIouujo
iosmiovnI, aIo noiolno vm, zo lalo sIluaco naslaIa. Doslanolo uala, lloi jslo ozauovaII, aIo
nIluy so nouozvIlo, zo so ouzIl lnIlovna zaclovaIa ,uzIlocn a nsIouovaIa iosmiovnI za vs.
Talzo oiu husIlo na slaio auioso a olazuo jslo soivoiom iosmiovnI na novou auiosu a mouuI
urllib.request olazuo ,uzIlocn nsIouujo iosmiovnI. JInymI sIovy, lalo lnIlovna so l livaIomu
iosmiovnI clov slojn jalo l uocasnomu iosmiovnI. To znamon, zo so mIslo jounolo loIa
iovouou vzuycly uv. To jo salno jal io soivoi, lal io vs.
KnIlovna httplib2 livaIo iosmiovnI zvIu. Nojon zo vm iolno, zo naslaIo livaIo iosmiov-
nI, aIo IolIn sI jo oznamon a iosmiovan URL aulomalIcly ioIso uiIvo, noz vznoso iIsIusny
ozauavol.
14.8. Jal so nouoslal l ualum ios HTTP
Dojmo lomu, zo ios HTTP clcomo sllnoul InIoimacnI zuioj, jalo jo naiIlIau Alom Ioou. Piolozo juo
o uhIIlovany ohsal (Ioou), nohuuomo joj slaloval jon jounou. Buuomo joj slaloval oalovan, oiu
uoloIa. (VlsIna clocol uhIIlovanolo ohsalu (Ioou ioauoi) lonlioIujo zmny lazuou louInu.) NojuiI-
vo vyzlousImo ,iyclIy a sInavy zusoh a al so ouIvmo, jal hyclom lo molII iovul Ioo.
>>> import urllib.request
>>> a_url = 'http://diveintopython3.org/examples/feed.xml'
>>> data = urllib.request.urlopen(a_url).read() }1]
>>> type(data) }2]
<class 'bytes'>
>>> print(data)
<?xml version='1.0' encoding='utf-8'?>
<feed xmlns='http://www.w3.org/2005/Atom' xml:lang='en'>
<title>dive into mark</title>
<subtitle>currently between addictions</subtitle>
<id>tag:diveintomark.org,2001-07-29:/</id>
<updated>2009-03-27T21:56:07Z</updated>
<link rel='alternate' type='text/html' href='http://diveintomark.org/'/>

14.8. Jal so nouoslal l ualum ios HTTP
306
}1] SlazonI cololoIIv ios HTTP jo v Pyllonu nouviIloIn jounouuclo. D so lo vo slulocnoslI
nasal na jouon iuol. MouuI urllib.request nahIzI sIlovnou IunlcI urlopen(), lloi iohIi
auiosu ozauovano slinly a viacI ohjoll lyu slioam, zo lloiolo zIslmo coIy ohsal slinly
ioslym zavoInIm molouy read(). Iz lo asI nomuzo hyl jounouussI.
}2] Moloua urlopen().read() viacI vzuy ohjoll lyu bytes a no iolzoc. Vzomolo sI hajly jsou
hajly, znaly jsou ahslialco. HTTP soivoiy noiacujI s ahslialcomI. KuyloIIv ozumo
o njaly zuioj (iosouico), uoslanomo hajly. Poluu z lolo clcomo uuIal iolzoc, musImo zjIslIl
znalovo louovnI a iovosl oxIIcIlnI iovou na iolzoc.
A co na lom jo salnolo PiI iyclIom, jounoizovom iIsluu hlom IaunI a vyvojo na lom nonI sal-
nolo nIc. DIm lo lallIo oiu. CllI jsom uhIIlovany ohsal (Ioou), uoslaI jsom uhIIlovany ohsal.
Slojn loclnIla Iungujo io IIhovoIno vohovo slinly. AIo jalmIIo o lom zacnomo uvazoval z olIouu
vohovo sIuzhy, lloi so m vyuzIval iavIuoIn (lj. ozauavol na zIslnI uhIIlovanolo ohsalu lazuou
louInu), al hy lo hyIo nooIollIvnI a my hyclom hyII nozuvoiIII.
14.4. Co zo lo mmo na uil
Ahyclom vIuII, ioc jo lo nooIollIvnI a nozuvoiIIo, ohilImo so na IauIcI iosliouly yllonovslo
lnIlovny io HTTP a uvIuImo, co hl ,o uilocl (lj. co so ionsI v sIlI).
>>> from http.client import HTTPConnection
>>> HTTPConnection.debuglevel = 1 }1]
>>> from urllib.request import urlopen
>>> response = urlopen('http://diveintopython3.org/examples/feed.xml') }2]
send: b'GET /examples/feed.xml HTTP/1.1 }8]
Host: diveintopython3.org }4]
Accept-Encoding: identity }]
User-Agent: Python-urllib/3.1' }6]
Connection: close
reply: 'HTTP/1.1 200 OK'
dal ladic informace vyputny
}1] Jal uz jsom so zmInII na zacllu lolo laIloIy, urllib.request soIol na uaIsI slanuaiunI
yllonovslou lnIlovnu, http.client. S lnIlovnou http.client za noimInIcl oloInoslI
uo iImolo slylu noiIclzIlo. (MouuI urllib.request jI Imoilujo aulomalIcly.) AIo my sI jI
Imoilujomo iucn, ahyclom molII naslavIl iIznal IaunI u liIuy HTTPConnection, lloiou
mouuI urllib.request ouzIv io iIojonI l HTTP soivoiu.
}2] Kuyz lou mmo IauIcI iIznal naslavon, huuou so InIoimaco o HTTP ozauavlu a o ouovuI
na nj lIslnoul v ioInom caso. Kuyz sI vyzumo Alom Ioou, jo vIul, zo mouuI urllib.request
osII soivoiu l iulu.
}8] PivnI iuol uvuI ouzIvano HTTP sIovoso (molouu; zuo GET) a coslu lo zuiojI (hoz uvouonI jmona uomony).
}4] Diuly iuol uvuI uomonu, zo lloio hyI ozauavol na Ioou vznoson.
14.4. Co zo lo mmo na uil
307
}] TiolI iuol uvuI lomiImacnI aIgoiIlmy, lloio lIIonl ouoiujo. Jal hyIo uvouono vyso,
urllib.request slanuaiun lomiosI noouoiujo.
}6] Clvily iuol uvuI jmono lnIlovny, jojImz iosliounIclvIm hyI ozauavol vznoson. VyclozI
lounolou jo Python-urllib a cIsIo voizo. Jal urllib.request, lal httplib2 ouoiujI zmnu
IuonlIIIlaco zioslioulovaloIo lIm, zo so uo ozauavlu jounouuso iIu lIavIcla User-Agent,
lloi ioIso vyclozI lounolu.
Tou so ouIvojmo na lo, jalou ouovu osIaI soivoi zl.
# pokraovn pedchozho pkladu
>>> print(response.headers.as_string()) }1]
Date: Sun, 31 May 2009 19:23:06 GMT }2]
Server: Apache
Last-Modified: Sun, 31 May 2009 06:39:55 GMT }8]
ETag: "bfe-93d9c4c0" }4]
Accept-Ranges: bytes
Content-Length: 3070 }]
Cache-Control: max-age=86400 }6]
Expires: Mon, 01 Jun 2009 19:23:06 GMT
Vary: Accept-Encoding
Connection: close
Content-Type: application/xml
>>> data = response.read() }7]
>>> len(data)
3070
}1] Ouovu (iosonso) vicon IunlcI urllib.request.urlopen() ohsalujo vsoclny HTTP lIavIcly,
lloio soivoi osIaI zl. Ohsalujo lalo molouy io slalovnI slulocnycl ual. K lomu so uoslano-
mo za mInullu.
}2] Soivoi iIl, luy ziacovaI ns ozauavol.
}8] Ouovu ohsalujo I lIavIclu Last-Modified.
}4] Ouovu ohsalujo lalo lIavIclu ETag.
}] Dala majI voIIlosl 8u7u hajlu. VsImnlo sI, zo zuo nen lIavIcla Content-encoding. V ozauavlu
jsmo uvouII, zo iIjImmo jon nolomiImovan uala (Accept-encoding: identity), lalzo jsmo
lIm uom uoslaII nolomiImovan uala.
}6] V ouovuI so naclzojI lIavIcly io mozIamlI, lloio iIlajI, zo uhIIlovany ohsal (Ioou) muzo
hyl hin z mozIamlI o uohu 24 louIn (86 4uu solunu).
}7] A nalonoc sllnomo slulocn uala voInIm response.read(). Z vysIoulu Iunlco len() vIuImo,
zo so sllIo vsocl 8u7u hajlu najounou.
14.4. Co zo lo mmo na uil
Stahovali jsme 3070 bajt,
i kdy bychom mohli stahovat
pouhch 941.
308
Jal samI vIuIlo, lonlo lou jo uz lou nooIollIvnI. PozauovaI (a ohuizoI) nolomiImovan uala. IicIl
vIm, zo uvouony soivoi ouoiujo lomiosI gzip, aIo v HTTP so lomioso zaIn na vyzunI. Nooz-
uaII jsmo o nI, lal jsmo jI nouoslaII. To znamon, zo jsmo slalovaII 8u7u hajlu v sIluacI, luy jsmo molII
slaloval oulycl u41. ZIohIvy ojsol, zun susonla.
AIo momonl, zacIn lo hyl josl loisI! Ahyclom vIuII, jal nooIollIvnI lon lou jo, ozumo o slojny
uhIIlovany ohsal (Ioou) ouiulo.
# pokraovn pedchozho pkladu
>>> response2 = urlopen('http://diveintopython3.org/examples/feed.xml')
send: b'GET /examples/feed.xml HTTP/1.1
Host: diveintopython3.org
Accept-Encoding: identity
User-Agent: Python-urllib/3.1'
Connection: close
reply: 'HTTP/1.1 200 OK'
dal ladic informace vyputny
VsImII jslo sI na lom ozauavlu ncolo zvIslnIlo Vuhoc so nozmnII! Jo naioslo slojny jalo lon
iouclozI. Zun znmla ouzIlI lIavIcly If-Modified-Since. Zun znmla ouzIlI lIavIcly
If-None-Match. Zuny iosoll l lIavIclm mozIamlI. Josl oiu zun lomioso.
A co so slano, luyz uuImo slojnou vc uvalil Doslanomo slojnou ouovu. Dvalil.
# pokraovn pedchozho pkladu
>>> print(response2.headers.as_string()) }1]
Date: Mon, 01 Jun 2009 03:58:00 GMT
Server: Apache
Last-Modified: Sun, 31 May 2009 22:51:11 GMT
ETag: "bfe-255ef5c0"
Accept-Ranges: bytes
Content-Length: 3070
Cache-Control: max-age=86400
Expires: Tue, 02 Jun 2009 03:58:00 GMT
Vary: Accept-Encoding
Connection: close
Content-Type: application/xml
>>> data2 = response2.read()
>>> len(data2) }2]
3070
>>> data2 == data }8]
True
14.4. Co zo lo mmo na uil
309
}1] Soivoi oiu osII slojno oIo ,clyliycl lIavIcol: Cache-Control a Expires io mozIaml
(caclo), Last-Modified a ETag io sIouovnI ,nozmnnolo slavu. A uolonco lIavIclu
Vary: Accept-Encoding, lloiou soivoi uv najovo, zo hy molI ouoioval lomiosI, luyhy-
clom sI o nI iolII. AIo my jsmo lo nouuIaII.
}2] A josl jounou, iI zIslvnI ual so sllIo vsocl 8u7u hajlu.
}8] .slojnycl 8u7u hajlu, lloio jsmo sllII uz mInuIo.
PiololoI HTTP jo navizon, ahy iacovaI IosIm zusohom. KnIlovna urllib umI HTTP asI lal, jal j
umIm sanIsly uosl na lo, ahycl so uoslaI z iohIomu, aIo no uosl l vouonI lonvoizaco. A HTTP
so lyl lonvoizaco. Jo cas iojIl lo lnIlovn, lloi iololoIom HTTP mIuvI IynuIo.
14.. Piouslavujomo httplib2
Noz zacnomo lnIlovnu httplib2 ouzIval, musImo jI naInslaIoval. NavslIvlo slinlu code.google.com
/p/httplib2/ a sllnlo osIounI voizI. httplib2 jo l uIsozIcI io Pyllon 2.x a io Pyllon 8.x.
IjIsllo so, zo juo o voizI io Pyllon 8. Jmonujo so ouohn jalo httplib2-python3-0.5.0.zip.
(V uoh iolIauu uz lo hyIo jInal: httplib2-0.6.0.zip; uvnIli jsou oh voizo.)
RozhaIlo aiclIv, oloviolo loimInIovo olno a iojulo uo nov vylvoionolo auiosio httplib2.
Pou WInuovs oloviolo monu Start, vyhoilo Run..., naIslo cmd.exe a slIslnlo ENTER.
c:\Users\pilgrim\Downloads> dir
Volume in drive C has no label.
Volume Serial Number is DED5-B4F8
Directory of c:\Users\pilgrim\Downloads
07/28/2009 12:36 PM <DIR> .
07/28/2009 12:36 PM <DIR> ..
07/28/2009 12:36 PM <DIR> httplib2-python3-0.5.0
07/28/2009 12:33 PM 18,997 httplib2-python3-0.5.0.zip
1 File(s) 18,997 bytes
3 Dir(s) 61,496,684,544 bytes free
c:\Users\pilgrim\Downloads> cd httplib2-python3-0.5.0
c:\Users\pilgrim\Downloads\httplib2-python3-0.5.0> c:\python31\python.exe setup.py install
running install
running build
running build_py
running install_lib
creating c:\python31\Lib\site-packages\httplib2
14.. Piouslavujomo httplib2
310
copying build\lib\httplib2\iri2uri.py -> c:\python31\Lib\site-packages\httplib2
copying build\lib\httplib2\__init__.py -> c:\python31\Lib\site-packages\httplib2
byte-compiling c:\python31\Lib\site-packages\httplib2\iri2uri.py to iri2uri.pyc
byte-compiling c:\python31\Lib\site-packages\httplib2\__init__.py to __init__.pyc
running install_egg_info
Writing c:\python31\Lib\site-packages\httplib2-python3_0.5.0-py3.1.egg-info
V Mac OS X susllo aIIlacI Terminal.app, lloiou najuolo vo sIozco /Applications/Utilities/.
V LInuxususllo aIIlacI Terminal, lloiou ohvylIo najuolo v monu Applications ou Accessories
noho System.
you@localhost:~/Desktop$ unzip httplib2-python3-0.5.0.zip
Archive: httplib2-python3-0.5.0.zip
inflating: httplib2-python3-0.5.0/README
inflating: httplib2-python3-0.5.0/setup.py
inflating: httplib2-python3-0.5.0/PKG-INFO
inflating: httplib2-python3-0.5.0/httplib2/__init__.py
inflating: httplib2-python3-0.5.0/httplib2/iri2uri.py
you@localhost:~/Desktop$ cd httplib2-python3-0.5.0/
you@localhost:~/Desktop/httplib2-python3-0.5.0$ sudo python3 setup.py install
running install
running build
running build_py
creating build
creating build/lib.linux-x86_64-3.1
creating build/lib.linux-x86_64-3.1/httplib2
copying httplib2/iri2uri.py -> build/lib.linux-x86_64-3.1/httplib2
copying httplib2/__init__.py -> build/lib.linux-x86_64-3.1/httplib2
running install_lib
creating /usr/local/lib/python3.1/dist-packages/httplib2
copying build/lib.linux-x86_64-3.1/httplib2/iri2uri.py -> /usr/local/lib/python3.1/dist-packages/httplib2
copying build/lib.linux-x86_64-3.1/httplib2/__init__.py -> /usr/local/lib/python3.1/dist-packages/
httplib2
byte-compiling /usr/local/lib/python3.1/dist-packages/httplib2/iri2uri.py to iri2uri.pyc
byte-compiling /usr/local/lib/python3.1/dist-packages/httplib2/__init__.py to __init__.pyc
running install_egg_info
Writing /usr/local/lib/python3.1/dist-packages/httplib2-python3_0.5.0.egg-info
Ahyclom molII httplib2 ouzIval, vylvoiImo InslancI liIuy httplib2.Http.
14.. Piouslavujomo httplib2
311
>>> import httplib2
>>> h = httplib2.Http('.cache') }1]
>>> response, content = h.request('http://diveintopython3.org/examples/feed.xml') }2]
>>> response.status }8]
200
>>> content[:52] }4]
b"<?xml version='1.0' encoding='utf-8'?>\r\n<feed xmlns="
>>> len(content)
3070
}1] PiIminIm iozlianIm l httplib2 jo ohjoll liIuy Http. Z uuvouu, lloio sI ulzomo v uaIsI ou-
laIloIo, hyclom iI vylvionI ohjollu liIuy Http mII vzuy iouval jmono auiosio. Auiosi
nomusI oxIsloval. V iIau oliohy sI joj httplib2 vylvoiI.
}2] JalmIIo mmo ohjoll liIuy Http l uIsozIcI, muzomo uala zIslal jounouuso lIm, zo zavoImo mo-
louu request() a ioumo jI auiosu ual. Pio uano uiI so lIm vylvoiI ozauavol HTTP GET. (PozujI
v lolo laIloIo sI ulzomo, jal muzomo vylvoiIl jIno HTTP ozauavly, jalo naiIlIau POST.)
}8] Moloua request() viacI uv lounoly. PivnI lounolou jo ohjoll liIuy httplib2.Response, lloiy
ohsalujo vsoclny HTTP lIavIcly vicono soivoiom. NaiIlIau lounola slavovolo louu (status)
200 InuIlujo, zo hyI uolaz iovouon ssn.
}4] Piomnn conlonl ohsalujo uala, lloi HTTP soivoi vilII. Dala so viacojI jalo ohjoll lyu bytes,
nIloIIv jalo iolzoc. Poluu z lolo clcomo uuIal iolzoc, musImo zjIslIl znalovo louovnI
a iovosl sI jo samI.
> Piavuouohn huuolo oliohoval jon jouon ohjoll liIuy httplib2.Http. LxIslujI iozumno
uuvouy io vylvionI vIco noz jounolo ohjollu, aIo mII hyslo lo uIal jon v iIau, luy vIlo,
ioc jo oliohujolo. ,PoliohujI zIslval uala zo uvou iuznycl URL lalovym uuvouom nonI.
PouzIjlo ohjoll liIuy Http znovu iosl zavoIojlo molouu request() uvalil.
14..1. Kill ouhocla vysvlIujIcI, ioc httplib2
viacI hajly mIslo iolzcu
Bajly. Rolzco. To jo hoIosl. Pioc httplib2 nomuzo ,jounouuso iovosl lonvoizI za ns No, ono jo lo
lomIIlovano, iolozo iavIuIa io zjIslnI znalovolo louovnI jsou socIIIcl v zvIsIoslI na lom,
jaly zuioj (iosouico) ozauujomo. Jal hy molIa httplib2 vul, jaly uiul zuiojo ozauujomo Ohvyl-
Io hyv uvouon v HTTP lIavIcco Content-Type, aIo lalo lIavIcla jo v HTTP noovInn a no vsoclny HTTP
soivoiy jI vlIuajI. Poluu lalo lIavIcla nonI soucslI HTTP ouovuI, onoclv so oulau na lIIonlovI.
(RIl so lomu angIIcly ,conlonl snIIIIng cIII ,cmuclnI v ohsalu. VysIouol nonI nIluy oiIollnI.)
Poluu vImo, jaly uiul ual ocolvmo (v nasom iIau XML uolumonl), molII hyclom ,jounouuso
ioual ohjoll lyu bytes IunlcI xml.etree.ElementTree.parse(). To hy IungovaIo, luyhy XML uolu-
monl ohsalovaI InIoimacI o svom vIaslnIm louovnI znalu (jalo jo lomu v lomlo iIau). AIo juo
o noovInny uaj a no vsoclny XML uolumonly lo ouzIvajI. Poluu XML uolumonl InIoimacI o louo-
14.. Piouslavujomo httplib2
312
vnI noohsalujo, mI hy so lIIonl ouIval na liansoilnI ohIlu lj. na HTTP lIavIclu Content-Type,
lloi hy molIa aiamoli charset ohsaloval.
AIo ono jo lo josl loisI. Tou uz muzo hyl InIoimaco o louovnI uvouona na uvou mIslocl: uvnIli
samolnolo XML uolumonlu a uvnIli HTTP lIavIcly Content-Type. Jonzo luyz jo lalo InIoimaco uvouo-
na na ohou mIslocl, lloio z nIcl vyliajo PouIo RIC 8u28 IalI (a iIsalm, lo jsom sI novymysIoI):
oluu jo v HTTP lIavIcco Content-Type uvouon ly mouIa application/xml, application/xml-dtd,
application/xml-external-parsed-entity noho IIhovoIny z oulyu application/xml, jalo
jo application/atom+xml noho application/rss+xml noho uolonco application/rdf+xml, al
jo louovnI iovno
1. louovnI zauanomu aiamoliom charset v HTTP lIavIcco Content-Type noho
2. louovnI zauanomu aliIhulom encoding v XML uolIaiacI uvnIli uolumonlu noho
8. UTF-8
Na uiulou slianu, oluu jo v HTTP lIavIcco Content-Type uvouon ly mouIa
text/xml, text/xml-external-parsed-entity noho ouly jalo text/AnythingAtAll+xml, al
so aliIhul uvujIcI louovnI v XML uolIaiacI uvnIli uolumonlu zcoIa Ignoiujo a louovnI jo iovno
1. louovnI zauanomu aiamoliom charset v HTTP lIavIcco Content-Type noho
2. us-ASCII
A lo so havImo jon o XML uolumonlocl. Pio HTML uolumonly vylvoiIIy vohovo iolIIzoco lalov hy-
zanlsl iavIuIa io zjIslovnI ohsalu (conlonl-snIIIIng) }PDF], zo so slIo josl snazImo vsoclna zjIslIl.
,Oiavy jsou vIlny.
14..2. Jal lllIIh2 zaclzI s mozIamlI
VzomInlo sI, zo jsom vs v iouclozI oulaIloIo nahuaI, ahyslo vzuy vylvioII ohjoll liIuy
httplib2.Http so zauanym jmonom auiosio Duvou so jmonujo mozIaml (caclo).
# pokraovn z pedchozho pkladu
>>> response2, content2 = h.request('http://diveintopython3.org/examples/feed.xml') }1]
>>> response2.status }2]
200
>>> content2[:52] }8]
b"<?xml version='1.0' encoding='utf-8'?>\r\n<feed xmlns="
>>> len(content2)
3070
14.. Piouslavujomo httplib2
313
}1] TolIo hy vs nomIo moc iolvaIl. Slojnou vc uz jsmo uIaII naosIouy s lou vyjImlou, zo
vysIouol ulIumo uo uvou novycl iomnnycl.
}2] HTTP ol viacI slavovy lou (status) 200, jalo mInuIo.
}8] Slazony ohsal jo lalo slojny jalo mInuIo.
Talzo... lolo lo zajIm Iloncolo yllonovsly InloiallIvnI sloII a susllo novo sozonI. Hnou vm lo ulzu.
# toto NEN pokraovn z pedchozho pkladu!
# Ukonete, prosm, interaktivn shell
# a spuste nov.
>>> import httplib2
>>> httplib2.debuglevel = 1 }1]
>>> h = httplib2.Http('.cache') }2]
>>> response, content = h.request('http://diveintopython3.org/examples/feed.xml') }8]
>>> len(content) }4]
3070
>>> response.status }]
200
>>> response.fromcache }6]
True
}1] Zanmo IaunI a ouIvojmo so, co nm IIl o uilocl. Tallo so v httplib2 zaIn IauIcI iozIm
(siovnojlo so zaInnIm v http.client). httplib2 vylIslno vsoclna uala, lloi so osIIajI
na soivoi, a nlloio lIIcovo InIoimaco, lloio so osIIajI zl.
}2] VylvoiImo ohjoll liIuy httplib2.Http so slojnym jmonom auiosio jalo mInuIo.
}8] Vyzumo sI slojno URL jalo mInuIo. Zd0 :e, 2e :e nt ne:|uo. PiosnjI iocono, nIc so noosII
na soivoi a zo soivoiu so nIc noviacI. Na sIlI noozoiujomo vuhoc zunou allIvIlu.
}4] Pioslo jsmo njal uala ,iIjaII vo slulocnoslI jsmo uoslaII vsoclno.
}] A ,iIjaII jsmo lalo slavovy lou iololoIu HTTP, lloiy iIl, zo ,ozauavol hyI ssny.
}6] Tauy jo uuvou: ,ouovu hyIa vygonoiovna z IolInI mozIamlI httplib2. Auiosi, joloz
jmono jsmo zauvaII iI vylvionI ohjollu liIuy httplib2.Http, sIouzI lnIlovn httplib2 jalo
mozIaml (caclo) io vsoclny ooiaco, lloio so luy iovouIy.
> Poluu clcolo v httplib2 zanoul IauIcI iozIm, musIlo naslavIl lonslanlu na iovnI mouuIu
(httplib2.debuglevel) a olom vylvoiIl novy ohjoll liIuy httplib2.Http. Poluu clcolo IauIcI
iozIm vynoul, musIlo zmnIl luloz lonslanlu na iovnI mouuIu a olom vylvoiIl novy ohjoll
liIuy httplib2.Http.
MInuIo jsmo ozauovaII uala z lonliolnIlo URL. Pozauavol hyI ssny (status: 200). Ouovu zalino-
vaIa nojon uala uhIIlovanolo ohsalu, aIo lalo mnozInu lIavIcol io mozIaml (caclIng loauois).
Ty lazuomu iIjomcI iIlajI, zo sI lonlo zuioj muzo amaloval o uohu az 24 louIn (Cache-Control:
max-age=86400, coz jo 24 louIn v solunucl). httplib2 lIavIclm io mozIaml iozumI a iosollujo jo.
14.. Piouslavujomo httplib2
314
PiouclozI ouovu hyIa uIozona uo auiosio .cache
(joloz jmono jsmo zauaII iI vylvionI ohjollu liIuy Http).
PIalnosl ohsalu mozIamlI zalIm novyisoIa, lalzo luyz
uala zo slojnolo URL ozauujomo ouiulo, httplib2
jounouuso vilI zaamalovany vysIouol, anIz hy uosIo
lo lomunIlacI o sIlI.
RIlm ,jounouuso, aIo za loulo jounouucloslI jo ovIuonln sliylo loun sIozIloslI. KnIlovna httplib2
zvIu ouzIvnI mozIamlI v HTTP uu|omu|tLy u un2 :e o |o mu:me :|uru|. Poluu z njalolo uuvouu
oliohujomo vul, zua ouovu iIclzI z mozIamlI, muzomo zlonlioIoval response.fromcache.
Z jInolo olIouu... iosl lo Iungujo.
Dojmo lomu, zo lou mmo uala v mozIamlI, aIo clcomo jI ohojIl a znovu sI jo vyzual ou vzuIono-
lo soivoiu. PiolIIzoco lo nluy uIajI, luyz sI lo uzIvaloI vyzu. NaiIlIau slIsl F5 ohnovI alluInI
slinlu, aIo slIslom Ctrl+F5 so ohojuo mozIaml a alluInI slinla so znovu vyzu zo vzuIonolo
soivoiu. Mozn sI mysIIlo ,ala, iosl smazu uala zo svo IolInI mozIamlI a iovouu ozauavol
znovu. TolIo hyslo uuIal molII. AIo vzomolo sI, zo so lo muzo lylal vIco slian noz jon vs a vzu-
Ionolo soivoiu. Coz lallIo mozIIolIo ioxy-soivoiy Ty jsou zcoIa mImo vasI lonlioIu a oiu molou
uclovval ona uala vo svo mozIamlI. A s iauoslI vm jo vilI, iolozo ohsal jojIcl mozIamlI jo
(z jojIcl olIouu) slIo Ialny.
Talzo mIslo lolo, ahyslo manIuIovaII s IolInI mozIamlI a uouIaII v nojIosI, mII hyslo vyuzIl
vIaslnoslI HTTP l zajIslnI lolo, zo so vs ozauavol slulocn uoslaI az lo vzuIonomu soivoiu.
# pokraovn pedchozho pkladu
>>> response2, content2 = h.request('http://diveintopython3.org/examples/feed.xml',
... headers={'cache-control':'no-cache'}) }1]
connect: (diveintopython3.org, 80) }2]
send: b'GET /examples/feed.xml HTTP/1.1
Host: diveintopython3.org
user-agent: Python-httplib2/$Rev: 259 $
accept-encoding: deflate, gzip
cache-control: no-cache'
reply: 'HTTP/1.1 200 OK'
dal ladic informace vyputny
>>> response2.status
200
>>> response2.fromcache }8]
False
>>> print(dict(response2.items())) }4]
{'status': '200',
'content-length': '3070',
14.. Piouslavujomo httplib2
Co se dje na drt?
Vbec nic.
315
'content-location': 'http://diveintopython3.org/examples/feed.xml',
'accept-ranges': 'bytes',
'expires': 'Wed, 03 Jun 2009 00:40:26 GMT',
'vary': 'Accept-Encoding',
'server': 'Apache',
'last-modified': 'Sun, 31 May 2009 22:51:11 GMT',
'connection': 'close',
'-content-encoding': 'gzip',
'etag': '"bfe-255ef5c0"',
'cache-control': 'max-age=86400',
'date': 'Tue, 02 Jun 2009 00:40:26 GMT',
'content-type': 'application/xml'}
}1] httplib2 vm umoznI iIual l jalomuloIIv ouclzojIcImu ozauavlu IIhovoIno HTTP lIavIcly.
Ahyclom ohosII v:ethny mozIamlI (nojon IolInI uIslovou, aIo lalo mozIamlovo ioxy-soi-
voiy mozI nmI a vzuIonym soivoiom), iIumo uo sIovnIlu loauois lIavIclu no-cache.
}2] Tou vIuImo, zo httplib2 zalajujo sIlovy ozauavol. httplib2 iozumI lIavIclm io mozIa-
ml a iosollujo jo v oIou :m6reth jalo soucsl iIclzojIcI ouovuI juLo :out0:| odth0ze-
jtho o2uduvLu. KnIlovna sI vsImIa, zo jsmo iIuaII lIavIclu no-cache, lalzo In ohosIa svo
IolInI mozIamlI. Polom aIo nom na vyhi a musI ouosIal ozauavol na uala uo sIl.
}8] Talo ouovu neIyu gonoiovan z nasI IolInI mozIamlI. To samoziojm vImo, iolozo jsmo
vIuII IauIcI InIoimacI lylajIcI so ouclzojIcIlo ozauavlu. AIo jo uohio, zo sI lo muzomo ov-
iIl v iogiamu.
}4] Pozauavol hyI ssny. Ol jsmo zo vzuIonolo soivoiu sllII coIy uhIIlovany ohsal (Ioou).
Soivoi samoziojm osIaI zl s ozauovanymI ualy (Ioou) I coIou sauu HTTP lIavIcol. Jsou mozI
nImI I lIavIcly io mozIaml, lloio httplib2 ouzIjo io alluaIIzacI svo IolInI mozIamlI
v naujI, zo so iI I:|m ozauavlu na slojn uala huuo mocI vylnoul iIsluu na sIl. Nvil
ouzIvnI mozIamlI v HTTP jo zcoIa ouiIzon maxImaIIzacI ssnoslI mozIamlI (caclo lIl)
a mInImaIIzacI iIsluu l sIlI. I luyz jsmo lonlolil mozIamlI ohosII, vzuIony soivoi hy oiav-
uu oconII, luyhyclom sI vysIouol uo mozIamlI uIozIII s olIouom na iIslI mozny uolaz.
14..8. Jal httplib2 zaclzI s lIavIclamI
Last-Modified a ETag
HIavIcly mozIamlI Cache-Control a Expires so nazyvajI ndL0|ory ter:|vo:| (Iioslnoss InuIcalois).
RIlajI mozIamlom jasnym zusohom, zo so uo vyisonI IalnoslI ohsalu mozIamlI muzomo zcoIa
vylnoul iIsluu l sIlI. Piosn lalovo clovnI jsmo vIuII v iouclozI oulaIloIo: oluu jo InuIlo-
vna coislvosl, httplib2 iI viconI ual z mozIamlI negeneruje un Iuj| :|ov6 uL|v|y (oluu ovsom
oxIIcIln noiouoIsomo ohojIlI mozIamlI).
14.. Piouslavujomo httplib2
316
AIo jal lo huuo vyaual v iIau, luy so uala mohu zmnIl, aIo iIlom so nozmnIIa Pio lonlo coI
HTTP uoIInujo lIavIcly Last-Modified a Etag. Tmlo lIavIclm so iIl vud0|ory. Poluu uz IolInI
mozIaml nonI coislv, muzo lIIonl s uaIsIm uolazom zasIal vaIIuloiy, ahy sI oviII, zua so uala slu-
locn zmnIIa. Poluu so uala nozmnIIa, soivoi osIo zl slavovy lou 304 a 20dn0 du|u. Talzo lu sIco
slIo uoclzI lo vzjomno lomunIlacI o sIlI, aIo vysIoulom jo slalovnI monsIlo mnozslvI hajlu.
>>> import httplib2
>>> httplib2.debuglevel = 1
>>> h = httplib2.Http('.cache')
>>> response, content = h.request('http://diveintopython3.org/') }1]
connect: (diveintopython3.org, 80)
send: b'GET / HTTP/1.1
Host: diveintopython3.org
accept-encoding: deflate, gzip
user-agent: Python-httplib2/$Rev: 259 $'
reply: 'HTTP/1.1 200 OK'
>>> print(dict(response.items())) }2]
{'-content-encoding': 'gzip',
'accept-ranges': 'bytes',
'connection': 'close',
'content-length': '6657',
'content-location': 'http://diveintopython3.org/',
'content-type': 'text/html',
'date': 'Tue, 02 Jun 2009 03:26:54 GMT',
'etag': '"7f806d-1a01-9fb97900"',
'last-modified': 'Tue, 02 Jun 2009 02:51:48 GMT',
'server': 'Apache',
'status': '200',
'vary': 'Accept-Encoding,User-Agent'}
>>> len(content) }8]
6657
}1] MIslo uhIIlovanolo ohsalu (Ioou) huuomo lonlolil slaloval uomcI slinlu vohovolo mIsla
(lomo ago), lloi jo v HTML. Piolozo lulo slinlu ozauujomo In oivo, nomuzo httplib2
s ozauavlom nIc moc uuIal a ouosIo s nIm mInImum lIavIcol.
}2] Ouovu ohsalujo voIlo mnozslvI HTTP lIavIcol. aIo zuno InIoimaco io mozIaml.
AIo ohsalujo jal lIavIclu ETag, lal lIavIclu Last-Modified.
}8] V uoh vylvionI iIlIauu mIa slinla 667 hajlu. Ou lo uohy uz so iavuouohn zmnIIa,
aIo lIm so nohuuomo zalzoval.
14.. Piouslavujomo httplib2
317
# pokraovn z pedchozho pkladu
>>> response, content = h.request('http://diveintopython3.org/') }1]
connect: (diveintopython3.org, 80)
send: b'GET / HTTP/1.1
Host: diveintopython3.org
if-none-match: "7f806d-1a01-9fb97900" }2]
if-modified-since: Tue, 02 Jun 2009 02:51:48 GMT }8]
accept-encoding: deflate, gzip
user-agent: Python-httplib2/$Rev: 259 $'
reply: 'HTTP/1.1 304 Not Modified' }4]
>>> response.fromcache }]
True
>>> response.status }6]
200
>>> response.dict['status'] }7]
'304'
>>> len(content) }8]
6657
}1] O slojnou slinlu jsmo ozuaII znovu, iosliounIclvIm slojnolo ohjollu liIuy Http
(a so slojnou IolInI mozIamlI).
}2] httplib2 osIo soivoiu zl vaIIuloi ETag jalo ohsal lIavIcly If-None-Match.
}8] httplib2 osIo zl soivoiu lalo vaIIuloi Last-Modified jalo lounolu lIavIcly If-Modified-Since.
}4] Soivoi so ouIv na zasIano vaIIuloiy, ouIv so na ozauovanou slinlu a zjIslI, zo so slinla
ou osIounIlo ozauavlu nozmnIIa. Piolo osIo zl slavovy lou 304 a 20dn0 du|u.
}4] A zl lo lIIonlovI. httplib2 ohuizI slavovy lou 304 a naclo ohsal slinly zo svo mozIamlI.
}] TolIo muzo hyl lioslu maloucI. Vo slulocnoslI lu mmo uva slavovo louy 304 (lloiy vilII
soivoi lou a lloiy zusohII, zo httplib2 ouzIjo svou mozIaml) a 200 (lloiy vilII soivoi mI-
nuIo a lloiy jo soIu s ualy uIozon v mozIamlI io httplib2). response.status viacI slavovy
lou ouovuI z mozIamlI.
}6] Poluu clcomo zjIslIl suiovy slavovy lou vicony soivoiom, muzomo joj zjIslIl nalIounulIm
uo response.dict, coz jo sIovnIl alluInIcl lIavIcol viconycl soivoiom.
}7] Al jo lo jalloIIv, uala ol zIsllo v iomnno content. Ohocn vzalo, nooliohujomo vul,
ioc hyI ozauavol ohsIouzon z mozIamlI. (Dolonco ns nomusI vuhoc zajImal, zo hyI
ohsIouzon z mozIamlI. To jo v oiulu. KnIlovna httplib2 jo uosl clyli na lo, ahyclom sI
molII lil na lIuly.) V lomlo olamzIlu uz moloua request() vilIIa iIzonI voIajIcImu louu.
httplib2 uz alluaIIzovaIa svou mozIaml a vilIIa nm uala.
14.. Piouslavujomo httplib2
318
14..4. Jal http2lib iacujo s lomiosI
HTTP ouoiujo nloIIl lyu lomioso. Dva nojouzIva-
njsI lyy jsou gzip a deflate. httplib2 ouoiujo oha.
>>> response, content = h.request('http://diveintopython3.org/')
connect: (diveintopython3.org, 80)
send: b'GET / HTTP/1.1
Host: diveintopython3.org
accept-encoding: deflate, gzip }1]
user-agent: Python-httplib2/$Rev: 259 $'
reply: 'HTTP/1.1 200 OK'
>>> print(dict(response.items()))
{'-content-encoding': 'gzip', }2]
'accept-ranges': 'bytes',
'connection': 'close',
'content-length': '6657',
'content-location': 'http://diveintopython3.org/',
'content-type': 'text/html',
'date': 'Tue, 02 Jun 2009 03:26:54 GMT',
'etag': '"7f806d-1a01-9fb97900"',
'last-modified': 'Tue, 02 Jun 2009 02:51:48 GMT',
'server': 'Apache',
'status': '304',
'vary': 'Accept-Encoding,User-Agent'}
}1] Polazuo luyz httplib2 ouosIo ozauavol, vIozI uo nj lIavIclu Accept-Encoding, lloiou
soivoiu oznmI, zo zvIu jal lomiosI uoIIalo, lal gzip.
}2] V lomlo iIau soivoi ouovuI ualy lomiImovanymI aIgoiIlmom gzip. V lomlo olamzIlu
moloua request() viacI iIzonI, httplib2 uolomiImovaIa (iozhaIIIa) lIo ouovuI a umIslI-
Ia jo uo iomnno content. Poluu jslo zvuavI, joslII ouovu iIsIa lomiImovan, muzolo
zlonlioIoval response['-content-encoding']. AIo jInal sI s lIm nomusIlo uIal slaioslI.
14... Jal httplib2 iosI iosmiovnI
HTTP uoIInujo uva uiuly iosmiovnI: uocasno a livaIo. I uocasnycl iosmiovnI so nouI nIc
zvIslnIlo az na lo, zo so majI nsIouoval (IoIIov), coz httplib2 iovouo aulomalIcly.
14.. Piouslavujomo httplib2
We have both kinds of music,
country AND western.
(Mme oba druhy hudby,
country i western.)
319
>>> import httplib2
>>> httplib2.debuglevel = 1
>>> h = httplib2.Http('.cache')
>>> response, content = h.request('http://diveintopython3.org/examples/feed-302.xml') }1]
connect: (diveintopython3.org, 80)
send: b'GET /examples/feed-302.xml HTTP/1.1 }2]
Host: diveintopython3.org
accept-encoding: deflate, gzip
user-agent: Python-httplib2/$Rev: 259 $'
reply: 'HTTP/1.1 302 Found' }8]
send: b'GET /examples/feed.xml HTTP/1.1 }4]
Host: diveintopython3.org
accept-encoding: deflate, gzip
user-agent: Python-httplib2/$Rev: 259 $'
reply: 'HTTP/1.1 200 OK'
}1] Na lomlo URL nonI zuny uhIIlovany ohsal. NaslavII jsom svuj soivoi, ahy sIgnaIIzovaI uocas-
no iosmiovnI na sivnou auiosu.
}2] Tauy jo ns ozauavol.
}8] A lauy jo ouovu: 302 Found. I luyz so lo zuo nozohiazujo, ouovu ohsalujo lalo lIavIclu
Location, lloi ulazujo na slulocno URL.
}4] httplib2 so Ilnou olocI a ,nsIouujo iosmiovnI vyunIm uaIsIlo ozauavlu na URL, lloio
jo uvouono v lIavIcco Location: http://diveintopython3.org/examples/feed.xml
,NsIouovnI iosmiovnI nonI nIc jInolo, noz co ulazujo lonlo iIlIau. httplib2 osIo ozauavol
io URL, lloio jsmo ozauovaII. Soivoi ouvlI ouovuI, lloi iIl: ,No no. MIslo lolo so ouIvojlo
lmlIo. httplib2 ouosIo uaIsI ozauavol io novo URL.
# pokraovn z pedchozho pkladu
>>> response }1]
{'status': '200',
'content-length': '3070',
'content-location': 'http://diveintopython3.org/examples/feed.xml', }2]
'accept-ranges': 'bytes',
'expires': 'Thu, 04 Jun 2009 02:21:41 GMT',
'vary': 'Accept-Encoding',
'server': 'Apache',
'last-modified': 'Wed, 03 Jun 2009 02:20:15 GMT',
'connection': 'close',
'-content-encoding': 'gzip', }8]
'etag': '"bfe-4cbbf5c0"',
'cache-control': 'max-age=86400', }4]
'date': 'Wed, 03 Jun 2009 02:21:41 GMT',
'content-type': 'application/xml'}
14.. Piouslavujomo httplib2
320
}1] Ouovu (iosonso), lloiou jslo ohuizoII z jouInolo voInI molouy request(), jo ouovuI
z lonocnolo URL.
}2] httplib2 iIu lonocno URL uo sIovnIlu response jalo content-location. Nojuo o lIavIclu,
lloi hy iIsIa zo soivoiu. Jo lo zIozIlosl socIIIcl io httplib2.
}8] Jon ahycl nozaomnI, lonlo Ioou jo lomiImovany.
}4] A uclovaloIny v mozIamlI (cacloahIo). (To jo uuIozIlo jal uvIuImo za mInullu.)
SIovnIl response, lloiy so nm vilI, oslylujo InIoimaco o Lonetn6m URL. A co luyz clcomo InIoimaco
o ioclounycl URL, louy o lcl, lloi hyIa iosmiovna na lonocno URL httplib2 nm umoznI I lo.
# pokraovn z pedchozho pkladu
>>> response.previous }1]
{'status': '302',
'content-length': '228',
'content-location': 'http://diveintopython3.org/examples/feed-302.xml',
'expires': 'Thu, 04 Jun 2009 02:21:41 GMT',
'server': 'Apache',
'connection': 'close',
'location': 'http://diveintopython3.org/examples/feed.xml',
'cache-control': 'max-age=86400',
'date': 'Wed, 03 Jun 2009 02:21:41 GMT',
'content-type': 'text/html; charset=iso-8859-1'}
>>> type(response) }2]
<class 'httplib2.Response'>
>>> type(response.previous)
<class 'httplib2.Response'>
>>> response.previous.previous }8]
>>>
}1] AliIhul response.previous uclovv ioIoioncI na iouclozI ohjoll ouovuI, lloiy httplib2
nsIouovaIa, ahy zIslaIa soucasny ohjoll ouovuI.
}2] Jal iosonso, lal response.previous jsou ohjolly liIuy httplib2.Response.
}8] To znamon, zo muzomo iolzoc iosmiovnI sIouoval zln josl uI lonlioIou
response.previous.previous. (Sconi: jouno URL jo iosmiovno na uiulo URL, lloio
jo iosmiovno na liolI URL. To so oiavuu muzo sll!) V lomlo iIau uz jsmo
uoslII zacllu iolzco iosmiovnI, lalzo aliIhul m lounolu None.
Co so slano, luyz sI vyzumo slojno URL znovu
14.. Piouslavujomo httplib2
321
# pokraovn z pedchozho pkladu
>>> response2, content2 = h.request('http://diveintopython3.org/examples/feed-302.xml') }1]
connect: (diveintopython3.org, 80)
send: b'GET /examples/feed-302.xml HTTP/1.1 }2]
Host: diveintopython3.org
accept-encoding: deflate, gzip
user-agent: Python-httplib2/$Rev: 259 $'
reply: 'HTTP/1.1 302 Found' }8]
>>> content2 == content }4]
True
}1] Slojno URL, slojny ohjoll liIuy httplib2.Http (a lIm uom slojn mozIaml).
}2] Ouovu 302 nohyIa v mozIamlI, lalzo httplib2 osIo io slojno URL uaIsI ozauavol.
}8] A josl jounou, soivoi ouovIu louom 302. AIo vsImnlo sI, co so noslaIo: clyhI uiuly
uolaz na lonocno URL, http://diveintopython3.org/examples/feed.xml. Talo ouovu
hyIa v mozIamlI (vzomolo sI na lIavIclu Cache-Control, lloiou jsmo vIuII
v iouclozIm iIlIauu). JalmIIo httplib2 ohuizoIa lou 302 Found, zLon|roovuu :
Ied vyd0nm du:ho o2uduvLu oI:uh mezum6|. MozIaml ohsalovaIa coislvou loII
http://diveintopython3.org/examples/feed.xml, lalzo nohyIo nulno zual o uala znovu.
}4] V lomlo olamzIlu uoclzI l nvialu z molouy request(). PiocolIa uala uhIIlovanolo ohsalu
(Ioou) z mozIamlI a vilIIa jo. Juo samoziojm o slojn uala, lloi jsmo ohuizoII mInuIo.
JInymI sIovy, iI uocasnom iosmiovnI nomusImo uIal nIc zvIslnIlo. httplib2 jo huuo nsIouoval
aulomalIcly. Slulocnosl, zo jo jouno URL iosmiovno na jIno, nom na httplib2 zuno uoauy
z lIouIsla ouoiy lomioso, ouzIlI mozIamlI, ETag noho jalyclloIIv jInycl iysu HTTP.
TivaI iosmiovnI jsou vo svo jounouucloslI ouohn.
# pokraovn z pedchozho pkladu
>>> response, content = h.request('http://diveintopython3.org/examples/feed-301.xml') }1]
connect: (diveintopython3.org, 80)
send: b'GET /examples/feed-301.xml HTTP/1.1
Host: diveintopython3.org
accept-encoding: deflate, gzip
user-agent: Python-httplib2/$Rev: 259 $'
reply: 'HTTP/1.1 301 Moved Permanently' }2]
>>> response.fromcache }8]
True
}1] Josl jounou. Tolo URL vo slulocnoslI nooxIslujo. NaslavII jsom svuj soivoi, ahy iouulovaI
livaIo iosmiovnI na http://diveintopython3.org/examples/feed.xml.
14.. Piouslavujomo httplib2
322
}2] A lauy lo mmo: slavovy lou 301. AIo znovu sI vsImnlo, co so ne:|uo: noohjovII so zuny
ozauavol na iosmiovano URL. Pioc no Piolozo uz so naclzI v IolInI mozIamlI.
}8] httplib2 ,nsIouovaIa iosmiovnI iImo uo svo mozIamlI.
AIo oclojlo! Ono jo lolo josl vIc!
# pokraovn z pedchozho pkladu
>>> response2, content2 = h.request('http://diveintopython3.org/examples/feed-301.xml') }1]
>>> response2.fromcache }2]
True
>>> content2 == content }8]
True
}1] Tauy jo lon iozuII mozI uocasnym a livaIym iosmiovnIm: jalmIIo jounou httplib2 nsIouu-
jo livaIo iosmiovnI, vsoclny uaIsI ozauavly so slojnym URL huuou liansaionln iosny
na cIIovo URL un2 :e Lv orgn0nmu URL LomunLuje o :|. PiIomomo sI, zo IauIcI iozIm
jo oiu zanuly. Pioslo novIuImo vuhoc zuny vyslu sIlovo allIvIly.
}2] Ano, lalo ouovu hyIa vylazona z IolInI mozIamlI.
}8] Ano, uoslaII jsmo coIy uhIIlovany ohsal (z mozIamlI).
HTTP. Iungujo.
14.6. Za lianIcomI HTTP GLT
Wohovo sIuzhy nau HTTP so noomozujI jon na ozauavly lyu GET. Co luyhyclom cllII vylvoiIl nco
novolo KuyloIIv iIulo lomonli uo uIslusnIlo Ioia, alluaIIzujolo vohIog, uiavujolo svuj slav
na mIliohIogovo sIuzh, jalou jo Twittor noho Idonti.cu, ouzIvlo iavuouohn HTTP POST.
Jal TvIlloi, lal IuonlI.ca nahIzojI io zvoiojovnI a alluaIIzacI vasolo slavu, osanolo 14u noho
mon znaly, jounouuclo iozlianI zaIozono na HTTP. PouIvojmo so na uolumonlacI aIIlacnIlo iozlia-
nI io alluaIIzacI vasolo slavu v syslomu IuonlI.ca.
Jal lo Iungujo Kuyz clcomo na IuonlI.ca zvoiojnIl novou zivu, musImo zasIal ozauavol lyu
HTTP POST na http://identi.ca/api/statuses/update.format. (Csl Ioimal noaliI l URL. Naliazujo
so ualovym Ioimlom, v jalom nm m soivoi vilIl ouovu na ns ozauavol. Talzo oluu ozauu-
jomo ouovu v XML, musImo zasIal ozauavol na https://identi.ca/api/statuses/update.xml.)
Pozauavol musI ohsaloval aiamoli nazvany status, lloiy ohsalujo loxl io alluaIIzacI nasolo slavu.
A ozauavol musI hyl aulonlIzovn.
14.6. Za lianIcomI HTTP GLT
323
Identi.ca REST API Metoda: statuses/update
AlluaIIzujo slav aulonlIzovanolo uzIvaloIo. Vyzauujo aiamoli slalus, osany nIzo.
Pozauavol musI hyl lyu POST.
URL
https://identi.ca/api/statuses/update.format
Ioimly
xml, json, rss, atom
HTTP molou(y)
POST
Vyzauujo aulonlIzacI
ano
Paiamoliy
status. PovInny. Toxl alluaIIzaco vasolo slavu. Kouovano URL ouIo oliohy.
AulonlIzovn JIsl. Kuyz clcomo na IuonlI.ca alluaIIzoval svuj slav, musImo iolzal svou loloznosl.
IuonlI.ca nonI jalo vIlI. Svuj vIaslnI slav muzomo alluaIIzoval jon my. Pio coI hozocno a snauno
ouzIloIno aulonlIzaco ouzIv IuonlI.ca HTTP Busic Authonticutinn (zlIaunI aulonlIzacI; znmou lalo
jalo RFC Z17) ios SSL. httplib2 ouoiujo jal SSL, lal HTTP BasIc AullonlIcalIon, lalzo lalIo csl
huuo snaun.
Pozauavol POST so ou ozauavlu GET IIsI, iolozo noso n0Lud. NlIauom jsou uala, lloi clcomo
osIal na soivoi. CslI ual, lloiou lolo aIIlacnI iozlianI molouy vy2uduje, jo status (slav) a mI
hy mIl ouohu Lodovun6ho URL. Jo lo voImI jounouucly soiIaIIzacnI Ioiml. Vsluom jo mnozIna
uvojIc lIIc-lounola (lj. sIovnIl) a vysIoulom jo iolzoc.
>>> from urllib.parse import urlencode }1]
>>> data = {'status': 'Test update from Python 3'} }2]
>>> urlencode(data) }8]
'status=Test+update+from+Python+3'
}1] V Pyllonu io zalouovnI sIovnIlu uo ouohy URL najuomo omocnou IunlcI:
urllib.parse.urlencode().
}2] AIIlacnI iozlianI syslomu IuonlI.ca ocolv zliuha lalovylo sIovnIl. Ohsalujo jouon lIIc,
status, joloz lounolou jo loxl jouno alluaIIzaco slavu.
}8] A lallo vyau iolzoc louovanolo URL. To jo n0Lud, lloiy huuo ozauavlom HTTP POST
ouosIn ,o uil na soivoi s aIIlacnIm iozlianIm IuonlI.ca.
14.6. Za lianIcomI HTTP GLT
324
>>> from urllib.parse import urlencode
>>> import httplib2
>>> httplib2.debuglevel = 1
>>> h = httplib2.Http('.cache')
>>> data = {'status': 'Test update from Python 3'}
>>> h.add_credentials('diveintomark', 'MY_SECRET_PASSWORD', 'identi.ca') }1]
>>> resp, content = h.request('https://identi.ca/api/statuses/update.xml',
... 'POST', }2]
... urlencode(data), }8]
... headers={'Content-Type': 'application/x-www-form-urlencoded'}) }4]
}1] TImlo zusohom httplib2 iacujo s aulonlIzacI. Jmono a losIo uIozImo metodou add_credentials().
Kuyz so httplib2 olusI o vyunI ozauavlu, soivoi ouovI slavovym louom 401 Unauthorized (no-
auloiIzovno) a iIojI soznam aulonlIzacnIcl molou, lloio ouoiujo (v lIavIcco WWW-Authenticate).
httplib2 aulomalIcly vylvoiI lIavIclu Authorization a osIo ozauavol s URL znovu.
}2] Diuly aiamoli uvuI ly HTTP ozauavlu. V lomlo iIau jo lo POST.
}8] TiolIm aiamoliom jo n0Lud, lloiy so soivoiu osII. PosIImo sIovnIl so slavovou zivou
zalouovany uo ouohy URL.
}4] Nalonoc musImo soivoiu iIcl, zo nlIau m ouohu ual zalouovanycl uo ouohy URL.
> TiolIm aiamoliom molouy add_credentials() jo uomona, vo lloio osohnI uajo IalI. MII hyslo
jI vzuy uvul! Poluu uomonu vynocllo a ozujI znovu ouzIjolo ohjoll liIuy httplib2.Http
io jIno aulonlIzovano mIslo, molIa hy httplib2 zusohIl nIl jmona a losIa z jounolo mIsla
na uiulo mIslo (sIlo).
A o com zIvajI uily:
# pokraovn z pedchozho pkladu
send: b'POST /api/statuses/update.xml HTTP/1.1
Host: identi.ca
Accept-Encoding: identity
Content-Length: 32
content-type: application/x-www-form-urlencoded
user-agent: Python-httplib2/$Rev: 259 $
status=Test+update+from+Python+3'
reply: 'HTTP/1.1 401 Unauthorized' }1]
send: b'POST /api/statuses/update.xml HTTP/1.1 }2]
Host: identi.ca
Accept-Encoding: identity
Content-Length: 32
content-type: application/x-www-form-urlencoded
authorization: Basic SECRET_HASH_CONSTRUCTED_BY_HTTPLIB2 }8]
user-agent: Python-httplib2/$Rev: 259 $
14.6. Za lianIcomI HTTP GLT
325
status=Test+update+from+Python+3'
reply: 'HTTP/1.1 200 OK' }4]
}1] Po ivnIm ozauavlu ouovI soivoi slavovym louom 401 Unauthorized. httplib2 nIluy
noosII aulonlIzacnI lIavIcly, oluu sI o n soivoi oxIIcIln noiolno. Soivoi sI o n iIl
lImlo zusohom.
}2] httplib2 olamzIl zaioagujo oalovanym ouosInIm ozauavlu so slojnym URL.
}8] Tonlolil ohsalujo jmono a losIo, lloi jsmo iIuaII molouou add_credentials().
}4] Iungujo lo!
A co vIasln soivoi osII o ssnom ozauavlu zl To zcoIa zvIsI na aIIlacnIm iozlianI iIsIus-
no vohovo sIuzhy. V nlloiycl iololoIocl (jalo naiIlIau Alom PuhIIslIng PiolocoI) osII soivoi zl
slavovy lou 201 Created soIu s umIslnIm nov vylvoionolo zuiojo (iosouico) v lIavIcco Location.
IuonlI.ca osII zl 200 OK a XML uolumonl, lloiy ohsalujo InIoimaco o nov vylvoionom zuiojI.
# pokraovn z pedchozho pkladu
>>> print(content.decode('utf-8')) }1]
<?xml version="1.0" encoding="UTF-8"?>
<status>
<text>Test update from Python 3</text> }2]
<truncated>false</truncated>
<created_at>Wed Jun 10 03:53:46 +0000 2009</created_at>
<in_reply_to_status_id></in_reply_to_status_id>
<source>api</source>
<id>5131472</id> }8]
<in_reply_to_user_id></in_reply_to_user_id>
<in_reply_to_screen_name></in_reply_to_screen_name>
<favorited>false</favorited>
<user>
<id>3212</id>
<name>Mark Pilgrim</name>
<screen_name>diveintomark</screen_name>
<location>27502, US</location>
<description>tech writer, husband, father</description>
<profile_image_url>http://avatar.identi.ca/3212-48-20081216000626.png</profile_image_url>
<url>http://diveintomark.org/</url>
<protected>false</protected>
<followers_count>329</followers_count>
<profile_background_color></profile_background_color>
<profile_text_color></profile_text_color>
<profile_link_color></profile_link_color>
<profile_sidebar_fill_color></profile_sidebar_fill_color>
<profile_sidebar_border_color></profile_sidebar_border_color>
<friends_count>2</friends_count>
14.6. Za lianIcomI HTTP GLT
326
<created_at>Wed Jul 02 22:03:58 +0000 2008</created_at>
<favourites_count>30768</favourites_count>
<utc_offset>0</utc_offset>
<time_zone>UTC</time_zone>
<profile_background_image_url></profile_background_image_url>
<profile_background_tile>false</profile_background_tile>
<statuses_count>122</statuses_count>
<following>false</following>
<notifications>false</notifications>
</user>
</status>
}1] PiIomomo sI, zo uala viacon httplib2 jsou vzuy hajly a no iolzco. Ahyclom jo molII io-
vosl na iolzoc, musImo jo uolouoval s ouzIlIm iIsIusnolo znalovolo louovnI. AIIlacnI
iozlianI syslomu IuonlI.ca vzuy viacI vysIouly v UTF-8. Talzo lalo csl jo snaun.
}2] Zuo jo loxl slavovo zivy, lloiou jsmo iv zvoiojnIII.
}8] Tolo jo unIllnI IuonlIIIlloi novo slavovo zivy. IuonlI.ca joj ouzIv io lonsliulcI URL,
lloio so u ouzIl io zohiazonI zivy na vohu.
A lauy jI mmo:
14.7. Za lianIcomI HTTP POST
HTTP so noomozujo jon na GET a POST. Nooclyhn juo o nojhznjsI lyy uolazu, ohzvIsl zo sliany
vohovycl iolIIzocu. AIo iozlianI vohovycl sIuzoh muzo jIl za lianIco GET a POST a lnIlovna
httplib2 jo na lo iIiavon.
14.7. Za lianIcomI HTTP POST
327
# pokraovn z pedchozho pkladu
>>> from xml.etree import ElementTree as etree
>>> tree = etree.fromstring(content) }1]
>>> status_id = tree.findtext('id') }2]
>>> status_id
'5131472'
>>> url = 'https://identi.ca/api/statuses/destroy/{0}.xml'.format(status_id) }8]
>>> resp, deleted_content = h.request(url, 'DELETE') }4]
}1] Sovoi vilII XML, zo ano A my uz vImo, jal XML ziacoval.
}2] Moloua findtext() najuo ivnI ohjoll ouovIuajIcI zauanomu vyiazu a oxlialujo jolo loxlovy
ohsal. V lomlo iIau lIoumo oIomonl <id>.
}8] Z loxlovolo ohsalu oIomonlu <id> muzomo zlonsliuoval URL io vymaznI slavovo zivy,
lloiou jsmo ziovna zvoiojnIII.
}4] Zivu vymazomo lIm, zo io zmInno URL vylvoiImo ozauavol HTTP DELETE.
Po uilocl hl nsIouujIcI:
send: b'DELETE /api/statuses/destroy/5131472.xml HTTP/1.1 }1]
Host: identi.ca
Accept-Encoding: identity
user-agent: Python-httplib2/$Rev: 259 $
'
reply: 'HTTP/1.1 401 Unauthorized' }2]
send: b'DELETE /api/statuses/destroy/5131472.xml HTTP/1.1 }8]
Host: identi.ca
Accept-Encoding: identity
authorization: Basic SECRET_HASH_CONSTRUCTED_BY_HTTPLIB2 }4]
user-agent: Python-httplib2/$Rev: 259 $
'
reply: 'HTTP/1.1 200 OK' }]
>>> resp.status
200
}1] ,Ouslia lulo slavovou zivu.
}2] ,Jo mI IIlo, Davo }uojvo]. Ohvm so, zo lo nomolu uuIal.
}8] ,NoauloiIzovno Hmmm. Ouslia lu slavovou zivu, ro:m.
}4] .a lauy jo mo jmono a losIo.
}] ,Povazuj lo za lolovou vc!
14.7. Za lianIcomI HTTP POST
328
PuI a jo lo iyc.
14.8. Piocllo sI
httplib2:
- Strnku prn|oktu httplib2 (angIIcly)
(lll:llcouo.googIo.comlllllIIh2l)
- DaIsI iIlIauy louu vyuzIvajIcIlo httplib2 (angIIcly)
(lll:llcouo.googIo.comlllllIIh2lvIlIlLxamIosPyllon8)
- Dning HTTP Cuching Right: Intrnducing httplib2 (angIIcly cInol)
(vvv.xmI.comluhlal2uu6lu2lu1luoIng-lll-caclIng-iIgll-InliouucIng-lllIIh2.llmI)
- httplib2: HTTP Porsistonco und Authonticutinn (angIIcly cInol)
(vvv.xmI.comluhlal2uu6lu8l2ullllIIh2-lll-oisIslonco-anu-aullonlIcalIon.llmI)
Pico HTTP s mozIamlI:
- HTTP Tutnriul nasaI Mail NollInglam
(vvv.mnol.nollcaclo_uocsl)
- Hnw tn cnntrnl cuching with HTTP houdors (angIIcly cInol o Gnnglo Dnctypo)
(lll:llcouo.googIo.comlluoclyolvIlIlAilIcIoHllCaclIng)
RFC:
- RFC Z1: HTTP
(vvv.IolI.oigliIcliIc2616.lxl)
- RFC Z17: HTTP Busic Authonticutinn
(vvv.IolI.oigliIcliIc2617.lxl)
- RFC 101: DEFLATE cnmprossinn
(vvv.IolI.oigliIcliIc1u1.lxl)
- RFC 10Z: GZIP cnmprossinn
(vvv.IolI.oigliIcliIc1u2.lxl)
14.8. Piocllo sI
329
15. Ppadov studie:
Pepis chardet pro Python 3
1. KaIloIa
Words, words. Theyre all we have to go on.
(SIova, sIova. Jsou vsIm, colo so musImo uizol.)
o:entrun|z u Guden:|ern j:ou mr|v
330
Ohsal laIloIy
15. Ppadov studie:
Pepis chardet pro Python 3 329
1.1. Ponoimo so 331
1.2. Co so iozumI aulouololcI znalovolo louovnI 331
1.2.1. NonI lo nlouou noiovouIloIno 331
1.2.2. LxIslujo lalovy aIgoiIlmus 332
1.8. Ivou uo mouuIu chardet 332
1.8.1. UTF-N s BOM 332
1.8.2. KouovnI oscao solvoncomI 333
1.8.8. VIcohajlov louovnI 333
1.8.4. Jounohajlov louovnI 334
1.8.. windows-1252 334
1.4. SouslImo 2to3 335
1.. Kill ouhocla l vIcosouhoiovym mouuIum 338
1.6. Oiavmo, co 2to3 noumI 340
1.6.1. IaIso jo synlallIcl clyha 340
1.6.2. NonaIozon mouuI constants 341
1.6.8. Jmono 'file' nonI uoIInovno 342
1.6.4. Rolzcovy vzoiol noIzo ouzIl
io hajlovo ohjolly 343
1.6.. Ohjoll lyu 'bytes' noIzo ImIIcIln
iovosl na str 345
1.6.6. Noouoiovano lyy ooianuu
io +: 'int' a 'bytes' 348
1.6.7. Iunlco ord() ocolvaIa iolzoc o uoIco 1,
aIo hyI naIozon int 350
1.6.8. NousoiualoIno ualovo lyy: int() >= str() 352
1.6.u. GIohInI jmono 'reduce' nonI uoIInovno 355
1.7. SlinulI 357
331
1.1. Ponoimo so
Olzla: Co jo iIcnou c. 1 vououcI lo zmalonomu loxlu na vohu, vo vasI oslovnI sclinco a vo vsocl
uolumonlocl, lloio luy hyIy nasny, naiIc vsomI ocIlacovymI syslomy Jo lo louovnI znalu.
V laIloIo Rolzco jsmo so havIII o lIsloiII louovnI znalu a o vylvoionI InIcouo ,jouno louovnI
vIuno vsom. Moc hycl sI iI, luyhycl so na vohovycl slinlcl nIluy vIc nosollvaI so zmalony-
mI znaly, iolozo hy vsoclny syslomy io vylvionI loxlu ulIuaIy iosnou InIoimacI o louovnI
a iolozo hy hyIy vsoclny ionosovo iololoIy iIiavono na ouzIvnI InIcouo a lazuy syslom
io ziacovnI loxlu hy iI lonvoizI mozI louovnImI zaclovvaI oiIollnI vinosl.
Ru hycl laly onIla.
InIcouo onIla.
Kuyhy lo lal hyI InIonIl.
Buuu sI musol osouIal aulouololcI znalovolo louovnI.
1.2. Co so iozumI aulouololcI znalovolo louovnI
RozumI so lIm lo, zo vozmomo osIounosl hajlu v noznmom znalovom louovnI a olousImo so
louovnI zjIslIl, ahyclom sI loxl molII iocIsl. Pouoh so lo ImnI louu v sIluacI, luy nommo
uosIIiovacI lIIc.
1.2.1. NonI lo nlouou noiovouIloIno
Z ohocnolo olIouu lo oiavuu jo nomozno. AIo nlloi louovnI jsou olImaIIzovna io uicIlo
jazyly a jazyly nojsou nlouno. Nlloio osIounoslI znalu so ohjovujI nouslIo, zalImco jIno
osIounoslI nouvajI zuny smysI. Kuyz osoha Iynn ovIuajIcI angIIclInu olovio novIny a najuo
,lxzqJv 2!uasuua QquKjvz, olamzIl ozn, zo nojuo o angIIclInu (I luyz so loxl slIu ouzo
z Ismon, lloi so v angIIclIn ouzIvajI). Na zlIau sluuIa voIlolo mnozslvI ,lyIclolo loxlu muzo
ocIlacovy aIgoiIlmus sImuIoval zmInny uiul Iynno znaIoslI a muzo iovosl lvaIIIIlovany oulau
lylajIcI so jazyla loxlu.
JInymI sIovy, uololco louovnI jo vo slulocnoslI uololcI jazyla, lloi so lomhInujo so znaIoslI
lonuonco jazyla ouzIval uicIlo znalovo louovnI.
1.1. Ponoimo so
1.2. Co so iozumI aulouololcI
znalovolo louovnI
332
1.2.2. LxIslujo lalovy aIgoiIlmus
Jal so ulazujo, lal ano. Vsoclny nojouzIvanjsI iolIIzoco majI aulouololcI louovnI zahuuovanou,
iolozo voh jo Iny slinol, lloio noohsalujI vuhoc zunou InIoimacI o louovnI. Mnzillu Firofnx
ohsalujo lnIlovnu io aulouololcI louovnI, lloi jo oon souico. KnIlovnu jsom ionosI uo Pythnnu Z
a mouuI jsom nazvaI chardet. V lolo laIloIo vs liol za liolom iovouu iocosom ioIsovnI
mouuIu chardet z Pyllonu 2 io Pyllon 8.
1.8. Ivou uo mouuIu chardet
Noz so uo ioIsu louu uslImo, hyIo hy uohio, luyhyslo
iozumII, jal Iungujo! Tolo jo sliucn iIiucla io usnau-
nnI oiIonlaco vo vIaslnIm louu. KnIlovna chardet jo
iIIIs voIl na lo, ahycl jojI lou vIozII uo loxlu lolo lnIly.
AIo muzolo sI jI sllnoul z chardet.feedparser.org.
HIavnIm vslunIm houom uololcnIlo aIgoiIlmu jo
universaldetector.py. Ohsalujo jounu liIuu, UniversalDetector. (Mozn jslo mysIoII, zo lIavnIm
vslunIm houom jo Iunlco uolocl z chardet/__init__.py. To jo aIo jon Iunlco io zvysonI olouII,
lloi vylvoiI ohjoll liIuy UniversalDetector, zavoI joj a vilI jolo vysIouol.)
UniversalDetector zvIu l lalogoiII louovnI:
1. UTF-N s Bylo Oiuoi Mail (BOM; znal io uiconI oiauI hajlu). Zalinujo UTF-8, oh vaiIanly
UTF-16 (BIg-LnuIan a LIllIo-LnuIan) a vsoclny 4 vaiIanly oiauI hajlu UTF-82.
2. KouovnI s nIlovymI znaly (oscao oncouIngs), lloi jsou zcoIa lomalIhIInI so 7hIlovym
ASCII. Znaly sauajIcI mImo ASCII zacInajI nIlovymI solvoncomI (oscao soquonco).
PiIlIauy: ISO-2u22-JP (jaonslIna) a HZ-GB-2812 (cInslIna).
8. VIcohajlov louovnI, vo lloiycl jo lazuy znal ioiozonlovn iomnnym oclom hajlu.
PiIlIauy: BIG5 (cInslIna), SHIFT_JIS (jaonslIna), EUC-KR (loiojslIna) a UTF-8 hoz BOM.
4. Jounohajlov louovnI, vo lloiycl jo lazuy znal ioiozonlovn jounIm hajlom. PiIlIauy:
KOI8-R (iuslIna), WINDOWS-12 (lohiojslIna) a TIS-62u (llajslIna).
. WINDOWS-122, lloi ouzIvajI iouovsIm (v MIciosoIl WInuovs) sliounI manazoiI, lloiI
noiozoznajI znalovo louovnI ou uIiy v zomI.
1.8.1. UTF-N s BOM
Poluu loxl zacIn znaclou BOM, muzomo iozumn iouolIual, zo jo zalouovn v UTF-8, UTF-16 noho
UTF-82. (Znacla hom nm iosn iolno, o lloio louovnI juo. ByIa io lonlo coI navizona.) To so ujo
iImo v UniversalDetectoru, lloiy vilI vysIouol olamzIl, hoz uaIsIlo ziacovvnI loxlu.
1.8. Ivou uo mouuIu chardet
Detekce kdovn je
ve skutenosti v zvsu
za detekc jazyka.
333
1.8.2. KouovnI oscao solvoncomI
Poluu loxl ohsalujo iozoznaloIno osIounoslI s nIlovymI znaly (oscao soquonco), muzo lo hyl iI-
znalom ouzIlI louovnI, lloiomu so v angIIclIn iIl oscaou oncouIng. UniversalDetector vylvoiI
EscCharSetProber (jo uoIInovn v escprober.py) a iIvouo uo nj loxl.
EscCharSetProber vylvoiI sauu lonocnycl aulomalu, lloio vyclzojI z mouoIu io HZ-GB-2812,
ISO-2u22-CN, ISO-2u22-JP a ISO-2u22-KR (jsou uoIInovny v escsm.py). EscCharSetProber iIvuI loxl
uo lazuolo z lcllo lonocnycl aulomalu hajl o hajlu. Poluu nlloiy z lonocnycl aulomalu sloncI
s jounoznacnou IuonlIIIlacI louovnI, vilI EscCharSetProber olamzIl ozIlIvnI vysIouol ohjollu liIuy
UniversalDetector, lloiy joj vilI voIajIcImu. Poluu lloiyloIIv z lonocnycl aulomalu naiazI na noiI-
uslnou osIounosl, jo vyiazon a uaIsI ziacovnI oliacujo jon s oslalnImI lonocnymI aulomaly.
1.8.8. VIcohajlov louovnI
Za iouolIauu, zo nonI ouzIla znacla BOM, UniversalDetector zlonlioIujo, zua loxl ohsalujo njalo
znaly s naslavonym osmym hIlom. Poluu lomu lal jo, vylvoiI soiII ,uololcnIcl zaiIzonI (iohoi)
io iozoznnI vIcohajlovycl louovnI, jounohajlovycl louovnI a nalonoc, jalo osIounI moznosl,
io WINDOWS-122.
DololcnI ohjoll io vIcohajlov louovnI, MBCSGroupProber (liIua jo uoIInovna v mbcsgroupprober.py),
jo vo slulocnoslI jon ohIlou. OvIu oslalnI uololcnI ohjolly, o jounom io lazuo vIcohajlovo louov-
nI: BIG, GB2812, EUC-TW, EUC-KR, EUC-JP, SHIFT_JIS a UTF-8. MBCSGroupProber smiujo loxl uo lazuolo
z lcllo socIaIIzovanycl uololcnIcl ohjollu a lonlioIujo vysIouly. Poluu njaly uololcnI ohjoll lIsI,
zo naIozI noiIuslnou osIounosl hajlu, jo vyiazon z uaIsIlo ziacovnI (lalzo naiIlIau IIhovoIno
nsIouno voInI molouy UniversalDetector.feed() vyiazony uololcnI ohjoll ioslocI). Poluu uolol-
cnI ohjoll lIsI, zo sI jo omin jIsly iozoznnIm louovnI, oznmI MBCSGroupProber lonlo ozIlIvnI
vysIouol ohjollu UniversalDetector, lloiy oznmI vysIouol voIajIcImu.
VlsIna z uololcnIcl ohjollu io vIcohajlov louovnI jo ouvozona z MultiByteCharSetProber (uoIIno-
vna v mbcharsetprober.py) a jounouuso so navsI na iIsIusny lonocny aulomal a anaIyzloi iozIozonI.
Zhylol ico nocl na MultiByteCharSetProber. MultiByteCharSetProber iolnI loxl ios lonocno
aulomaly socIaIIzovano na jounolIIv louovnI hajl o hajlu. VylIouv osIounoslI hajlu, lloio hy
InuIlovaIy iulazno ozIlIvnI noho nogalIvnI vysIouly. MultiByteCharSetProber soucasn osII loxl
uo anaIyzloiu iozIozonI, lloiy jo socIIIcly io lazuo louovnI.
AnaIyzloiy iozIozonI (jsou uoIInovny v chardistribution.py) ouzIvajI jazylov socIIIclo mouo-
Iy nojcasljI so vyslylujIcIcl znalu. JalmIIo MultiByteCharSetProber iou anaIyzloium iozIozonI
uoslalocny ohjom loxlu, vyocIl olounoconI soIolIIvoslI, lloio jo zaIozono na oclu caslo ouzIvanycl
znalu, na coIlovom oclu znalu a na jazylov zvIsIom iozIozonI. Poluu jo soIolIIvosl uoslalocn voI-
l, vilI MultiByteCharSetProber vysIouol uo MBCSGroupProber, lloiy joj vilI uo UniversalDetectoru,
lloiy joj vilI voIajIcImu.
1.8. Ivou uo mouuIu chardet
334
PiIau jaonslIny jo ohlIznjsI. AnaIyza iozIozonI ouIo jounolIIvycl znalu novouo vzuy l iozIIsonI
EUC-JP a SHIFT_JIS, lalzo SJISProber (uoIInovn v sjisprober.py) ouzIv lalo uvojznalovou anaIy-
zu iozIozonI. SJISContextAnalysis a EUCJPContextAnalysis (uoIInIco so v ohou iIauocl naclzojI
v jpcntx.py a oh liIuy uuI zo soIocno liIuy JapaneseContextAnalysis) v loxlu lonlioIujI IiolvoncI
vyslylu sIahIcnycl znalu lIiagana. JalmIIo hyIo ziacovno uoslalocno mnozslvI loxlu, viacojI
iovo soIolIIvoslI uo SJISProber, lloiy zlonlioIujo oha anaIyzloiy a vilI vysIouol s vyssI iovnI
soIolIIvoslI uo MBCSGroupProber.
1.8.4. Jounohajlov louovnI
DololcnI ohjoll io jounohajlovo louovnI, SBCSGroupProber (liIua jo uoIInovna v sbcsgroupprober.py)
jo iovnz ohIlou, lloi ovIu sluInu jInycl uololcnIcl ohjollu jouon io lazuou lomhInacI
jounohajlovolo louovnI a jazyla: WINDOWS-121, KOI8-R,
ISO-88u-, MacCyrillic, IBM8 a IBM866 (iuslIna);
ISO-88u-7 a WINDOWS-128 (ioclIna); ISO-88u- a WIN-
DOWS-121 (huIlaislIna); ISO-88u-2 a WINDOWS-12u (cos-
lIna, mauaislIna, sIovonslIna a uaIsI); TIS-62u (llajslIna);
WINDOWS-12 a ISO-88u-8 (lohiojslIna).
SBCSGroupProber iouv loxl uo lazuolo z lcllo uololcnIcl ohjollu a lonlioIujo vysIouly. Vsocl-
ny lylo uololcnI ohjolly jsou ImIomonlovny v jouno liIu, SingleByteCharSetProber (uoIInovna
v sbcharsetprober.py), lloi iosliounIclvIm aigumonlu iohIi jazylovy mouoI. Jazylovy mouoI
uoIInujo, jal caslo so v lyIclom loxlu vyslylujI uvojznalovo osIounoslI. SingleByteCharSetProber
ziacovv loxl a zjIslujo nojcasljI so vyslylujIcI uvojznalovo osIounoslI. JalmIIo hyI ziacovn
uoslalocny ohjom loxlu, vyocIl iovo soIolIIvoslI, lloi jo zaIozona na oclu caslo so vyslylujI-
cIcl osIounoslI, na coIlovom oclu znalu a na jazylov zvIsIom iozIozonI.
HohiojslIna so iosI jalo zvIslnI iIau. Poluu so loxl na zlIau anaIyzy iozIozonI uvojznalovycl
osIounoslI jovI jalo lohiojslIna, snazI so HebrewProber (liIua uoIInovna v hebrewprober.py) iozIIsIl
mozI vIzuInI lohiojslInou (luy jo loxl uIozon vo slulocnoslI ,ozllu iuol o iulu a olo jo
zohiazon ,noimIn, lalzo muzo hyl clon ziava uoIova) a IogIclou lohiojslInou (luy jo zuiojovy
loxl uIozon v oiauI clonI a lIIonlsly iogiam lo vyliosIujo ziava uoIova). Piolozo so nlloio znaly
louujI jInal ouIo lolo, zua so naclzojI uiosliou sIova noho na jolo loncI, muzomo iozumn oulau-
noul smi zuiojovolo loxlu a vilIl iIsIusno louovnI (windows-1255 io IogIclou lohiojslInu noho
ISO-8859-8 io vIzuInI lohiojslInu).
1.8.. windows-1252
Poluu UniversalDetector v loxlu uololujo znaly s naslavonym osmym hIlom a zuny z vIcohajlovycl
noho jounohajlovycl uololcnIcl ohjollu novilII soIolIIvy vysIouol, vylvoiI Latin1Prober (liIua jo
uoIInovna v latin1prober.py) a snazI so uololoval angIIcly loxl v louovnI windows-1252.
1.8. Ivou uo mouuIu chardet
Vn, kde je mj Unicode
ponk?
335
Talo uololco jo zo svo ouslaly nosoIolIIv, iolozo angIIclo znaly so louujI slojnym zusohom v mno-
la iuznycl louovnIcl. JouIny zusoh, jal Izo louovnI windows-1252 iozoznal, jo zaIozon na hzn
ouzIvanycl symhoIocl, jalo jsou sliIuavo uvozovly (smail quolos; lnIznI, jIny znal na zacllu a jIny
na loncI), luIalo aoslioIy, symhoI coyiIgll a ouohn. Latin1Prober aulomalIcly iouulujo olounoco-
nI svo soIolIIvoslI, ahy umoznII iosnjsIm uololloium vylil, oluu jo lo vuhoc mozno.
1.4. SouslImo 2to3
Jsmo iIiavonI l ionosonI mouuIu chardet z Pyllonu 2 uo Pyllonu 8. Pyllon 8 so uouv s omoc-
nym sliIlom nazvanym 2to3, lloiy jalo vslu iohIi zuiojovy lou nasany io Pyllon 2 a auloma-
lIcly iovuI vso, co uovouo, uo ouohy io Pyllon 8. V nlloiycl iIauocl jo lo snauno Iunlco
so iojmonovaIa noho so iosunuIa uo jInolo mouuIu , aIo v oslalnIcl iIauocl lo muzo hyl uocoIa
sIozIlo. Ahyslo zIslaII iouslavu, co vso um iovosl, ouIvojlo so na iIIolu PioIs louu uo Pyllon 8
s vyuzIlIm 2to3. V lolo laIloIo zacnomo suslnIm 2to3 io haIIl chardet. AIo jal hizy uvIuIlo,
o iovouonI louzoI aulomalIclymI nsliojI nm zhuuo josl sousla ico.
HIavnI haIIl chardet jo iozuIon uo nloIIla iuznycl souhoiu. Vsoclny so naclzojI vo slojnom auio-
siI. SliIl 2to3 iovou vIco souhoiu najounou usnauujo. Jalo aigumonl na iIlazovom iulu slacI
ioual jmono auiosio a 2to3 iovouo lazuy zo souhoiu, lloio so v nm naclzojI.
C:\home\chardet> python c:\Python30\Tools\Scripts\2to3.py -w chardet\
RefactoringTool: Skipping implicit fixer: buffer
RefactoringTool: Skipping implicit fixer: idioms
RefactoringTool: Skipping implicit fixer: set_literal
RefactoringTool: Skipping implicit fixer: ws_comma
--- chardet\__init__.py (original)
+++ chardet\__init__.py (refactored)
@@ -18,7 +18,7 @@
__version__ = "1.0.1"
def detect(aBuf):
- import universaldetector
+ from . import universaldetector
u = universaldetector.UniversalDetector()
u.reset()
u.feed(aBuf)
--- chardet\big5prober.py (original)
+++ chardet\big5prober.py (refactored)
@@ -25,10 +25,10 @@
# 02110-1301 USA
######################### END LICENSE BLOCK #########################
1.4. SouslImo 2to3
336
-from mbcharsetprober import MultiByteCharSetProber
-from codingstatemachine import CodingStateMachine
-from chardistribution import Big5DistributionAnalysis
-from mbcssm import Big5SMModel
+from .mbcharsetprober import MultiByteCharSetProber
+from .codingstatemachine import CodingStateMachine
+from .chardistribution import Big5DistributionAnalysis
+from .mbcssm import Big5SMModel
class Big5Prober(MultiByteCharSetProber):
def __init__(self):
--- chardet\chardistribution.py (original)
+++ chardet\chardistribution.py (refactored)
@@ -25,12 +25,12 @@
# 02110-1301 USA
######################### END LICENSE BLOCK #########################
-import constants
-from euctwfreq import EUCTWCharToFreqOrder, EUCTW_TABLE_SIZE, EUCTW_TYPICAL_DISTRIBUTION_RATIO
-from euckrfreq import EUCKRCharToFreqOrder, EUCKR_TABLE_SIZE, EUCKR_TYPICAL_DISTRIBUTION_RATIO
-from gb2312freq import GB2312CharToFreqOrder, GB2312_TABLE_SIZE, GB2312_TYPICAL_DISTRIBUTION_RATIO
-from big5freq import Big5CharToFreqOrder, BIG5_TABLE_SIZE, BIG5_TYPICAL_DISTRIBUTION_RATIO
-from jisfreq import JISCharToFreqOrder, JIS_TABLE_SIZE, JIS_TYPICAL_DISTRIBUTION_RATIO
+from . import constants
+from .euctwfreq import EUCTWCharToFreqOrder, EUCTW_TABLE_SIZE, EUCTW_TYPICAL_DISTRIBUTION_RATIO
+from .euckrfreq import EUCKRCharToFreqOrder, EUCKR_TABLE_SIZE, EUCKR_TYPICAL_DISTRIBUTION_RATIO
+from .gb2312freq import GB2312CharToFreqOrder, GB2312_TABLE_SIZE, GB2312_TYPICAL_DISTRIBUTION_RATIO
+from .big5freq import Big5CharToFreqOrder, BIG5_TABLE_SIZE, BIG5_TYPICAL_DISTRIBUTION_RATIO
+from .jisfreq import JISCharToFreqOrder, JIS_TABLE_SIZE, JIS_TYPICAL_DISTRIBUTION_RATIO
ENOUGH_DATA_THRESHOLD = 1024
SURE_YES = 0.99
.
.
. (takhle to chvli pokrauje)
.
.
RefactoringTool: Files that were modified:
RefactoringTool: chardet\__init__.py
RefactoringTool: chardet\big5prober.py
RefactoringTool: chardet\chardistribution.py
RefactoringTool: chardet\charsetgroupprober.py
RefactoringTool: chardet\codingstatemachine.py
1.4. SouslImo 2to3
337
RefactoringTool: chardet\constants.py
RefactoringTool: chardet\escprober.py
RefactoringTool: chardet\escsm.py
RefactoringTool: chardet\eucjpprober.py
RefactoringTool: chardet\euckrprober.py
RefactoringTool: chardet\euctwprober.py
RefactoringTool: chardet\gb2312prober.py
RefactoringTool: chardet\hebrewprober.py
RefactoringTool: chardet\jpcntx.py
RefactoringTool: chardet\langbulgarianmodel.py
RefactoringTool: chardet\langcyrillicmodel.py
RefactoringTool: chardet\langgreekmodel.py
RefactoringTool: chardet\langhebrewmodel.py
RefactoringTool: chardet\langhungarianmodel.py
RefactoringTool: chardet\langthaimodel.py
RefactoringTool: chardet\latin1prober.py
RefactoringTool: chardet\mbcharsetprober.py
RefactoringTool: chardet\mbcsgroupprober.py
RefactoringTool: chardet\mbcssm.py
RefactoringTool: chardet\sbcharsetprober.py
RefactoringTool: chardet\sbcsgroupprober.py
RefactoringTool: chardet\sjisprober.py
RefactoringTool: chardet\universaldetector.py
RefactoringTool: chardet\utf8prober.py
Tou suslImo sliIl 2to3 na loslovacI sliIl test.py.
C:\home\chardet> python c:\Python30\Tools\Scripts\2to3.py -w test.py
RefactoringTool: Skipping implicit fixer: buffer
RefactoringTool: Skipping implicit fixer: idioms
RefactoringTool: Skipping implicit fixer: set_literal
RefactoringTool: Skipping implicit fixer: ws_comma
--- test.py (original)
+++ test.py (refactored)
@@ -4,7 +4,7 @@
count = 0
u = UniversalDetector()
for f in glob.glob(sys.argv[1]):
- print f.ljust(60),
+ print(f.ljust(60), end=' ')
u.reset()
for line in file(f, 'rb'):
u.feed(line)
1.4. SouslImo 2to3
338
@@ -12,8 +12,8 @@
u.close()
result = u.result
if result['encoding']:
- print result['encoding'], 'with confidence', result['confidence']
+ print(result['encoding'], 'with confidence', result['confidence'])
else:
- print '******** no result'
+ print('******** no result')
count += 1
-print count, 'tests'
+print(count, 'tests')
RefactoringTool: Files that were modified:
RefactoringTool: test.py
No vIua. NohyIo lo lal liozno. KonvoilovaIo so jon i Imoilu a iIlazu iInl. Kuyz uz o lom mIuvI-
mo, juLy Iy iohIom so vsomI lmI iIlazy Imoil Ahyclom na lo molII ouovul, musImo iozuml
lomu, jal so mouuI claiuol uII na vIco souhoiu.
1.. Kill ouhocla l vIcosouhoiovym mouuIum
chardet jo vte:ouIorovy modu. MolI jsom so iozlounoul, zo vosloiy lou uIozIm uo jounolo souhoiu
(ojmonovanolo chardet.py), aIo nouuIaI jsom lo. MIslo lolo jsom vylvoiII auiosi (ojmonovany
chardet) a v nm jsom vylvoiII souhoi __init__.py. FoLud Fy|hon nujde v udre:0I :ouIor __init__.py,
IedoL0d0, 2e v:ethny o:|u|n :ouIory ve :|ejn6m udre:0I j:ou :out0:| :|ejn6ho moduu. Jmono auiosio
jo jmonom mouuIu. Souhoiy v auiosiI so molou oulazoval na oslalnI souhoiy vo slojnom auiosiI
noho uolonco v jolo ouauiosiIcl. (VIco sI o lom iolnomo za mInullu.) AIo coI loIolco souhoiu
so oloInImu yllonovslomu louu jovI jalo jouIny mouuI jalo luyhy vsoclny Iunlco a liIuy hyIy
uoIInovny v jouInom souhoiu s iIonou .py.
A co jo vIasln v souhoiu __init__.py NIc. Vsoclno. Nco mozI lIm. Souhoi __init__.py nomusI
uoIInoval vuhoc nIc. Muzo lo hyl uosIova izuny souhoi. Noho joj muzomo ouzIl l uoIInIcI IunlcI,
lloio jsou nasImI lIavnImI vslunImI houy. Noho uo nj muzomo umIslIl vsoclny naso Iunlco. Pou-
slaln jo jouIn vc.
> Auiosi so souhoiom __init__.py so vzuy ovazujo za vIcosouhoiovy mouuI. Poluu v auiosiI
nonI umIsln souhoi __init__.py, ovazujo so iosl za auiosi, lloiy nom l souhoium
s iIonou .py zuny vzlal.
PouIvojmo so, jal lo Iungujo v iaxI.
1.. Kill ouhocla l vIcosouhoiovym
mouuIum
339
>>> import chardet
>>> dir(chardet) }1]
['__builtins__', '__doc__', '__file__', '__name__',
'__package__', '__path__', '__version__', 'detect']
>>> chardet }2]
<module 'chardet' from 'C:\Python31\lib\site-packages\chardet\__init__.py'>
}1] Poluu nouvazujomo ohvylIo aliIhuly liIu, najuomo v mouuIu chardet jouInou vc
a lou jo Iunlco detect().
}2] Tauy mmo ivnI slou, lloi iIl, zo mouuI chardet jo vIc noz jon ohycojnym souhoiom:
u sIova ,mouuIo so vo vyIsu ohjovujo souhoi __init__.py umIslny v auiosiI chardet/.
NalIounmo uo souhoiu __init__.py.
def detect(aBuf): }1]
from . import universaldetector }2]
u = universaldetector.UniversalDetector()
u.reset()
u.feed(aBuf)
u.close()
return u.result
}1] V souhoiu __init__.py jo uoIInovna Iunlco detect(), lloi jo lIavnIm houom lnIlovny chardet.
}2] AIo Iunlco detect() noohsalujo sloio zuny lou! Vo slulocnoslI ouzo Imoilujo mouuI
universaldetector a zacIn joj ouzIval. AIo luo jo uoIInovn universaldetector
Ouovu jo sliyla v lomlo uIvn vyauajIcIm iIlazu import:
from . import universaldetector
V iolIauu uo coslIny lo znamon ,Imoiluj mouuI universaldetector, lloiy jo umIsln vo slojnom
auiosiI, jalo j. TIm ,j so mysII souhoi chardet/__init__.py. RIl so lomu reu|vn mor|. Piou-
slavujo zusoh, jalym so molou souhoiy vo vIcosouhoiovom mouuIu na soho vzjomn oulazoval,
anIz hy so musoIy slaial o lonIIIlly jmon s jInymI mouuIy, lloio muzomo mIl naInslaIovano v nasI
vylIouvacI cosl io Imoil. Ivouony iIlaz import huuo mouuI universaldetector lIoual ouzo
uvnIli auiosio chardet/.
ZmInno uva loncoly __init__.py a ioIalIvnI Imoily znamonajI, zo ns mouuI muzomo iozhIl
na loIIl louslu, loIIl sI iojomo. MouuI chardet so slIu z 86 souhoiu s iIonou .py z 86!
A iIlom vso, co musImo uuIal, luyz joj clcomo zacIl ouzIval, jo import chardet. Pal muzomo
zavoIal lIavnI IunlcI chardet.detect(). AnIz o lom ns lou vI, Iunlco detect() jo vo slulocnoslI
uoIInovna v souhoiu chardet/__init__.py. A anIz o lom musImo vul my, Iunlco detect()
1.. Kill ouhocla l vIcosouhoiovym
mouuIum
340
ouzIv l oulazu na liIuu uoIInovanou uvnIli chardet/universaldetector.py moclanIsmus ioIalIv-
nIlo Imoilu, lloiy zaso ouzIv ioIalIvnI Imoil lI uaIsIcl souhoiu, lloio so iovnz naclzojI
v auiosiI chardet/.
> KuyloIIv so iIslIlnolo, zo v Pyllonu Isolo iozslIou lnIlovnu (noho, coz jo iavuouohnj-
sI, luyz zjIslIlo, zo so vaso maI lnIlovna iozioslIa vo voIlou), uuIojlo sI cas na ioIalloiIzacI
a zmlo jI na vIcosouhoiovy mouuI. Jo lo jouna z mnola vcI, vo lloiycl jo Pyllon uohiy.
Talzo lo vylouy vyuzIjlo.
1.6. Oiavmo, co 2to3 noumI
1.6.1. IaIso jo synlallIcl clyha
Tou zlusImo slulocny losl. SuslImo loslovacI sauu (losl suIlo) na zlusohnI sliIl (losl lainoss). Pio-
lozo jo loslovacI saua navizona lal, ahy oliyIa vsoclny
mozno cosly, luuy so hl iogiamu muzo louom uhIial,
juo o uohiy zusoh, jal oviIl, zo v nasom ionosonom
louu nluo nojsou sliylo clyhy.
C:\home\chardet> python test.py tests\*\*
Traceback (most recent call last):
File "test.py", line 1, in <module>
from chardet.universaldetector import UniversalDetector
File "C:\home\chardet\chardet\universaldetector.py", line 51
self.done = constants.False
^
SyntaxError: invalid syntax
Hmm, lo jo jon uiohnosl. V Pyllonu 8 jo False vyliazonym sIovom, lalzo jo nomuzomo ouzIl jalo
jmono iomnno. PouIvmo so uo constants.py na lo, luo jo iomnn uoIInovna. Tauy mmo u-
vounI voizI z constants.py ioulIm, noz jI sliIl 2to3 zmnII:
import __builtin__
if not hasattr(__builtin__, 'False'):
False = 0
True = 1
else:
False = __builtin__.False
True = __builtin__.True
1.6. Oiavmo, co 2to3 noumI
Pete testy, e?
341
Tonlo lus louu hyI navizon, ahy lnIlovna hzoIa vo slaisIcl voizIcl Pyllonu 2. Piou Pyllonom 2.8
nooxIslovaI zahuuovany ly bool. Ivouony lou uololujo noiIlomnosl zahuuovanycl lonslanl True
a False a v iIau oliohy jo uoIInujo.
AIo v Pyllonu 8 jo ly bool iIlomon vzuy, lalzo jo coIy iyvol louu zhylocny. NojjounouussI iosonI
socIv v naliazonI vsocl vyslylu constants.True a constants.False lounolamI True a False.
Pal z constants.py ouslianImo onon milvy lou.
Talzo nsIouujIcI iuol v universaldetector.py
self.done = constants.False
so zmnI na
self.done = False
cl, nohyIo lo usolojujIcI Kou jo lou lialsI a cIloInjsI.
1.6.2. NonaIozon mouuI constants
NaslaI cas suslIl znovu test.py. IvIuImo, jal uaIolo so uoslanomo.
C:\home\chardet> python test.py tests\*\*
Traceback (most recent call last):
File "test.py", line 1, in <module>
from chardet.universaldetector import UniversalDetector
File "C:\home\chardet\chardet\universaldetector.py", line 29, in <module>
import constants, sys
ImportError: No module named constants
Co lo iIl Jaloal ,No mouuIo namou constants (uosIova ,zuny mouuI jmonom constants)
MouuI conslanls lam samoziojm jo! Jo iImo lauy v chardet/constants.py.
VzomInlo sI, jal sliIl 2to3 oiavII vsoclny ly iIlazy Imoil Talo lnIlovna ouzIv mnozslvI
ioIalIvnIcl Imoilu mouuIy, lloio ImoilujI jIno mouuIy naclzojIcI so uvnIli slojno lnIlovny ,
aIo v Fy|honu 8 :e zm6nu ogLu reu|vnth mor|. V Pyllonu 2 jsmo molII jounouuso iovosl import
constants a Pyllon hy nojuiIvo iolIouvaI auiosi chardet/. V Pyllonu 8 jsou vsoclny iIlazy
Imoil ahsoIulnI. Poluu clcomo v Pyllonu 8 iovosl ioIalIvnI Imoil, musImo lo iIcl oxIIcIln:
from . import constants
1.6. Oiavmo, co 2to3 noumI
342
No momonl. NomI so o lolIo oslaial sliIl 2to3 za ns No, on lo uuIaI. AIo lonlo lonliolnI iIlaz
Imoil lomhInovaI uva lyy Imoilu na jounom iulu: ioIalIvnI Imoil mouuIu constants, lloiy so
naclzI uvnIli lnIlovny, a ahsoIulnI Imoil mouuIu sys, lloiy jo iouInslaIovn jalo soucsl yllono-
vslo slanuaiunI lnIlovny. V Pyllonu 2 jsmo jo molII zlomhInoval uo jounolo iulu iIlazu Imoil.
V Pyllonu 8 lo nojuo a sliIl 2to3 nonI uosl clyliy na lo, ahy iIlaz Imoil iozuIII na uva.
RosonI socIv v iucnIm iozuIonI iIlazu Imoil. Talzo lonlo Imoil ,uva v jounom...
import constants, sys
... musImo zmnIl na uva ouuIono Imoily:
from . import constants
import sys
VaiIaco lololo iohIomu jsou iozosoly o coIo lnIlovn chardet. Na nlloiycl mIslocl jo lo ,import
constants, sys, jInuo jo lo ,import constants, re. Oiava jo slojn. Rucn iozuIImo iIlaz Imoil
na uva iuly. Na jounom uvouomo ioIalIvnI Imoil, na uiulom ahsoIulnI Imoil.
Kuiouu!
1.6.8. Jmono 'file' nonI uoIInovno
A zaso juomo na lo. SouslImo test.py, ahyclom iovouII naso loslovacI iIauy.
C:\home\chardet> python test.py tests\*\*
tests\ascii\howto.diveintomark.org.xml
Traceback (most recent call last):
File "test.py", line 9, in <module>
for line in file(f, 'rb'):
NameError: name 'file' is not defined
Tal lolIo m iolvaIIo, iolozo lonlo ohial jsom ouzIvaI,
co mI aml sal. V Pyllonu 2 hyIa gIohInI Iunlco file()
jInym jmonom (aIIas) io IunlcI open(), lloi iouslavovaIa
slanuaiunI zusoh olvIinI loxlovycl souhoiu io clonI.
V Pyllonu 8 uz gIohInI Iunlco file() nooxIslujo, aIo Iunlco
open() jo lu nauIo.
Talzo nojjounouussI iosonI iohIomu clyhjIcI Iunlco file() socIv v jojIm naliazonI voInIm Iunlco open():
for line in open(f, 'rb'):
1.6. Oiavmo, co 2to3 noumI
open() je novm file().
PapayaWhip je nov ern.
343
A lo jo vso, co o lom muzu iIcl.
1.6.4. Rolzcovy vzoiol noIzo ouzIl io hajlovo ohjolly
Tou so zacnou uIl zajImavo vcI. SIuvlom ,zajImavo iozumIm ,oloIn maloucI.
C:\home\chardet> python test.py tests\*\*
tests\ascii\howto.diveintomark.org.xml
Traceback (most recent call last):
File "test.py", line 10, in <module>
u.feed(line)
File "C:\home\chardet\chardet\universaldetector.py", line 98, in feed
if self._highBitDetector.search(aBuf):
TypeError: can't use a string pattern on a bytes-like object
Ahyclom lo ouIauIII, ouIvojmo so, co jo self._highBitDetector. Jo lo uoIInovno v molou
__init__ liIuy UniversalDetector:
class UniversalDetector:
def __init__(self):
self._highBitDetector = re.compile(r'[\x80-\xFF]')
Juo o ioulomIIovany ioguIinI vyiaz, lloiy m lIoual znaly mImo ASCII, lj. v iozsalu 1282
(ux8uuxII). Poclal, lolIo nonI In sivn. MusImo ouzIl iosnjsI loimInoIogII. Tonlo vzoiol
jo navizon io lIounI hajlu s lounolou mImo ascII, louy v iozsalu 1282.
A v lom jo lon iohIom.
V Pyllonu 2 hyI iolzoc oIom hajlu. Jolo louovnI znalu hyIo zaclycono ouuIon. Poluu jsmo
o Pyllonu 2 cllII, ahy znalovo louovnI uuizovaI u iolzco, musoII jsmo ouzIl InIcouo iolzoc
(u''). AIo v Pyllonu 8 jo iolzoc vzuy lIm, co Pyllon 2 nazyvaI InIcouo iolzoc lo znamon oIom
InIcouo znalu (lloio molou hyl vyjuiony iuznym oclom hajlu). A iolozo jo lonlo ioguIinI vyiaz
uoIInovn iolzcovym vzoilom, muzo hyl ouzIl jon io iolIouvnI iolzcu, coz jo oIo znalu.
AIo my noclcomo iolIouval iolzoc. PiolIouvmo oIo hajlu. PolIouom na liasovacI vyIs zjIslImo,
zo l clyh uosIo v universaldetector.py:
def feed(self, aBuf):
.
.
.
if self._mInputState == ePureAscii:
if self._highBitDetector.search(aBuf):
1.6. Oiavmo, co 2to3 noumI
344
A co jo lo aBuf PouIvojmo so josl o lousol zl, na mIslo, luo so voI UniversalDetector.feed().
Jouno z mIsl, luo so voI, so naclzI v loslovacIm louu (losl lainoss) test.py.
u = UniversalDetector()
.
.
.
for line in open(f, 'rb'):
u.feed(line)
A lauy mmo ouovu: aBuf jo iuol nacIlany v molou
UniversalDetector.feed() zo souhoiu na uIslu. PouIvojlo
so oiun na aiamoliy, lloio so ouzIvajI iI olvIinI
souhoiu: 'rb'. 'r' znamon ,ioau (clonI). No uohi, lo jo
lolo. Clomo zo souhoiu. No jo! 'b' znamon ,hInin.
Boz iIznalu 'b' hy cylIus for colI souhoi o iucIcl
a lazuy iuol hy iovuI na iolzoc louy na oIo InIcouo znalu s vyuzIlIm syslomovolo vyclozIlo
znalovolo louovnI. AIo s iIznalom 'b' clo cylIus for zo souhoiu o iucIcl a lazuy iuol ulIu
uo oIo hajlu iosn v lalovom lvaiu, v jalom so naclzI v souhoiu. VysIouno oIo hajlu so iouv
uo UniversalDetector.feed() a nalonoc so uoslano az l ioulomIIovanomu ioguIinImu vyiazu
self._highBitDetector, ahy so nasIy osmIhIlovo. znaly. AIo my nommo znaly. My mmo hajly.
A uo icIc.
Poliohujomo, ahy lonlo ioguIinI vyiaz nolIouaI v oII znalu, aIo v oII hajlu.
Kuyz uz jsmo na lo iIsII, huuo niava jounouucl. RoguIinI vyiazy uoIInovano iolzcI molou lIo-
ual v iolzcIcl. RoguIinI vyiazy uoIInovano oII hajlu molou lIoual v oIIcl hajlu. Ahyclom uoIIno-
vaII vzoiol oIom hajlu, jounouuso zmnImo ly aigumonlu, lloiy ouzIvmo io uoIInIcI ioguIinIlo
vyiazu, na oIo hajlu. (Hnou na nsIouujIcIm iulu jo uaIsI iIau loloz iohIomu.)
class UniversalDetector:
def __init__(self):
- self._highBitDetector = re.compile(r'[\x80-\xFF]')
- self._escDetector = re.compile(r'(\033|~{)')
+ self._highBitDetector = re.compile(b'[\x80-\xFF]')
+ self._escDetector = re.compile(b'(\033|~{)')
self._mEscCharSetProber = None
self._mCharSetProbers = []
self.reset()
1.6. Oiavmo, co 2to3 noumI
Nen to pole znak,
ale pole bajt.
345
Kuyz noclmo vo vsocl zuiojovycl loxlocl vylIoual ouzIlI mouuIu re, ohjovImo uaIsI uva iIauy
v charsetprober.py. Juo ol o iIauy, luy jsou ioguIinI vyiazy uoIInovny jalo iolzco, aIo ouzIvmo
jo io aBuf, coz jo oIo hajlu. RosonI jo slojno: uoIInujomo vzoily ioguIinIcl vyiazu jalo oIo hajlu.
class CharSetProber:
.
.
.
def filter_high_bit_only(self, aBuf):
- aBuf = re.sub(r'([\x00-\x7F])+', ' ', aBuf)
+ aBuf = re.sub(b'([\x00-\x7F])+', b' ', aBuf)
return aBuf

def filter_without_english_letters(self, aBuf):
- aBuf = re.sub(r'([A-Za-z])+', ' ', aBuf)
+ aBuf = re.sub(b'([A-Za-z])+', b' ', aBuf)
return aBuf
1.6.. Ohjoll lyu 'bytes' noIzo ImIIcIln iovosl na str
DIvoucnjsI a uIvoucnjsI.
C:\home\chardet> python test.py tests\*\*
tests\ascii\howto.diveintomark.org.xml
Traceback (most recent call last):
File "test.py", line 10, in <module>
u.feed(line)
File "C:\home\chardet\chardet\universaldetector.py", line 100, in feed
elif (self._mInputState == ePureAscii) and self._escDetector.search(self._mLastChar + aBuf):
TypeError: Can't convert 'bytes' object to str implicitly
Zuo uoclzI l noslaslno loIIzI mozI slyIom zIsu zuiojovolo loxlu a Inloiiolom Pyllonu. Clyha
TypeError so muzo vzal na lloiouloIIv csl iulu, aIo liasovacI vyIs nm noiIl, luo iosn jo.
Muzo lo hyl v ivnI noho v uiulo cslI oumInly, aIo z liasovacIlo vyIsu so lo noozn. Ahyclom
iosloi io lIounI zzIII, mII hyclom iuol iozuIIl:
elif (self._mInputState == ePureAscii) and \
self._escDetector.search(self._mLastChar + aBuf):
A znovu suslImo losl:
1.6. Oiavmo, co 2to3 noumI
346
C:\home\chardet> python test.py tests\*\*
tests\ascii\howto.diveintomark.org.xml
Traceback (most recent call last):
File "test.py", line 10, in <module>
u.feed(line)
File "C:\home\chardet\chardet\universaldetector.py", line 101, in feed
self._escDetector.search(self._mLastChar + aBuf):
TypeError: Can't convert 'bytes' object to str implicitly
Ala! PiohIom so novyslylovaI v ivnI cslI oumInly (self._mInputState == ePureAscii), aIo v uiu-
lo. Talzo co zuo vIasln zusohujo clyhu TypeError Mozn sI mysIIlo, zo moloua search() ocolv
lounolu ouIIsnolo lyu. To hy aIo novygonoiovaIo lalovy liasovacI vyIs. Pyllonovslo Iunlco molou
iohIial IIhovoIno lounoly. Poluu ioumo sivny ocol aigumonlu, Iunlco so iovouo. Poluu hyclom
iouaII lounolu jInolo lyu, noz Iunlco ocolv, molIa hy huvurovu|. AIo oluu hy so lal slaIo, liasova-
cI vyIs hy ulazovaI na mIslo nluo uvnIli Iunlco. Jonzo lonlo liasovacI vyIs iIl, zo so nIluy nouosIo
lal uaIolo, ahy so moloua search() zavoIaIa. Talzo iohIom musI hyl sliyl v ooiacI +, iolozo la so
snazI o zlonsliuovnI lounoly, lloi huuo nalonoc iouna molou search().
Z iouclozIlo IaunI vImo, zo aBuf jo oIom hajlu. A co jo louy self._mLastChar Juo o cIonslou
iomnnou uoIInovanou v molou reset(), lloi jo vo slulocnoslI voIna z molouy __init__().
class UniversalDetector:
def __init__(self):
self._highBitDetector = re.compile(b'[\x80-\xFF]')
self._escDetector = re.compile(b'(\033|~{)')
self._mEscCharSetProber = None
self._mCharSetProbers = []
self.reset()
def reset(self):
self.result = {'encoding': None, 'confidence': 0.0}
self.done = False
self._mStart = True
self._mGotData = False
self._mInputState = ePureAscii
self._mLastChar = ''
A lauy mmo ouovu. VIuIlo lo self._mLastChar jo iolzoc, aIo aBuf jo oIo hajlu. KonlalonacI
(ziolzonI, sojonI) noIzo iovul io iolzoc a oIo hajlu anI luyz juo o iolzoc nuIovo uoIly.
No uohi, aIo l comu jo louy self._mLastChar V molou feed(), jon i iulu ou mIslom oznaco-
nym v liasovacIm vyIsu, vIuImo...
1.6. Oiavmo, co 2to3 noumI
347
if self._mInputState == ePureAscii:
if self._highBitDetector.search(aBuf):
self._mInputState = eHighbyte
elif (self._mInputState == ePureAscii) and \
self._escDetector.search(self._mLastChar + aBuf):
self._mInputState = eEscAscii
self._mLastChar = aBuf[-1]
VoIajIcI Iunlco voI molouu feed() oiu uoloIa s lIm, zo jI olazuo iou i hajlu. Moloua ziacujo
zauano hajly (uoslv jo v aBuf) a olom uIozI osIounI hajl uo self._mLastChar io iIau, zo hy joj
oliohovaIa iI uaIsIm voInI. (PiI ouzIlI vIcohajlovolo louovnI hy moloua feed() molIa hyl zavo-
Ina io oIovInu znalu a al hy molIa hyl voIna io jolo uiulou oIovInu.) AIo iolozo jo lou aBuf
mIslo iolzco oIom hajlu, musImo uuIal oIo hajlu I z self._mLastChar. Talzo:
def reset(self):
.
.
.
- self._mLastChar = ''
+ self._mLastChar = b''
Kuyz vo vsocl zuiojovycl souhoiocl vylIoumo ,mLastChar, najuomo ouohny iohIom v mbchar-
setprober.py. AIo mIslo uclovvnI osIounIlo znalu so uclovvajI osIounI uva znaly. TiIua
MultiByteCharSetProber ouzIv l uclovvnI osIounIcl uvou znalu soznam jounoznalovycl
iolzcu. V Pyllonu 8 musImo ouzIl soznam coIycl cIsoI, iolozo vo slulocnoslI nouclovvmo znaly,
aIo hajly. (Bajly jsou iosl coI cIsIa v InloivaIu 0-255.)
class MultiByteCharSetProber(CharSetProber):
def __init__(self):
CharSetProber.__init__(self)
self._mDistributionAnalyzer = None
self._mCodingSM = None
- self._mLastChar = ['\x00', '\x00']
+ self._mLastChar = [0, 0]
def reset(self):
CharSetProber.reset(self)
if self._mCodingSM:
self._mCodingSM.reset()
if self._mDistributionAnalyzer:
self._mDistributionAnalyzer.reset()
- self._mLastChar = ['\x00', '\x00']
+ self._mLastChar = [0, 0]
1.6. Oiavmo, co 2to3 noumI
348
1.6.6. Noouoiovano lyy ooianuu io +: 'int' a 'bytes'
Mm jounu uohiou a jounu salnou zivu. Ta uohi jo, zo uImo olioly.
C:\home\chardet> python test.py tests\*\*
tests\ascii\howto.diveintomark.org.xml
Traceback (most recent call last):
File "test.py", line 10, in <module>
u.feed(line)
File "C:\home\chardet\chardet\universaldetector.py", line 101, in feed
self._escDetector.search(self._mLastChar + aBuf):
TypeError: unsupported operand type(s) for +: 'int' and 'bytes'
.Ta saln jo, zo lo nluy lal novyau.
AIo on lo jo oliol! Oiavuu! I luyz liasovacI vyIs oznacujo slojny iuol louu, jo lo jIn clyha, noz
so lIsIIa uiIvo. Poliol! Talzo luoal mmo iohIom lou Kuyz jsmo lo lonlioIovaII mInuIo, nosnazII
so lonlo iuol iolzIl int s oIom hajlu (bytes). Vo slulocnoslI jsmo slivIII uosl casu lIm, ahyclom
zajIslIII, zo self._mLastChar huuo oIo hajlu. Jal so molIo zmnIl na int
Ouovu nonI sliyl v iouclozIcl iucIcl louu, aIo v nsIouujIcIcl.
if self._mInputState == ePureAscii:
if self._highBitDetector.search(aBuf):
self._mInputState = eHighbyte
elif (self._mInputState == ePureAscii) and \
self._escDetector.search(self._mLastChar + aBuf):
self._mInputState = eEscAscii
self._mLastChar = aBuf[-1]
Talo clyha so novyslylno iI ivnIm voInI molouy
feed(). Vyslylno so I druh6m vo0n olo, co hyI io-
mnno self._mLastChar iIiazon osIounI hajl aBuf.
No a v com jo louy iohIom Kuyz z hajlovolo oIo zIsl-
mo jouon ivol, uoslanomo coIo cIsIo a no hajlovo oIo.
Ahyclom lon iozuII vIuII, ulzomo sI lo v InloiallIvnIm
sloIIu:
1.6. Oiavmo, co 2to3 noumI
Kad prvek etzce je
etzcem. Kad prvek
z pole bajt je cel slo.
349
>>> aBuf = b'\xEF\xBB\xBF' }1]
>>> len(aBuf)
3
>>> mLastChar = aBuf[-1]
>>> mLastChar }2]
191
>>> type(mLastChar) }8]
<class 'int'>
>>> mLastChar + aBuf }4]
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: unsupported operand type(s) for +: 'int' and 'bytes'
>>> mLastChar = aBuf[-1:] }]
>>> mLastChar
b'\xbf'
>>> mLastChar + aBuf }6]
b'\xbf\xef\xbb\xbf'
}1] DoIInujomo oIo hajlu o uoIco 8.
}2] PosIounI ivol oIo hajlu m lounolu 1u1.
}8] Jo lo coIo cIsIo (Inlogoi).
}4] ZiolzonI oIo hajlu s coIym cIsIom noIungujo. Piv jsmo navouIII clyhu, lloiou jsmo
ozoiovaII v universaldetector.py.
}] A lauy mmo niavu. MIslo zIslvnI osIounIlo ivlu z oIo hajlu ouzIjomo ooiacI
io zIslnI vyiozu (sIIcIng). VylvoiImo jI novo oIo hajlu, lloio ohsalujo jon osIounI ivol.
To znamon, zo zacnomo osIounIm ivlom a oliacujomo v lvoih vyiozu (sIIco), uoluu
nouoslnomo lonco oIo hajlu. Tou jo mLastChar oIom hajlu o uoIco 1.
}6] ZiolzonIm oIo hajlu o uoIco 1 s oIom hajlu o uoIco 8 uoslanomo novo oIo hajlu o uoIco 4.
Talzo ahyclom zajIslIII, zo huuo moloua feed() v universaldetector.py oliacoval v cInnoslI noz-
vIsIo na lom, jal caslo jo voIna, musImo InIcIaIIzoval self._mLastChar oIom hajlu o nuIovo uoIco
a olom mu:me zuj:||, uIy |u|o rom6nn0 z:|uu oem Iuj|.
self._escDetector.search(self._mLastChar + aBuf):
self._mInputState = eEscAscii
- self._mLastChar = aBuf[-1]
+ self._mLastChar = aBuf[-1:]
1.6. Oiavmo, co 2to3 noumI
350
1.6.7. Iunlco ord() ocolvaIa iolzoc o uoIco 1, aIo hyI naIozon in
Jslo uz unavonI Iz lo mmo sloio lolovo.
C:\home\chardet> python test.py tests\*\*
tests\ascii\howto.diveintomark.org.xml ascii with confidence 1.0
tests\Big5\0804.blogspot.com.xml
Traceback (most recent call last):
File "test.py", line 10, in <module>
u.feed(line)
File "C:\home\chardet\chardet\universaldetector.py", line 116, in feed
if prober.feed(aBuf) == constants.eFoundIt:
File "C:\home\chardet\chardet\charsetgroupprober.py", line 60, in feed
st = prober.feed(aBuf)
File "C:\home\chardet\chardet\utf8prober.py", line 53, in feed
codingState = self._mCodingSM.next_state(c)
File "C:\home\chardet\chardet\codingstatemachine.py", line 43, in next_state
byteCls = self._mModel['classTable'][ord(c)]
TypeError: ord() expected string of length 1, but int found
OK, lalzo c jo lyu int, aIo Iunlco ord() ocolvaIa jounoznalovy iolzoc. No uohi. Kuo jo uoIInovna
iomnn c
# codingstatemachine.py
def next_state(self, c):
# for each byte we get its class
# if it is first byte, we also get byte length
byteCls = self._mModel['classTable'][ord(c)]
To nm noomuzo. Tauy so jon iouv IunlcI. PouIvojmo so lIouhjI uo zsohnIlu.
# utf8prober.py
def feed(self, aBuf):
for c in aBuf:
codingState = self._mCodingSM.next_state(c)
VIuIlo lo V Pyllonu 2 hyIa iomnn aBuf iolzcom, lalzo iomnn c hyIa jounoznalovym iolz-
com. (Ton uoslvmo, luyz Iloiujomo ios iolzoc vsoclny znaly, jouon o uiulom.) AIo lou jo
aBuf oIom hajlu, lalzo c jo lyu int a no jounoznalovy iolzoc. JInymI sIovy, uz nooliohujomo voIal
IunlcI ord(), iolozo c uz jo lyu int!
1.6. Oiavmo, co 2to3 noumI
351
Talzo:
def next_state(self, c):
# for each byte we get its class
# if it is first byte, we also get byte length
- byteCls = self._mModel['classTable'][ord(c)]
+ byteCls = self._mModel['classTable'][c]
VylIounIm ,ord(c) vo vsocl zuiojovycl loxlocl oulaIImo ouohno iohIomy
v sbcharsetprober.py.
# sbcharsetprober.py
def feed(self, aBuf):
if not self._mModel['keepEnglishLetter']:
aBuf = self.filter_without_english_letters(aBuf)
aLen = len(aBuf)
if not aLen:
return self.get_state()
for c in aBuf:
order = self._mModel['charToOrderMap'][ord(c)]
a v latin1prober.py
# latin1prober.py
def feed(self, aBuf):
aBuf = self.filter_with_english_letters(aBuf)
for c in aBuf:
charClass = Latin1_CharToClass[ord(c)]
Piomnn c Iloiujo ios aBuf, coz znamon, zo v nI huuo coIo cIsIo a no jounoznalovy iolzoc. RosonI
jo slojno: ord(c) zmnImo na ioslo c.
# sbcharsetprober.py
def feed(self, aBuf):
if not self._mModel['keepEnglishLetter']:
aBuf = self.filter_without_english_letters(aBuf)
aLen = len(aBuf)
if not aLen:
return self.get_state()
for c in aBuf:
- order = self._mModel['charToOrderMap'][ord(c)]
+ order = self._mModel['charToOrderMap'][c]
1.6. Oiavmo, co 2to3 noumI
352
# latin1prober.py
def feed(self, aBuf):
aBuf = self.filter_with_english_letters(aBuf)
for c in aBuf:
- charClass = Latin1_CharToClass[ord(c)]
+ charClass = Latin1_CharToClass[c]
1.6.8. NousoiualoIno ualovo lyy: int() >= str()
A suslmo lo znovu.
C:\home\chardet> python test.py tests\*\*
tests\ascii\howto.diveintomark.org.xml ascii with confidence 1.0
tests\Big5\0804.blogspot.com.xml
Traceback (most recent call last):
File "test.py", line 10, in <module>
u.feed(line)
File "C:\home\chardet\chardet\universaldetector.py", line 116, in feed
if prober.feed(aBuf) == constants.eFoundIt:
File "C:\home\chardet\chardet\charsetgroupprober.py", line 60, in feed
st = prober.feed(aBuf)
File "C:\home\chardet\chardet\sjisprober.py", line 68, in feed
self._mContextAnalyzer.feed(self._mLastChar[2 - charLen :], charLen)
File "C:\home\chardet\chardet\jpcntx.py", line 145, in feed
order, charLen = self.get_order(aBuf[i:i+2])
File "C:\home\chardet\chardet\jpcntx.py", line 176, in get_order
if ((aStr[0] >= '\x81') and (aStr[0] <= '\x9F')) or \
TypeError: unorderable types: int() >= str()
A co so ujo zaso lauy ,InoiuoiahIo lyos cIII nousoiualoIno lyy (NousoiualoIno vo smysIu,
zo mozI lmIlo lounolamI noIzo uicIl oiauI.) A iozuII mozI hajly a iolzcI znovu vyslilujo svou oslII-
vou lIavu. AIo ouIvojlo so na lou:
class SJISContextAnalysis(JapaneseContextAnalysis):
def get_order(self, aStr):
if not aStr: return -1, 1
# find out current char's byte length
if ((aStr[0] >= '\x81') and (aStr[0] <= '\x9F')) or \
((aStr[0] >= '\xE0') and (aStr[0] <= '\xFC')):
charLen = 2
else:
charLen = 1
1.6. Oiavmo, co 2to3 noumI
353
A ouluu so vzaIa iomnn aStr PouIvojmo so lIouhjI uo zsohnIlu:
def feed(self, aBuf, aLen):
.
.
.
i = self._mNeedToSkipCharNum
while i < aLen:
order, charLen = self.get_order(aBuf[i:i+2])
HoIo, ouIvojmo. To jo ns slaiy iIloI aBuf. Jal uz jslo molII oulaunoul zo vsocl iouclozIcl iohIo-
mu, so lloiymI jsmo so v lolo laIloIo sollaII, aBuf jo oIo hajlu. V lomlo mIsl jo moloua feed() noio-
uv jalo coIol. VylviI z nj vyioz. AIo jal jsmo vIuII v lolo laIloIo o nco uiIvo, vyiozom z oIo hajlu
vznIlno oIo hajlu. Talzo aiamoli aStr, lloiy iohIi moloua get_order(), jo oiu oIo hajlu.
A co so lonlo lou s aStr olousI uIal ZIslv ivnI ivol z oIo hajlu a siovnv joj s jounozna-
lovym iolzcom. V Pyllonu 2 lo IungovaIo, iolozo aStr a aBuf hyIy iolzco a aStr[0] hy hyI laly
iolzoc. I iolzcu muzomo zjIsloval, zua jsou iuzno. AIo v Pyllonu 8 jsou iomnno aStr a aBuf oII
hajlu a aStr[0] jo coIo cIsIo. CIsIo a iolzoc nomuzomo oiovnval na noslouu, anIz jounu z lounol
oxIIcIln noiovouomo na slojny ly.
V lomlo iIau nomusImo lou lomIIloval iIuvnIm oxIIcIlnIlo iovouu lyu. aStr[0] jo coIo cIsIo.
Vso, s cIm lo siovnvmo, jsou lonslanly. Muzomo jo zmnIl z jounoznalovycl iolzcu na cIsIa. A luyz uz
lo uImo, zmmo lalo IuonlIIIlloi aStr na aBuf, iolozo lo vo slulocnoslI nonI iolzoc (sliIng).
class SJISContextAnalysis(JapaneseContextAnalysis):
- def get_order(self, aStr):
- if not aStr: return -1, 1
+ def get_order(self, aBuf):
+ if not aBuf: return -1, 1
# find out current char's byte length
- if ((aStr[0] >= '\x81') and (aStr[0] <= '\x9F')) or \
- ((aBuf[0] >= '\xE0') and (aBuf[0] <= '\xFC')):
+ if ((aBuf[0] >= 0x81) and (aBuf[0] <= 0x9F)) or \
+ ((aBuf[0] >= 0xE0) and (aBuf[0] <= 0xFC)):
charLen = 2
else:
charLen = 1
1.6. Oiavmo, co 2to3 noumI
354
# return its order if it is hiragana
- if len(aStr) > 1:
- if (aStr[0] == '\202') and \
- (aStr[1] >= '\x9F') and \
- (aStr[1] <= '\xF1'):
- return ord(aStr[1]) - 0x9F, charLen
+ if len(aBuf) > 1:
+ if (aBuf[0] == 202) and \
+ (aBuf[1] >= 0x9F) and \
+ (aBuf[1] <= 0xF1):
+ return aBuf[1] - 0x9F, charLen
return -1, charLen
class EUCJPContextAnalysis(JapaneseContextAnalysis):
- def get_order(self, aStr):
- if not aStr: return -1, 1
+ def get_order(self, aBuf):
+ if not aBuf: return -1, 1
# find out current char's byte length
- if (aStr[0] == '\x8E') or \
- ((aStr[0] >= '\xA1') and (aStr[0] <= '\xFE')):
+ if (aBuf[0] == 0x8E) or \
+ ((aBuf[0] >= 0xA1) and (aBuf[0] <= 0xFE)):
charLen = 2
- elif aStr[0] == '\x8F':
+ elif aBuf[0] == 0x8F:
charLen = 3
else:
charLen = 1
# return its order if it is hiragana
- if len(aStr) > 1:
- if (aStr[0] == '\xA4') and \
- (aStr[1] >= '\xA1') and \
- (aStr[1] <= '\xF3'):
- return ord(aStr[1]) - 0xA1, charLen
+ if len(aBuf) > 1:
+ if (aBuf[0] == 0xA4) and \
+ (aBuf[1] >= 0xA1) and \
+ (aBuf[1] <= 0xF3):
+ return aBuf[1] - 0xA1, charLen
return -1, charLen
1.6. Oiavmo, co 2to3 noumI
355
HIounIm vyslylu Iunlco ord() vo zuiojovycl loxlocl ouliyjomo slojny iohIom v chardistrib-
ution.py (lonlioln vo liIucl EUCTWDistributionAnalysis, EUCKRDistributionAnalysis,
GB2312DistributionAnalysis, Big5DistributionAnalysis, SJISDistributionAnalysis
a EUCJPDistributionAnalysis). Vo vsocl iIauocl so oiava ouoh zmnm, lloio jsmo
iovouII v liIucl EUCJPContextAnalysis a SJISContextAnalysis v souhoiu jpcntx.py.
1.6.u. GIohInI jmono 'reduce' nonI uoIInovno
Josl jouna lilIIna.
C:\home\chardet> python test.py tests\*\*
tests\ascii\howto.diveintomark.org.xml ascii with confidence 1.0
tests\Big5\0804.blogspot.com.xml
Traceback (most recent call last):
File "test.py", line 12, in <module>
u.close()
File "C:\home\chardet\chardet\universaldetector.py", line 141, in close
proberConfidence = prober.get_confidence()
File "C:\home\chardet\chardet\latin1prober.py", line 126, in get_confidence
total = reduce(operator.add, self._mFreqCounter)
NameError: global name 'reduce' is not defined
PouIo oIIcIInIlo iuvouco Whut's Now In Pythnn 8.0 hyIa Iunlco reduce() vyala z gIohInIlo
iosloiu jmon a iosunula uo mouuIu functools. CIlujmo z iuvouco: ,Poluu oiavuu oliohujolo
functools.reduce(), ouzIjlo jI. AIo v uu ioconlocl iIauu jo oxIIcIlnI cylIus for cIloInjsI.
O lomlo iozlounulI so uoclolo vIco na vohIogu GuIua van Rossuma: Tho futo nf roduco(} in Pythnn
8000 (Osuu iouuco v Pyllonu 8uuu).
def get_confidence(self):
if self.get_state() == constants.eNotMe:
return 0.01

total = reduce(operator.add, self._mFreqCounter)
Iunlco reduce() iohIi uva aigumonly IunlcI a soznam (iosnjI iocono, muzo lo hyl IIhovoIny
IloiovaloIny ohjoll) a lumuIalIvn aIIlujo zauanou IunlcI na lazuy z ivlu soznamu. JInymI sIo-
vy, juo o oIollnI a noiImy zusoh ioaIIzaco souclu vsocl ivlu soznamu.
Talo ohIuunosl hyIa lal hzn, zo hyIa uo Pyllonu iIuna gIohInI Iunlco sum().
1.6. Oiavmo, co 2to3 noumI
356
def get_confidence(self):
if self.get_state() == constants.eNotMe:
return 0.01

- total = reduce(operator.add, self._mFreqCounter)
+ total = sum(self._mFreqCounter)
Piolozo jsmo ioslaII ouzIval mouuI operator, muzomo lalo zo zacllu souhoiu ouslianIl iIsIusny
iIlaz import.
from .charsetprober import CharSetProber
from . import constants
- import operator
A loz, mozomo lo olosloval
C:\home\chardet> python test.py tests\*\*
tests\ascii\howto.diveintomark.org.xml ascii with confidence 1.0
tests\Big5\0804.blogspot.com.xml Big5 with confidence 0.99
tests\Big5\blog.worren.net.xml Big5 with confidence 0.99
tests\Big5\carbonxiv.blogspot.com.xml Big5 with confidence 0.99
tests\Big5\catshadow.blogspot.com.xml Big5 with confidence 0.99
tests\Big5\coolloud.org.tw.xml Big5 with confidence 0.99
tests\Big5\digitalwall.com.xml Big5 with confidence 0.99
tests\Big5\ebao.us.xml Big5 with confidence 0.99
tests\Big5\fudesign.blogspot.com.xml Big5 with confidence 0.99
tests\Big5\kafkatseng.blogspot.com.xml Big5 with confidence 0.99
tests\Big5\ke207.blogspot.com.xml Big5 with confidence 0.99
tests\Big5\leavesth.blogspot.com.xml Big5 with confidence 0.99
tests\Big5\letterlego.blogspot.com.xml Big5 with confidence 0.99
tests\Big5\linyijen.blogspot.com.xml Big5 with confidence 0.99
tests\Big5\marilynwu.blogspot.com.xml Big5 with confidence 0.99
tests\Big5\myblog.pchome.com.tw.xml Big5 with confidence 0.99
tests\Big5\oui-design.com.xml Big5 with confidence 0.99
tests\Big5\sanwenji.blogspot.com.xml Big5 with confidence 0.99
tests\Big5\sinica.edu.tw.xml Big5 with confidence 0.99
tests\Big5\sylvia1976.blogspot.com.xml Big5 with confidence 0.99
tests\Big5\tlkkuo.blogspot.com.xml Big5 with confidence 0.99
tests\Big5\tw.blog.xubg.com.xml Big5 with confidence 0.99
tests\Big5\unoriginalblog.com.xml Big5 with confidence 0.99
tests\Big5\upsaid.com.xml Big5 with confidence 0.99
tests\Big5\willythecop.blogspot.com.xml Big5 with confidence 0.99
tests\Big5\ytc.blogspot.com.xml Big5 with confidence 0.99
1.6. Oiavmo, co 2to3 noumI
357
tests\EUC-JP\aivy.co.jp.xml EUC-JP with confidence 0.99
tests\EUC-JP\akaname.main.jp.xml EUC-JP with confidence 0.99
tests\EUC-JP\arclamp.jp.xml EUC-JP with confidence 0.99
.
.
.
316 tests
No lo m ouiz, ono lo Iungujo! /me : |ro:Lu zu|untuje.
1.7. SlinulI
Co jsmo so naucIII
1. PioIsovnI jalololoIIv noliIvIInIlo louu z Pyllonu 2 uo Pyllonu 8 huuo hoIoslIvo.
Nou so lo ohojIl. Jo lo ohlIzno.
2. AulomalIcly nslioj 2to3 nm cslocn omuzo, aIo oslai so jon o snaunjsI cslI iojmo-
novnI IunlcI, iojmonovnI mouuIu, iavy synlaxo. Juo o ImozanlnI lus Inzonyislo ico,
aIo lonocloncu juo jon o InloIIgonlnIlo iohola iovujIcIlo vylIouvnI a nliauy.
8. PiohIomom c. 1 iI ioIsovnI lolo lnIlovny hyI iozuII mozI iolzcI a hajly. V lomlo iIau
so lo zu hyl ziojmo, iolozo lIavnIm coIom lnIlovny chardet jo iovou iouuu hajlu na iol-
zoc. AIo ,s iouuom hajlu so sollvmo casljI, noz hyslo sI mysIoII. Clolo souhoi v ,hIninIm
iozImu Doslvlo iouu hajlu. ZIslvlo ohsal vohovslo slinly VoIlo vohovo aIIlacnI
iozlianI Talo so viacI iouu hajlu.
4. Piogiamu musIlo iozuml vy. Sliz nasliz. PiouovsIm iolozo jslo lo nasaII, aIo musIlo so
vyiovnal so vsomI jolo liIly a zaluclIymI louly. Clyhy jsou vsuuo.
. ToslovacI iIauy jsou noosliaualoIno. Poluu jo nomlo, nIc noioIsujlo. ]edny uuvou, ioc
viIm lomu, zo chardet Iungujo v Pyllonu 8, socIv v lom, zo jsom zacaI s loslovacI sauou,
lloi ioviovaIa vsoclny lIavnI cosly, luuy so lou uhIi. Poluu zuno losly nomlo, naIslo
jo uiIvo, noz zacnolo ionos uo Pyllonu 8 ioaIIzoval. Poluu mlo jon i loslu, naIslo jIcl vIc.
Poluu mlo loun loslu, al loivo muzo zacIl oiavuov Iogiaco.
1.7. SlinulI
358
359
16. Balen pythonovskch
knihoven
16. KaIloIa
Youll find the shame is like the pain;
you only feel it once.
(ZjIslIlo, zo sluu jo jalo hoIosl;
aIo cIlIlo lo jon jounou.)
Mailyza uo MoilouII, Dungerou: Lu:on:
/NeIezetn6 zn0mo:|)
360
Ohsal laIloIy
16. Balen pythonovskch knihoven 359
16.1. Ponoimo so 361
16.2. VcI, lloio za ns DIslulIIs nouuIajI 362
16.8. Sliulluia auiosio 363
16.4. PIsomo svuj InslaIacnI sliIl 364
16.. PiIuvmo lIasIIIlacI nasolo haIIclu 366
16..1. PiIlIauy uohiycl lIasIIIlloiu haIIclu 367
16.6. IiconI uaIsIcl souhoiu
iosliounIclvIm manIIoslu 368
16.7. KonlioIa clyh v nasom InslaIacnIm sliIlu 369
16.8. VylvoionI uIsliIhuco ohsalujIcI
zuiojovo loxly 369
16.u. VylvoionI giaIIclolo InslaIacnIlo iogiamu 371
16.u.1. Tvoiha InslaIacnIcl haIIclu
io jIno ooiacnI syslomy 373
16.1u. PiIunI nasolo soIlvaiu
uo Pyllon Paclago Inuox 373
16.11. VIco moznycl huuoucnoslI
haIonI yllonovslycl iouullu 375
16.12. Piocllo sI 375
361
16.1. Ponoimo so
OiavuovI umIcI iouvajI. AIoso lallIo lo iIl Slovo Johs. Clcolo vyual yllonovsly sliIl,
lnIlovnu, imoc (Iiamovoil) noho aIIlacI Vyhoin. Svl oliohujo vIco yllonovslolo louu.
Pyllon 8 so uouv s imcom io vylvionI haIIclu zvanym DIslulIIs. DIslulIIs v soh sliyv mnolo
vcI: nslioj io soslavonI (huIIu looI; io vs), InslaIacnI nslioj (io vaso uzIvaloIo), Ioiml molaual
haIIclu (io vylIouvaco) a uaIsI. TvoiI coIol s Pythnn Puckugo Indox (,PyPI), coz jo conliInI aiclIv
yllonovslycl oon-souico lnIlovon.
Vsoclny uvouono slinly nsliojo DIslulIIs jsou sousliouny loIom n:|uutnho :Lr|u, lloiy so liauIcn
nazyv setup.py. Vo slulocnoslI uz jslo v lolo lnIzo nloIIl InslaIacnIcl sliIlu vylvoionycl nsliojom
DIslulIIs vIuII. DIslulIIs jslo ouzIII l InslaIacI httplib2 v laIloIo Wohovo sIuzhy nau HTTP a znovu
l InslaIacI chardet v PiIauovo sluuII: PioIs chardet io Pyllon 8.
V lolo laIloIo sI iosluuujomo, jal InslaIacnI sliIly io chardet a io httplib2 iacujI, a iojuomo
sI iocosom vyunI vasolo vIaslnIlo yllonovslolo soIlvaiu.
# chardet's setup.py
from distutils.core import setup
setup(
name = "chardet",
packages = ["chardet"],
version = "1.0.2",
description = "Universal encoding detector",
author = "Mark Pilgrim",
author_email = "mark@diveintomark.org",
url = "http://chardet.feedparser.org/",
download_url = "http://chardet.feedparser.org/download/python3-chardet-1.0.1.tgz",
keywords = ["encoding", "i18n", "xml"],
classifiers = [
"Programming Language :: Python",
"Programming Language :: Python :: 3",
"Development Status :: 4 - Beta",
"Environment :: Other Environment",
"Intended Audience :: Developers",
"License :: OSI Approved :: GNU Library or Lesser General Public License (LGPL)",
"Operating System :: OS Independent",
"Topic :: Software Development :: Libraries :: Python Modules",
"Topic :: Text Processing :: Linguistic",
],
long_description = """\
Universal character encoding detector
16.1. Ponoimo so
Ka.
Ka.
362
-------------------------------------
Detects
- ASCII, UTF-8, UTF-16 (2 variants), UTF-32 (4 variants)
- Big5, GB2312, EUC-TW, HZ-GB-2312, ISO-2022-CN (Traditional and Simplified Chinese)
- EUC-JP, SHIFT_JIS, ISO-2022-JP (Japanese)
- EUC-KR, ISO-2022-KR (Korean)
- KOI8-R, MacCyrillic, IBM855, IBM866, ISO-8859-5, windows-1251 (Cyrillic)
- ISO-8859-2, windows-1250 (Hungarian)
- ISO-8859-5, windows-1251 (Bulgarian)
- windows-1252 (English)
- ISO-8859-7, windows-1253 (Greek)
- ISO-8859-8, windows-1255 (Visual and Logical Hebrew)
- TIS-620 (Thai)
This version requires Python 3 or later; a Python 2 version is available separately.
"""
)
> chardet a httplib2 jsou oon souico, aIo nooxIslujo zuny ozauavol na lo, ahyslo svo vIaslnI
yllonovslo lnIlovny vyuvaII ou njalou lonliolnI IIconcI. Piocos oIsovany v lolo laI-
loIo huuo Iungoval io IIhovoIny yllonovsly soIlvaio, nozvIsIo na IIconcI.
16.2. VcI, lloio za ns DIslulIIs nouuIajI
VyuslnI vasolo ivnIlo yllonovslolo haIIclu jo slIIcujIcI iocos. (IvoInnI vasolo uiulolo
haIIclu jo o nco snazsI.) DIslulIIs so coIy iocos snazI zaulomalIzoval, jal jon lo jo mozno. AIo nlloio
vcI iosl musIlo uuIal samI.
- Vybrut liconci. TolIo jo lomIIlovano loma, zalIzono oIIlIlou a iIzIlom. Poluu svuj soIlvaio
clcolo zvoiojnIl jalo oon souico, sliomn uooiucujI l nsIouujIcIcl iau:
1. NoIslo svou vIaslnI IIconcI.
2. NoIslo svou vIaslnI IIconcI.
8. NoIslo svou vIaslnI IIconcI.
4. NomusI lo hyl ziovna gI, aIo mIa hy hyl s GPL sIucIloIn.
. NoIslo svou vIaslnI IIconcI.
- Zurudto sv| snftwuro omocI lIasIIIlacnIlo syslomu PyPI. PozujI v lolo laIloIo vysvlIIm,
co lo znamon.
- Nupisto snubnr ,roud mo" (cti mno}. TolIo noouIIlnlo. VasI uzIvaloIo hy so z nj mII
uozvul iInojmonsIm lo, co vs soIlvaio uI a jal so InslaIujo.
16.2. VcI, lloio za ns DIslulIIs
nouuIajI
363
16.8. Sliulluia auiosio
VylvionI haIIclu io vs yllonovsly soIlvaio zacIn lIm, zo sI musIlo uuIal oiuol v souhoiocl
a v auiosiIcl. Auiosi httplib2 vyau lallo:
httplib2/ }1]
|
+--README.txt }2]
|
+--setup.py }8]
|
+--httplib2/ }4]
|
+--__init__.py
|
+--iri2uri.py
}1] Vylvoilo loionovy auiosi, vo lloiom huuo vsoclno. Dojlo mu slojno jmono, jalo m vs yllo-
novsly mouuI.
}2] Ahyslo so iIzusohIII uzIvaloIum WInuovs, mI hy vs souhoi ,ioau mo ouzIl iIonu .txt
a mI hy ouzIval vInuovsovslo lonco iulu. To, zo vy ouzIvlo njaly IanlaslIcly ouIloi,
lloiy so u sousll z iIlazovolo iulu a m I svuj malio jazyl, noznamon, zo hyslo mII
zlzoval zIvol svym uzIvaloIum. (VasI uzIvaloIo ouzIvajI ,Noloau, cosly ,Poznmlovy
hIol. Jo lo smulno, aIo jo lo lal.) Vs ohIIhony ouIloi m nooclyhn voIhu io ulIunI
souhoiu s vInuovsovslymI loncI iulu I luyz iacujolo v LInuxu noho s Mac OS X.
}8] Vs InslaIacnI sliIl vyuzIvajIcI DIslulIIs hy mI hyl ojmonovn setup.py oluu nomlo
uohiy uuvou io lo, ahy so jmonovaI jInal. A vy nomlo uohiy uuvou, ahy so jmonovaI jInal.
}4] Poluu so vs yllonovsly soIlvaio slIu z jouInolo souhoiu s iIonou .py, mII hyslo joj
umIslIl uo loionovolo auiosio soIu so svym souhoiom ,ioau mo a so svym InslaIacnIm
sliIlom. AIo httplib2 so noslIu z jouInolo .py souhoiu. Jo lo vIcosouhoiovy mouuI. AIo
lo jo v oiulu! Auiosi httplib2 umIsllo uo loionovolo auiosio, lalzo huuolo mIl souhoi
__init__.py umIsln v auiosiI httplib2/ v loionovom auiosiI httplib2/. NolIouojlo v lom
iohIom. Vo slulocnoslI lo zjounouusI iocos vylvionI haIIclu.
Auiosi chardet vyau lioclu jInal. Slojn jalo u httplib2 juo o vIcosouhoiovy mouuI, lalzo lu
mmo auiosi chardet/ uvnIli loionovolo auiosio chardet/. K souhoiu README.txt m chardet
navIc HTML uolumonlacI, umIslnou v auiosiI docs/. Auiosi docs/ ohsalujo nloIIl souhoiu s iIo-
namI .html a .css a ouauiosi images/, lloiy ohsalujo nloIIl souhoiu s iIonamI .png a .gif.
(To huuo uuIozIlo ozujI.) V souIauu s lonvoncomI io soIlvaio s IIconcI (L)GPL ohsalujo lalo samo-
slalny souhoi zvany COPYING.txt, lloiy ohsalujo lomIolnI loxl LGPL.
16.8. Sliulluia auiosio
364
chardet/
|
+--COPYING.txt
|
+--setup.py
|
+--README.txt
|
+--docs/
| |
| +--index.html
| |
| +--usage.html
| |
| +--images/ ...
|
+--chardet/
|
+--__init__.py
|
+--big5freq.py
|
+--...
16.4. PIsomo svuj InslaIacnI sliIl
InslaIacnI sliIl io DIslulIIs jo yllonovsly sliIl. TooiolIcly hy molI uIal vso, co Izo uIal
v yllonovslycl sliIlocl. PiallIcly hy lolo mI uIal co nojmon a co nojslanuaiunjsIm zusohom.
InslaIacnI sliIl hy mI hyl nuuny. CIm oxolIcljsI huuo vs InslaIacnI iocos, lIm oxolIcljsI huuou
lIsonI o clyhcl.
PivnI iuol lazuolo InslaIacnIlo sliIlu io DIslulIIs jo vzuycly slojny:
from distutils.core import setup
Imoilujomo IunlcI setup(), lloi jo lIavnIm vslunIm houom imco DIslulIIs. u vsocl uIslulII-
sovslycl sliIlu so slIu z jouInolo voInI Iunlco setup() a z nIcolo jInolo. (TulIo slalIslIlu
jsom sI iv vymysIoI, aIo oluu vs uIslulIIsovsly sliIl uI nco vIc noz voInI Iunlco setup()
z DIslulIIs, mII hyslo io lo mIl uohiy uuvou. A mlo io lo uohiy uuvou MysIIm, zo no.)
Iunlco setup() iohIi coIou iauu aiamoliu. V zjmu zaclovnI uusovnIlo zuiavI vsocl zcasln-
nycl musIlo io lazuy aiamoli ouzIval ojmonovano aigumonly. NonI lo jon njal lonvonco.
16.4. PIsomo svuj InslaIacnI sliIl
365
Jo lo lviuy ozauavol. Poluu so olusIlo o voInI Iunlco setup() s noojmonovanymI aigumonly,
vs InslaIacnI sliIl zlavaiujo.
NsIouujIcI ojmonovano aigumoly jsou ovInno:
- numo jmono haIIclu.
- vorsinn voizo haIIclu.
- uuthnr vaso coIo jmono.
- uuthnr_omuil vaso o-maIIov auiosa.
- url uomcI slinla vasolo iojollu. Poluu io iojoll nomlo vyliazon zvIslnI vohovy
soivoi, muzolo zuo uvosl slinlu svolo haIIclu v PyPI.
AcloIIv lo nonI ovInno, uooiucujI, ahyslo vo svom InslaIacnIm sliIlu uvouII lalo nsIouujIcI:
- doscriptinn, jounoiulovy oIs iojollu.
- lnng_doscriptinn, vIcoiulovy iolzoc vo Ioimlu ioSliucluiouToxl. PyPI lo iovouo
uo HTML a zohiazI lo na slinco io vs haIIcol.
- clussifiors, soznam zvIslnIm zusohom Ioimlovanycl iolzcu, lloio sI oIsomo
v nsIouujIcI oulaIloIo.
> Molauala InslaIacnIlo sliIlu jsou uoIInovna v PEP 814.
Tou so ouIvmo na InslaIacnI sliIl io chardet. PouzIv vsoclny zmInno ovInno a uooiucono
aiamoliy a josl jouon, o lloiom jsom so zalIm nozmInII: packages.
from distutils.core import setup
setup(
name = 'chardet',
packages = ['chardet'],
version = '1.0.2',
description = 'Universal encoding detector',
author='Mark Pilgrim',
...
)
Paiamoli packages zvyiazujo jouno noslaslno ioliyvnI vyznamu sIov hlom uIsliIhucnIlo iocosu.
O sIov ,haIIcollhaIIl (aclago) jsmo so havIII jalo o ncom, co vylviImo (a co so oloncIIn vyIsujo
v soznamu PyPI). Jonzo lo nonI lIm, na co so aiamoli packages oulazujo. Vzlalujo so lo slulocnoslI,
zo chardet jo vIcosouhoiovym mouuIom, lloiomu so lalo nluy iIl. ,aclago (haIIcol). Paiamoli
packages nsliojI DIslulIIs iIl, ahy uo iocosu zalinuI auiosi chardet/, jolo souhoi __init__.py
a vsoclny oslalnI souhoiy s iIonou .py, zo lloiycl so mouuI chardet slIu. To jo uocoIa uuIozIlo.
Vosloi iauosln ioziava o uolumonlacI a molaualocl jo l nIcomu, oluu zaomonolo iIhaIIl
slulocny lou!
16.4. PIsomo svuj InslaIacnI sliIl
366
16.. PiIuvmo lIasIIIlacI nasolo haIIclu
Tlo Pyllon Paclago Inuox (,PyPI) ohsalujo lIsIco yllonovslycl lnIlovon. OslalnI IIuo najuou vs
haIIcol snaunjI, luyz ouzIjolo sivn lIasIIIlacnI molauala. PyPI vm umoznI iolIIzol haIIcly
usoiuano ouIo lIasIIIlloiu. Pio zzonI nahIuly iI vylIouvnI muzolo vyhial uolonco vIco lIasI-
IIlloiu. KIasIIIlloiy iosl nojsou jon novIuIloIn molauala, lloi hyslo molII Ignoioval!
KIasIIIlacI svolo soIlvaiu iovouolo iounIm aiamoliu classifiers uIslulIIovslo IunlcI setup().
Paiamoli classifiers m ouohu soznamu iolzcu. AIo lylo iolzco nemuj voIny Ioiml. Vsoclny
lIasIIIlacnI iolzco hy mIy oclzol z lololo soznamu na PyPI.
KIasIIIlloiy jsou noovInno. Muzolo nasal uIslulIIovsly InslaIacnI sliIl hoz jalyclloIIv lIasIIIllo-
iu. Nodlo|to tn. MII hyslo vzuy uvosl aIoso nsIouujIcI lIasIIIlloiy:
- Prngrumming Lunguugo (iogiamovacI jazyl). Konlioln hy mI zalinoval jal "Programming
Language :: Python", lal "Programming Language :: Python :: 3". Poluu jo nouvouolo, nohuuo
so vs haIIcol ulazoval v lomlo soznamu lnIlovon lomalIhIInIcl s Pyllonom 8, na lloiy so
uoslanolo ios oulaz uvouony v hocnIm sIoulu na lazuo slinco z pypi.python.org.
- Liconso (IIconco). Poluu zlousIm njalou lnIlovnu liolI sliany, je |o uI:ou|n6 rvn v6t,
nu L|erou :e dv0m. Noclljlo o mn, ahycl lulo zIvoln uuIozIlou InIoimacI musoI nluo lIoual.
Poluu so vs soIlvaio nououv ou vIco IIconcomI, nouvujlo vIc noz jouon IIconcnI lIasIIIl-
loi. (A oluu l lomu nojslo njal nuconI, novyuvojlo svuj soIlvaio ou vIco IIconcomI.
A nonullo l lomu oslalnI IIuI. LIconcovnI slacI l hoIonI lIavy uz I lal. NouIojlo lo josl loisI.)
- Oporuting Systom (ooiacnI syslom). Poluu vs soIlvaio hzI ouzo ou WInuovs (noho jon
ou Mac OS X noho jon ou LInuxom), iu hycl so lo uozvuI iaujI uiIv noz ozujI. Poluu
vs soIlvaio hzI luoloIIv, anIz hy oliohovaI njaly IalIoimov zvIsIy lou, ouzIjlo lIasI-
IIlloi "Operating System :: OS Independent". PouzIlI vIco lIasIIIlloiu Operating System jo
nozhylno ouzo v iIau, luy vs soIlvaio vyzauujo io lazuou IalIoimu socIIIclou ouo-
iu. (Bzn lomu lal nohyv.)
DooiucujI, ahyslo uvouII I nsIouujIcI lIasIIIlloiy:
- Dovolnpmont Stutus (slav vyvojo). Lzo lvaIIlu vasolo soIlvaiu olounolIl iIvIasllom hola
AIIa Noho so naclzI josl v ianjsIm slauIu (io-aIla) Jounu z moznoslI uvoulo. Buulo
uiImnI.
- Intondod Audionco (zamysIon sluIna uzIvaloIu). Kuo hy molI cllIl slaloval vs soIlvaio
NojouzIvanjsI voIhy jsou Developers (vyvojiI), End Users/Desktop (loncovI uzIvaloIo),
Science/Research (vua a vyzlum), anu System Administrators (sivcI syslomu).
- Frumownrk (imoc). Poluu Izo vs soIlvaio ovazoval za zsuvny mouuI (IugIn) io vlsI
yllonovslo imco, jalo jsou naiIlIau Django noho Zoo, uvoulo iIsIusny lIasIIIlloi
Framework. Poluu lomu lal nonI, nouvujlo joj.
- Tnpic (lomalIcl ohIasl). Zuo naIoznolo voIlo mnozslvI ohIaslI, zo lloiycl sI muzolo vyhial.
Ivoulo vsoclny, lloio vasomu soIlvaiu ouovIuajI.
16.. PiIuvmo lIasIIIlacI
nasolo haIIclu
367
16..1. PiIlIauy uohiycl lIasIIIlloiu haIIclu
Jalo iIlIau uvoumo lIasIIIlloiy io Django, coz jo muIlIIalIoimnI aIIlacnI imoc (Iiamovoil),
lloiy muzolo sousll na svom vohovom soivoiu. Douv so ou IIconcI BSD a jo vyuzIloIny io osliy
iovoz (iouuclIon-ioauy). (Django zalIm nonI lomalIhIInI s Pyllonom 8, lalzo nonI uvouon lIasIII-
lloi Programming Language :: Python :: 3.)
Programming Language :: Python
License :: OSI Approved :: BSD License
Operating System :: OS Independent
Development Status :: 5 - Production/Stable
Environment :: Web Environment
Framework :: Django
Intended Audience :: Developers
Topic :: Internet :: WWW/HTTP
Topic :: Internet :: WWW/HTTP :: Dynamic Content
Topic :: Internet :: WWW/HTTP :: WSGI
Topic :: Software Development :: Libraries :: Python Modules
Tauy jsou lIasIIIlloiy io chardet, coz jo lnIlovna io uololcI znalovolo louovnI, lloiou jsmo so
zahyvaII v PiIauovo sluuII: PioIs chardet io Pyllon 8. chardet jo vo slauIu hola, jo muIlIIalIoim-
nI, lomalIhIInI s Pyllonom 8, ou IIconcI LGPL a jo uicona io vyvojio, lloiI jI molou zacIonIl
uo svycl vIaslnIcl iouullu.
Programming Language :: Python
Programming Language :: Python :: 3
License :: OSI Approved :: GNU Library or Lesser General Public License (LGPL)
Operating System :: OS Independent
Development Status :: 4 - Beta
Environment :: Other Environment
Intended Audience :: Developers
Topic :: Text Processing :: Linguistic
Topic :: Software Development :: Libraries :: Python Modules
A lauy jsou lIasIIIlloiy io httplib2, coz jo lnIlovna, o lloio jsmo so havIII v laIloIo Wohovo sIuz-
hy nau HTTP. httplib2 jo vo slauIu hola, muIlIIalIoimnI, ou IIconcI MIT a jo ucona io yllonovslo
vyvojio.
16.. PiIuvmo lIasIIIlacI
nasolo haIIclu
Ka.
Ka.
368
Programming Language :: Python
Programming Language :: Python :: 3
License :: OSI Approved :: MIT License
Operating System :: OS Independent
Development Status :: 4 - Beta
Environment :: Web Environment
Intended Audience :: Developers
Topic :: Internet :: WWW/HTTP
Topic :: Software Development :: Libraries :: Python Modules
16.6. IiconI uaIsIcl souhoiu iosliounIclvIm manIIoslu
Poluu nouicImo jInal, zalinou DIslulIIs uo vasolo InslaIacnIlo haIIclu nsIouujIcI souhoiy:
- README.TXT
- setup.py
- Souhoiy s iIonou .y, lloio so ouzIvajI vo vIcosouhoiovycl mouuIocl uvouonycl
v soznamu aiamoliu packages.
- JounolIIvo souhoiy s iIonou .py, lloio jsou uvouony v soznamu aiamoliu py_modules.
TImlo zusohom Izo oliyl vsoclny souhoiy iojollu httplib2. AIo u iojollu claiuol oliohujomo
zaiauIl I IIconcnI souhoi COPYING.txt a coIy auiosi docs/, lloiy ohsalujo ohizly a HTML souhoiy.
Poluu clcomo DIslulIIs iIcI, ahy hyIy iI lvoih InslaIacnIlo haIIclu chardet zaiazony I lylo uoualoc-
no souhoiy a auiosio, musImo ouzIl :ouIor : mun[e:|em (manIIosl IIIo).
Souhoi s manIIoslom jo loxlovy souhoi s nzvom MANIFEST.in. ImIslImo joj uo loionovolo auiosio
iojollu, vouIo souhoiu README.txt a setup.py. Souhoiy s manIIoslom nej:ou yllonovslo sliIly.
Jsou lo loxlovo souhoiy, lloio ohsalujI osIounoslI ,iIlazu vo Ioimlu io DIslulIIs. PiIlazy manI-
Ioslu nm umozujI zalinoval noho vyiazoval lonliolnI souhoiy a auiosio.
NsIouujo coIy ohsal souhoiu manIIoslu io iojoll chardet:
include COPYING.txt }1]
recursive-include docs *.html *.css *.png *.gif }2]
}1] PivnI iuol jo samovysvlIujIcI: vIozIl souhoi COPYING.txt z loionovolo auiosio iojollu.
}2] Diuly iuol jo lioclu sIozIljsI. PiIlaz recursive-include iohIi jmono auiosio a jouno
noho vIc jmon souhoiu. Jmona souhoiu nomusI hyl uvouona oxIIcIln. Molou hyl vyjuiona
zslunymI znaly (vIIucaius). Tonlo iuol znamon: ,VIuIs auiosi docs/ v loionovom auios-
iI iojollu NajuI v nm (ioluizIvn) souhoiy s iIonamI .html, .css, .png a .gif. ClcI, ahy
hyIy vsoclny zaiazony uo InslaIacnIlo haIIclu.
16.6. IiconI uaIsIcl souhoiu
iosliounIclvIm manIIoslu
369
Vsoclny iIlazy manIIoslu zaclovvajI sliulluiu auiosiu, lloi jo vylvoiona v loionovom auiosiI
iojollu. Ivouony iIlaz recursive-include nonaco vsoclny .html a .png souhoiy uo loionovolo
auiosio InslaIacnIlo haIIclu. DouizI oxIslujIcI sliulluiu auiosio docs/, aIo zaiauI uo nI jon ly souhoiy,
lloio ouovIuajI zauanym maslm so zslunymI znaly. (DiIvo jsom so o lom nozmIovaI, aIo uolumon-
laco chardet jo vo slulocnoslI nasan v XML a uo HTML jo iovouona samoslalnym sliIlom. Do InslaIac-
nIlo haIIclu noclcI zaiazoval zuiojovo XML souhoiy, aIo jon vysIouno HTML souhoiy a ohizly.)
> Souhoiy s manIIoslom majI svuj socIIIcly Ioiml. DolaIIy lIouojlo v uolumonlocl Spocifying
tho filos tn distributo a Tho munifost tompluto cnmmunds.
Zoalujmo sI lo: souhoi s manIIoslom musImo vylviol jon v iIau, luy clcomo zalinoul I souhoiy,
lloio nslioj DIslulIIs novlIu aulomalIcly. Poluu oliohujomo ouzIl souhoi s manIIoslom, mI hy
ohsaloval jon jmona souhoiu, lloi hy jInal nslioj DIslulIIs nonasoI sm.
16.7. KonlioIa clyh v nasom InslaIacnIm sliIlu
MusImo mysIol na souslu vcI. DIslulIIs majI zahuuovany vaIIuacnI iIlaz, lloiy lonlioIujo, zo ns
InslaIacnI sliIl ohsalujo vsoclna ovInn molauala. Poluu naiIlIau zaomonomo uvosl aiamoli
version, DIslulIIs nm lo iIomonou.
c:\Users\pilgrim\chardet> c:\python31\python.exe setup.py check
running check
warning: check: missing required meta-data: version
JalmIIo aiamoli version uvouomo (a vsoclny oslalnI ovInno cslI molaual), iIlaz check uoauno
lallo:
c:\Users\pilgrim\chardet> c:\python31\python.exe setup.py check
running check
16.8. VylvoionI uIsliIhuco ohsalujIcI zuiojovo loxly
DIslulIIs ouoiujI lvoihu mnola lyu uIsliIhucnIcl haIIclu. PiInojmonsIm hyclom mII vylvoiIl
,uIsliIhucI zuioju (souico uIsliIhulIon), lloi ohsalujo naso zuiojovo loxly s louom, InslaIacnI sliIl
io DIslulIIs, souhoi ,ioau mo a jaloloIIv uaIsI souhoiy, lloio clcomo uo uIsliIhuco zalinoul. DIsliI-
hucI zuioju vylvoiImo lIm, zo InslaIacnImu sliIlu DIslulIIs zaumo iIlaz sdist.
c:\Users\pilgrim\chardet> c:\python31\python.exe setup.py sdist
running sdist
running check
reading manifest template 'MANIFEST.in'
16.7. KonlioIa clyh v nasom InslaIacnIm sliIlu
16.8. VylvoionI uIsliIhuco ohsalujIcI
zuiojovo loxly
370
writing manifest file 'MANIFEST'
creating chardet-1.0.2
creating chardet-1.0.2\chardet
creating chardet-1.0.2\docs
creating chardet-1.0.2\docs\images
copying files to chardet-1.0.2...
copying COPYING -> chardet-1.0.2
copying README.txt -> chardet-1.0.2
copying setup.py -> chardet-1.0.2
copying chardet\__init__.py -> chardet-1.0.2\chardet
copying chardet\big5freq.py -> chardet-1.0.2\chardet
...
copying chardet\universaldetector.py -> chardet-1.0.2\chardet
copying chardet\utf8prober.py -> chardet-1.0.2\chardet
copying docs\faq.html -> chardet-1.0.2\docs
copying docs\history.html -> chardet-1.0.2\docs
copying docs\how-it-works.html -> chardet-1.0.2\docs
copying docs\index.html -> chardet-1.0.2\docs
copying docs\license.html -> chardet-1.0.2\docs
copying docs\supported-encodings.html -> chardet-1.0.2\docs
copying docs\usage.html -> chardet-1.0.2\docs
copying docs\images\caution.png -> chardet-1.0.2\docs\images
copying docs\images\important.png -> chardet-1.0.2\docs\images
copying docs\images\note.png -> chardet-1.0.2\docs\images
copying docs\images\permalink.gif -> chardet-1.0.2\docs\images
copying docs\images\tip.png -> chardet-1.0.2\docs\images
copying docs\images\warning.png -> chardet-1.0.2\docs\images
creating dist
creating 'dist\chardet-1.0.2.zip' and adding 'chardet-1.0.2' to it
adding 'chardet-1.0.2\COPYING'
adding 'chardet-1.0.2\PKG-INFO'
adding 'chardet-1.0.2\README.txt'
adding 'chardet-1.0.2\setup.py'
adding 'chardet-1.0.2\chardet\big5freq.py'
adding 'chardet-1.0.2\chardet\big5prober.py'
...
adding 'chardet-1.0.2\chardet\universaldetector.py'
adding 'chardet-1.0.2\chardet\utf8prober.py'
adding 'chardet-1.0.2\chardet\__init__.py'
adding 'chardet-1.0.2\docs\faq.html'
adding 'chardet-1.0.2\docs\history.html'
adding 'chardet-1.0.2\docs\how-it-works.html'
adding 'chardet-1.0.2\docs\index.html'
16.8. VylvoionI uIsliIhuco ohsalujIcI
zuiojovo loxly
371
adding 'chardet-1.0.2\docs\license.html'
adding 'chardet-1.0.2\docs\supported-encodings.html'
adding 'chardet-1.0.2\docs\usage.html'
adding 'chardet-1.0.2\docs\images\caution.png'
adding 'chardet-1.0.2\docs\images\important.png'
adding 'chardet-1.0.2\docs\images\note.png'
adding 'chardet-1.0.2\docs\images\permalink.gif'
adding 'chardet-1.0.2\docs\images\tip.png'
adding 'chardet-1.0.2\docs\images\warning.png'
removing 'chardet-1.0.2' (and everything under it)
Tauy hyclom so mII zmInIl o nloIIla vcocl:
- DIslulIIs sI vsImIy souhoiu s manIIoslom (MANIFEST.in).
- DIslulIIs souhoi s manIIoslom ssn ziacovaIy a iIuaIy iouosano souhoiy COPYING.txt
a HTML souhoiy a souhoiy s ohizly v auiosiI docs/.
- Poluu so ouIvmo uo auiosio iojollu, uvIuImo, zo DIslulIIs vylvoiIIy auiosi dist/.
V auiosiI dist/ so naclzI souhoi s iIonou .zip, lloiy muzomo uIsliIhuoval.
c:\Users\pilgrim\chardet> dir dist
Volume in drive C has no label.
Volume Serial Number is DED5-B4F8
Directory of c:\Users\pilgrim\chardet\dist
07/30/2009 06:29 PM <DIR> .
07/30/2009 06:29 PM <DIR> ..
07/30/2009 06:29 PM 206,440 chardet-1.0.2.zip
1 File(s) 206,440 bytes
2 Dir(s) 61,424,635,904 bytes free
16.u. VylvoionI giaIIclolo InslaIacnIlo iogiamu
PouIo molo nzoiu sI lazu yllonovsl lnIlovna zasIouzI, ahy hyI io uzIvaloIo WInuovs l uIso-
zIcI giaIIcly InslaIacnI iogiam. D so uuIal snauno (I luyz samI WInuovs noouzIvlo) a uzIvaloIo
WInuovs lo oconI.
DIslulIIs uovouou vylvoiIl giaIIcly InslaIacnI iogiam io WInuovs za ns. SlacI, luyz InslaIacnImu
sliIlu io DIslulIIs zaumo iIlaz bdist_wininst.
16.u. VylvoionI giaIIclolo
InslaIacnIlo iogiamu
372
c:\Users\pilgrim\chardet> c:\python31\python.exe setup.py bdist_wininst
running bdist_wininst
running build
running build_py
creating build
creating build\lib
creating build\lib\chardet
copying chardet\big5freq.py -> build\lib\chardet
copying chardet\big5prober.py -> build\lib\chardet
...
copying chardet\universaldetector.py -> build\lib\chardet
copying chardet\utf8prober.py -> build\lib\chardet
copying chardet\__init__.py -> build\lib\chardet
installing to build\bdist.win32\wininst
running install_lib
creating build\bdist.win32
creating build\bdist.win32\wininst
creating build\bdist.win32\wininst\PURELIB
creating build\bdist.win32\wininst\PURELIB\chardet
copying build\lib\chardet\big5freq.py -> build\bdist.win32\wininst\PURELIB\chardet
copying build\lib\chardet\big5prober.py -> build\bdist.win32\wininst\PURELIB\chardet
...
copying build\lib\chardet\universaldetector.py -> build\bdist.win32\wininst\PURELIB\chardet
copying build\lib\chardet\utf8prober.py -> build\bdist.win32\wininst\PURELIB\chardet
copying build\lib\chardet\__init__.py -> build\bdist.win32\wininst\PURELIB\chardet
running install_egg_info
Writing build\bdist.win32\wininst\PURELIB\chardet-1.0.2-py3.1.egg-info
creating 'c:\users\pilgrim\appdata\local\temp\tmp2f4h7e.zip' and adding '.' to it
adding 'PURELIB\chardet-1.0.2-py3.1.egg-info'
adding 'PURELIB\chardet\big5freq.py'
adding 'PURELIB\chardet\big5prober.py'
...
adding 'PURELIB\chardet\universaldetector.py'
adding 'PURELIB\chardet\utf8prober.py'
adding 'PURELIB\chardet\__init__.py'
removing 'build\bdist.win32\wininst' (and everything under it)
c:\Users\pilgrim\chardet> dir dist
c:\Users\pilgrim\chardet>dir dist
Volume in drive C has no label.
Volume Serial Number is AADE-E29F
Directory of c:\Users\pilgrim\chardet\dist
16.u. VylvoionI giaIIclolo
InslaIacnIlo iogiamu
373
07/30/2009 10:14 PM <DIR> .
07/30/2009 10:14 PM <DIR> ..
07/30/2009 10:14 PM 371,236 chardet-1.0.2.win32.exe
07/30/2009 06:29 PM 206,440 chardet-1.0.2.zip
2 File(s) 577,676 bytes
2 Dir(s) 61,424,070,656 bytes free
16.u.1. Tvoiha InslaIacnIcl haIIclu io jIno ooiacnI syslomy
DIslulIIs nm molou omocI vylvoiIl InslaIacnI haIIcly io uzIvaloIo LInuxu. AIo ouIo molo nzoiu
lo noslojI za lu nmalu. Poluu clcolo svuj soIlvaio uIsliIhuoval v LInuxu, mII hyslo svuj cas iaujI
vnoval soIuicI so sluInou IIuI, lloiI so socIaIIzujI na vylvionI soIlvaiovycl haIIclu io lIavnI
uIsliIhuco LInuxu.
NaiIlIau mojI lnIlovnu chardet najuolo v aiclIvocl io DohIan GNIlLInux (a lIm uom I v aiclI-
vocl io Ihunlu). NomusoI jsom so o lo vuhoc slaial. BaIIcly so lam jounolo uno iosl ohjovIIy. Ko-
munIla loIom uIsliIhuco DohIan m sv vIaslnI iavIuIa io haIonI yllonovslycl lnIlovon a haIIcol
python-chardet io DohIan jo navizon lal, ahy lylo lonvonco sIovaI. A iolozo jsou haIIcly umIsl-
ny v aiclIvocl DohIanu, zIslvajI uzIvaloIo DohIanu hozocnoslnI alluaIIzaco alnoho novo voizo ouIo
lolo, jal syslomov naslavonI sI io uizhu svycl ocIlacu zvoIIII.
LInuxovslo haIIcly vylviono nsliojom DIslulIIs zunou z lcllo vylou nonahIzojI. Buuo IosI, luyz
svuj cas slivIlo jInym zusohom.
16.1u. PiIunI nasolo soIlvaiu uo Pyllon Paclago Inuox
NalinI nasolo soIlvaiu uo Pyllon Paclago Inuox iouslavujo iocos o liocl liocIcl.
1. ZaiogIsliujomo so.
2. ZaiogIsliujomo svuj soIlvaio.
8. IIozImo (uIoau) haIIcly, lloio jsmo vylvoiIII iIlazy setup.py sdist a setup.py bdist_*.
RogIsliacI svo osohy iovouomo iosliounIclvIm iogIsliacnI slinly io uzIvaloIo PyPI. VIozImo svo
uzIvaloIslo jmono a losIo, oslylnomo Ialnou o-maIIovou auiosu a lIIlnomo na lIacIllo Register.
(Poluu mlo lIIc PGP noho GPG, muzolo joj uvosl lalo. Poluu joj nomlo noho novIlo, co lo znamon,
nouIojlo sI s lIm slaioslI.) ZlonlioIujomo svuj o-maII. Blom nloIIla mInul hyclom mII ohuizol
zivu ou PyPI s olvizovacIm oulazom. RogIsliacnI iocos uoloncImo lIm, zo na oulaz lIIlnomo.
Tou zaiogIsliujomo u PyPI ns soIlvaio a naliajomo joj (uIoau). To vso muzomo iovosl v jouInom liolu.
16.1u. PiIunI nasolo soIlvaiu
uo aPyllon Paclago Inuox
374
c:\Users\pilgrim\chardet> c:\python31\python.exe setup.py register sdist bdist_wininst upload }1]
running register
We need to know who you are, so please choose either:
1. use your existing login,
2. register as a new user,
3. have the server generate a new password for you (and email it to you), or
4. quit
Your selection [default 1]: 1 }2]
Username: MarkPilgrim }8]
Password:
Registering chardet to http://pypi.python.org/pypi }4]
Server response (200): OK
running sdist }]
... vstup pro strunost vyputn ...
running bdist_wininst }6]
... vstup pro strunost vyputn ...
running upload }7]
Submitting dist\chardet-1.0.2.zip to http://pypi.python.org/pypi
Server response (200): OK
Submitting dist\chardet-1.0.2.win32.exe to http://pypi.python.org/pypi
Server response (200): OK
I can store your PyPI login so future submissions will be faster.
(the login will be stored in c:\home\.pypirc)
Save your login (y/N)?n }8]
}1] Kuyz svuj iojoll zvoiojnImo oivo, iIuajI DIslulIIs ns soIlvaio uo Pyllon Paclago Inuox
a iIuII mu jolo vIaslnI URL. PiI uaIsIcl iIsluocl jounouuso alluaIIzujI molauala iojollu
ouIo zmn, lloio uvouomo v aiamoliocl nasolo setup.py. Polo so vylvoiI uIsliIhuco
zuioju (souico uIsliIhulIon; sdist) a InslaIloi io WInuovs (bdist_wininst) a naliajI so
uo PyPI (upload).
}2] Vyhoiomo ,uso youi oxIslIng IogIn (ouzIj svuj oxIslujIcI col) nasnIm 1, noho iosl
slIslnomo ENTER.
}8] NaIsomo uzIvaloIslo jmono a losIo, lloi jsmo sI zvoIIII na iogIsliacnI slinco PyPI. DIslulIIs
nooIsujI zauvano losIo. MIslo zauvanycl znalu novyIsujI anI lvzuIcly. Piosl naIsomo
losIo a slIslnomo ENTER.
}4] DIslulIIs zaiogIsliujI ns haIIcol v aiclIvu Pyllon Paclago Inuox.
}] .vylvoiI uIsliIhucI nasIcl zuioju (souico uIsliIhulIon).
}6] .vylvoiI InslaIloi io WInuovs.
}7] .a naliajI (uIoau) oha uo Pyllon Paclago Inuox.
}8] Poluu clcomo iocos zvoiojovnI novycl voizI zaulomalIzoval, musImo uIozIl osohnI uajo
io PyPI uo IolInIlo souhoiu. Jo lo zcoIa iolI zsaum hozocnoslI a zcoIa noovInno.
16.1u. PiIunI nasolo soIlvaiu
uo Pyllon Paclago Inuox
375
GialuIujI. Tou uz mlo svojI vIaslnI slinlu na Pyllon Paclago Inuox!
JojI auiosa jo http://pypi.python.org/pypi/JMENO, luo JMENO jo iolzoc, lloiy jslo iouaII aiamoliom
name vo svom souhoiu setup.py.
Poluu clcomo zvoiojnIl novou voizI, uiavImo vo svom souhoiu setup.py cIsIo voizo a suslImo
iocos nalivnI (uIoau) znovu:
c:\Users\pilgrim\chardet> c:\python31\python.exe setup.py register sdist bdist_wininst upload
16.11. VIco moznycl huuoucnoslI haIonI yllonovslycl iouullu
DIslulIIs nojsou jouInym nsliojom io vylvionI yllonovslycl haIIclu, aIo v uoh sanI lololo loxlu
(sion 2uuu) lo hyI jouIny imoc io vylvionI InslaIacnIcl haIIclu, lloiy IungovaI v Pyllonu 8. Pio
Pyllon 2 oxIslujo iaua uaIsIcl imcu. Nlloio so sousliouI na InslaIacI, jIno na loslovnI a uIsliIhucI
(uoIoymonl). Nlloio z nIcl mozn huuou iosny io Pyllon 8.
NsIouujIcI imco (Iiamovoils) jsou zamiony na InslaIacI:
- Sotuptnnls
- Pip
- Distributo
NsIouujIcI so zamiujI na loslovnI a uIsliIhucI:
- virtualenv
- zc.buildout
- Puvor
- Fubric
- py2exe
16.12. Piocllo sI
O DIslulIIs:
- Distributing Pythnn Mndulos with Distutils
(lll:lluocs.yllon.oigly8lluIslulIIsl)
- Cnro Distutils functinnulity uvuI vsoclny mozno aigumonly Iunlco setup()
(lll:lluocs.yllon.oigly8lluIslulIIslaIioI.llmI)
- Distutils Cnnkbnnk
(lll:llvIlI.yllon.oiglmoInlDIslulIIslCoolhool)
16.11. VIco moznycl huuoucnoslI haIonI
yllonovslycl iouullu
16.12. Piocllo sI
376
- PEP 870: Por usor site-packages diroctnry
(vvv.yllon.oigluovloslo-u87ul)
- PEP 870 und "onvirnnmont stow
(lll:lljossonoIIoi.coml2uuulu7l1ulo-87u-oi-usoi-sIlo-aclagos-anu-onvIionmonl-slovl)
O oslalnIcl imcIcl io vylvionI haIIclu:
- Tho Pythnn puckuging ocnsystom
(lll:llgious.googIo.comlgioulujango-uovoIooislmsgl4u7cuh4uu172u)
- On puckuging
(vvv.h-IIsl.oiglvohIogl2uu8luocl14laclagIngl)
- A fow cnrroctinns tn "On puckuging
(lll:llhIog.IanhIclIng.oigl2uu8l12l14la-Iov-coiioclIons-lo-on-aclagIngl)
- Why I liko Pip
(vvv.h-IIsl.oiglvohIogl2uu8luocl1lIl)
- Pythnn puckuging: u fow nbsorvutinns
(lll:llcouinao.voiuioss.coml2uuulu4lu1lyllon-aclagIng-a-Iov-ohsoivalIons-cahaI-Ioi-a-soIulIonl)
- Nnbndy oxpocts Pythnn puckuging!
(lll:lljacohIan.oiglviIlInglnohouy-oxocls-yllon-aclagIngl)
16.12. Piocllo sI
377
A. Pepis kdu do Pythonu 3
s vyuitm 2to3
A. PiIIola
Life is pleasant. Death is peaceful.
Its the transition thats troublesome.
(ZIvol jo zhavny. Smil jo lIIun.
NoiIjomny jo lon ioclou.)
Isaac AsImov (iIsno)
378
Ohsal iIIoly
A. Pepis kdu do Pythonu 3
s vyuitm 2to3 377
A.1. Ponoimo so 379
A.2. PiIlaz print 379
A.8. LIloiIy InIcouo iolzcu 380
A.4. GIohInI Iunlco unicode() 380
A.. Dalovy ly long 380
A.6. PoiovnnI <> 381
A.7. SIovnIlov moloua has_key() 381
A.8. SIovnIlovo molouy, lloio viacojI
soznamy 382
A.u. MouuIy, lloio hyIy iojmonovny
noho iooiganIzovny 383
A.u.1. http 383
A.u.2. urllib 384
A.u.8. dbm 385
A.u.4. xmlrpc 385
A.u.. OslalnI mouuIy 386
A.1u. RoIalIvnI Imoily uvnIli haIIclu 387
A.11. Moloua Iloiloiu next() 388
A.12. GIohInI Iunlco filter() 388
A.18. GIohInI Iunlco map() 389
A.14. GIohInI Iunlco reduce() 390
A.1. GIohInI Iunlco apply() 390
A.16. GIohInI Iunlco intern() 390
A.17. PiIlaz exec 391
A.18. PiIlaz execfile 391
A.1u. repr IIloiIy (zlno aoslioIy) 392
A.2u. PiIlaz try...except 392
A.21. PiIlaz raise 393
A.22. Moloua gonoiloiu throw 393
A.28. GIohInI Iunlco xrange() 394
A.24. GIohInI Iunlco raw_input()
a input() 395
A.2. AliIhuly IunlcI func_* 395
A.26. Moloua xreadlines() VlV ohjollu 396
A.27. lambda Iunlco, lloio alcolujI
n-lIcI mIslo vIco aiamoliu 396
A.28. AliIhuly socIInIcl molou 397
A.2u. SocIInI moloua __nonzero__ 397
A.8u. OllaIovo IIloiIy 398
A.81. sys.maxint 398
A.82. GIohInI Iunlco callable() 399
A.88. GIohInI Iunlco zip() 399
A.84. VyjImla StandardError 399
A.8. Konslanly mouuIu types 400
A.86. GIohInI Iunlco isinstance() 400
A.87. Dalovy ly basestring 401
A.88. itertools mouuIo 401
A.8u. sys.exc_type, sys.exc_value,
sys.exc_traceback 401
A.4u. Gonoiloiy soznamu nau n-lIcomI 402
A.41. Iunlco os.getcwdu() 402
A.42. MolaliIuy 402
A.48. VcI lylajIcI so slyIu 403
A.48.1. MnozInovo IIloiIy (set(); oxIIcIln) 403
A.48.2. GIohInI Iunlco buffer() (oxIIcIln) 403
A.48.8. BIIo znaly loIom ciol (oxIIcIln) 404
A.48.4. Bzno ohialy (oxIIcIln) 404
379
A.1. Ponoimo so
MozI Pyllonom 2 a Pyllonom 8 so lolo zmnIIo loIIl, zo najuolo jon mIzIvo ioconlo iogiamu, lloio
hoz iav hzI v ohou voizIcl. AIo noioauojlo zouIaIslvI! K usnaunnI ioclouu so Pyllon 8 uouv
s omocnym sliIlom nazvanym 2to3. Kuyz mu ioulo svuj zuiojovy souhoi nasany io Pyllon 2 jalo
vslu, iovouo aulomalIcly uo ouohy io Pyllon 8 vso, co uovouo. PiIauov sluuIo: PioIs chardet
io Pyllon 8 oIsujo, jal so sliIl 2to3 souslI. Ilazujo lalo vcI, lloio so aulomalIcly nooiavI.
V lolo iIIozo najuolo uolumonlacI lolo, co uovouo oiavIl aulomalIcly.
A.2. PiIlaz print
V Pyllonu 2 hyI print iIlazom. Poluu jsmo coloIIv cllII vylIslnoul, jounouuso jsmo lo iIsaII
za lIIcovo sIovo print. V Pyllonu 8 jo print() IunlcI. Poluu clcomo coloIIv vylIslnoul, ioumo
lo IunlcI print() slojn jalo lazuo jIno IunlcI.
Poznmky Python 2 Python 3
}1] print print()
}2] print 1 print(1)
}8] print 1, 2 print(1, 2)
}4] print 1, 2, print(1, 2, end=' ')
}] print >>sys.stderr, 1, 2, 3 print(1, 2, 3, file=sys.stderr)
}1] Pizuny iuol vylIslnomo voInIm print() hoz zaunI aigumonlu.
}2] Jounu lounolu vylIslnomo voInIm print() s jounIm aigumonlom.
}8] Dv lounoly ouuIono mozoiou vylIslnomo voInIm print() s uvma aigumonly.
}4] V lomlIo jo maI IInla. Poluu jsmo v Pyllonu 2 uloncIII iIlaz print cilou, vylIslIy so lounoly
ouuIono mozoiou, al so vylIslIa josl jouna loncov mozoia a lIsl sloncII hoz gonoiovnI ioclo-
uu na novy iuol. (Z loclnIclolo lIouIsla jo lo o nco lomIIlovanjsI. PiIlaz print v Pyllonu 2
ouzIvaI nynI jIz nozuoucI (uoiocalou) aliIhul zvany softspace. MIslo slulocnolo lIslu mozoiy
naslavII Pyllon 2 sys.stdout.softspace na 1. Znal mozoiy vo slulocnoslI nohyI vylIsln, uoluu
so nomIo na slojny iuol lIslnoul nco uaIsIlo. Poluu uaIsI iIlaz print lIslI ioclou na novy
iuol, hyI aliIhul sys.stdout.softspace naslavon na 0 a mozoia so nIluy novylIslIa. Tololo iozuI-
Iu hyslo sI iavuouohn nIluy novsImII, oluu hy vaso aIIlaco nohyIa cIlIIv na iIlomnosl
noho noiIlomnosl loncovycl hIIycl znalu vo vysluu, lloiy hyI vygonoiovn iIlazom print.)
V Pyllonu 8 uoslnomo slojnolo oIollu lIm, zo IunlcI print() ioumo ojmonovany aigumonl
s lounolou end=' '. VyclozI lounolou aigumonlu end jo '\n' (ioclou na novy iuol), lalzo
o vylIslnulI oslalnIcl aigumonlu jolo iosnIm olIacImo ioclou na novy iuol.
}] V Pyllonu 2 jsmo molII vyslu iosmioval uo iouiy (Io) naiIlIau na sys.stderr
uvouonIm zIsu >>jmno_roury. V Pyllonu 8 uoslnomo slojnolo oIollu iounIm oulazu
na iouiu ojmonovanym aigumonlom file. VyclozI lounolou aigumonlu file jo sys.stdout
(slanuaiunI vyslu), lalzo iosnIm lolo lounoly uoslnomo iosmiovnI uo jIno iouiy.
A.1. Ponoimo so
A.2. PiIlaz print
Ka.
380
A.8. LIloiIy InIcouo iolzcu
Pyllon 2 iacovaI s uvma lyy iolzcu: s InIcouo iolzcI a s no-InIcouo iolzcI. Pyllon 8 ouoiujo
jouIny iolzcovy ly: InIcouo iolzco.
Poznmky Python 2 Python 3
}1] u'PapayaWhip' 'PapayaWhip'
}2] ur'PapayaWhip\foo' r'PapayaWhip\foo'
}1] Rolzcovo IIloiIy s ioIIxom InIcouo jsou jounouuso iovouony na ohycojno iolzcovo IIloiIy,
lloio v Pyllonu 8 vzuy vyjauiujI InIcouo iolzco.
}2] Suiovo InIcouo iolzco (iav; vo lloiycl Pyllon noiovuI InloiiolacI zlnolo IomIlla jalo
zaljonI oscao osIounoslI) jsou iovouony na suiovo iolzco. V Pyllonu 8 jsou suiovo iolz-
co vzuy v InIcouo.
A.4. GIohInI Iunlco unicode()
V Pyllonu 2 so io iovou ohjollu na iolzoc ouzIvaIy uv gIohInI Iunlco: unicode() io iovou
na InIcouo iolzco a str() io iovou na no-InIcouo iolzco. Pyllon 8 m jouIny iolzcovy ly,
InIcouo iolzco, lalzo vso, co oliohujomo, jo Iunlco str(). (Iunlco unicode() uz nooxIslujo.)
Poznmky Python 2 Python 3
unicode(cokoliv) str(cokoliv)
A.. Dalovy ly long
Pyllon 2 ouzIvaI io coI cIsIa uva ualovo lyy: int a long. Hounola lyu int nomolIa hyl vlsI noz
lonslanla sys.maxint, lloi hyIa zvIsI na IalIoim. ,DIoul cIsIa hyIa uoIInovna iIunIm L
na lonoc cIsIa a molIa nahyval vlsIcl lounol noz cIsIa lyu int. V Pyllonu 8 jo jon jouon coIocIsoI-
ny ly, lloiy so jmonujo int a vlsInou so clov jalo ly long v Pyllonu 2. Piolozo uz nooxIslujI uva
lyy, nomusI so ouzIval socIInI synlaxo io jojIcl iozIIsonI.
Piocllo sI:
PEP Z87: Unifying Lnng Intogors und Intogors.
(vvv.yllon.oigluovloslo-u287l)
A.8. LIloiIy InIcouo iolzcu
A.4. GIohInI Iunlco unicode()
A.. Dalovy ly long
381
Poznmky Python 2 Python 3
}1] x = 1000000000000L x = 1000000000000
}2] x = 0xFFFFFFFFFFFFL x = 0xFFFFFFFFFFFF
}8] long(x) int(x)
}4] type(x) is long type(x) is int
}] isinstance(x, long) isinstance(x, int)
}1] Z uosIllovycl cIsoInycl IIloiIu io ,uIouly Inlogoi (Iong) so slaIy uosIllovo IIloiIy
io ly Inlogoi.
}2] Z soslncllovycl cIsoInycl IIloiIu io ,uIouly Inlogoi (Iong) so slaIy soslncllovo
IIloiIy io ly Inlogoi.
}8] V Pyllonu 8 ioslaIa oxIsloval uvounI Iunlco long(), iolozo ioslaI oxIsloval ly Iong
(uIouly Inlogoi). K iovouu iomnno na coIo cIsIo ouzIjomo IunlcI int().
}4] Poluu clcomo zlonlioIoval, zua jo iomnn lyu Inlogoi, zjIslImo jojI ly a oiovnvmo
lo s int (nIloIIv s long).
}] Ko lonlioIo ualovolo lyu muzomo ouzIl I IunlcI isinstance(). PiI zjIslovnI, zua juo
o coIocIsoIny ly, so ol oulzomo na int a no na long.
A.6. PoiovnnI <>
Pyllon 2 ouoiovaI ooiloi <> jalo synonymum io != (oiovnnI na iuznosl). Pyllon 8 ouoiujo
ouzo ooiloi != a ioslaI ouoioval <>.
Poznmky Python 2 Python 3
}1] if x <> y: if x != y:
}2] if x <> y <> z: if x != y != z:
}1] Jounouuclo oiovnnI.
}2] SIozIljsI oiovnnI mozI liomI lounolamI.
A.7. SIovnIlov moloua has_key()
V Pyllonu 2 ouzIvaIy sIovnIly molouu has_key() (uosIova ,m lIIc) io loslovnI, zua so
vo sIovnIlu naclzI zauany lIIc. V Pyllonu 8 lalo moloua ioslaIa oxIsloval. MIslo nI musImo
ouzIval ooiloi in.
A.6. PoiovnnI <>
A.7. SIovnIlov moloua has_key()
382
Poznmky Python 2 Python 3
}1] a_dictionary.has_key('PapayaWhip') 'PapayaWhip' in a_dictionary
}2] a_dictionary.has_key(x) or x in a_dictionary or y in a_dictionary
a_dictionary.has_key(y)
}8] a_dictionary.has_key(x or y) (x or y) in a_dictionary
}4] a_dictionary.has_key(x + y) (x + y) in a_dictionary
}] x + a_dictionary.has_key(y) x + (y in a_dictionary)
}1] NojjounouussI Ioima.
}2] Ooiloi in m vyssI iIoiIlu noz ooiloi or, lalzo ouvyiazy x in a_dictionary
a y in a_dictionary nomusImo uzavIial uo zvoiol.
}8] AIo na uiulou slianu zuo zo slojnolo uuvouu mu:me uzaviIl uo zvoiol x or y In m vyssI
iIoiIlu noz or. (Poznmla: Tonlo lou so ou iouclozIlo iulu zcoIa IIsI. Pyllon Inloiiolujo
nojuiIvo x or y. VysIoulom jo huu x (oluu so x Inloiiolujo v hooIoovslom lonloxlu jalo
liuo), noho y. Polom io vysIounou lounolu lonlioIujo, zua so vo sIovnIlu a_dictionary vy-
slylujo jalo lIIc.)
}4] Ooiloi + m vyssI iIoiIlu noz ooiloi in. Z loclnIclolo lIouIsla hy lonlo zIs nomusoI
ouzIval zvoily loIom x + y, aIo 2to3 jo slojn iIuv.
}] I lololo zIsu musI hyl loIom y in a_dictionary zvoily uicIl uvouony, iolozo ooiloi +
m vyssI iIoiIlu noz ooiloi in.
A.8. SIovnIlovo molouy, lloio viacojI soznamy
V Pyllonu 2 mnolo sIovnIlovo molouy viacoIy soznamy. MozI nojouzIvanjsI molouy aliIIy keys(),
items() a values(). V Pyllonu 8 vsoclny lylo molouy viacojI uynamIclo olIouy (vIov). V nllo-
iycl sIluacIcl lo nocInI zuny iohIom. Poluu jo nvialov lounola lcllo molou Ilnou iouna jIno
IunlcI, lloi Iloiujo ios coIou osIounosl, huuo jouno, zua jo slulocnym lyom soznam noho olIou
(vIov). V jInom lonloxlu lo aIo muzo mIl voIly vIIv. Poluu ocolvmo lomIolnI soznam s jounolIIv
auiosovaloInymI ivly, ns lou so zalucl, iolozo olIouy noouoiujI InuoxovnI (lj. ziIsluo-
vnI ivlu ios Inuox).
Poznmky Python 2 Python 3
}1] a_dictionary.keys() list(a_dictionary.keys())
}2] a_dictionary.items() list(a_dictionary.items())
}8] a_dictionary.iterkeys() iter(a_dictionary.keys())
}4] [i for i in a_dictionary.iterkeys()] [i for i in a_dictionary.keys()]
}] min(a_dictionary.keys()) 20dn0 zm6nu
}1] SliIl 2to3 so iIlInI l hozocnomu iosonI. VoInIm Iunlco list() iovuI lounolu viaco-
nou molouou keys() na slalIcly soznam. Buuo lo Iungoval vzuycly, aIo nluy lo huuo mon
A.8. SIovnIlovo molouy, lloio
viacojI soznamy
383
oIollIvnI noz ouzIlI olIouu (vIov). Piovouony lou hyslo sI mII iolIounoul a zvzIl, zua
jo slalIcly soznam nozhyln nulny, noho zua hy noslacII olIou.
}2] DaIsI lonvoizo olIouu na soznam lonlolil u molouy items(). Slojnou vc iovouo 2to3
s molouou values().
}8] Pyllon 8 uz noouoiujo molouu iterkeys(). PouzIjlo keys(), a oluu jo lo nozhylno, uuIojlo
z olIouu Iloiloi voInIm Iunlco iter().
}4] 2to3 ozn, luyz jo moloua iterkeys() ouzIla uvnIli gonoiloiovo nolaco soznamu. Piovouo
jI na molouu keys() (noohaIujo jI josl jounIm voInIm iter()). Iungujo lo, iolozo ios olIo-
uy (vIov) Izo Iloioval.
}] 2to3 ozn iIau, luy jo moloua keys() iouna IunlcI, lloi Iloiujo coIou osIounoslI.
V lalovom iIau so nvialov lounola nomusI lonvoiloval na soznam. Iunlco min() huuo
vosoIo Iloioval I ios olIou. Tyl so lo IunlcI min(), max(), sum(), list(), tuple(), set(),
sorted(), any() a all().
A.u. MouuIy, lloio hyIy iojmonovny noho iooiganIzovny
NloIIl mouuIu slanuaiunI yllonovslo lnIlovny hyIo iojmonovno. NloIIl vzjomn souvIsojI-
cIcl mouuIu hyIo sojono uoliomauy noho hyIo iooiganIzovno lal, ahy hyIy jojIcl vzlaly IogIcljsI.
A.u.1. http
V Pyllonu 8 hyIo nloIIl mouuIu souvIsojIcIcl s HTTP sojono uo jounolo haIIlu nazvanolo http.
Poznmky Python 2 Python 3
}1] import httplib import http.client
}2] import Cookie import http.cookies
}8] import cookielib import http.cookiejar
}4] import BaseHTTPServer import http.server
import SimpleHTTPServer
import CGIHttpServer
}1] MouuI http.client ImIomonlujo nIzloiovovou lnIlovnu, lloi vylviI ozauavly
na HTTP zuiojo a Inloiiolujo souvIsojIcI HTTP ouovuI.
}2] MouuI http.cookies oslylujo yllonovslo iozlianI io coolIos iolIIzoco, lloio so osIIajI
v HTTP lIavIcco HTTP lIavIcla.
}8] MouuI HTTP.COOKIEJAR manIuIujo so souhoiy na uIslu, lloio ohIIhono vohovo iolIIzoco
ouzIvajI l ulIunI coolIos.
}4] MouuI http.server ImIomonlujo jounouucly HTTP soivoi.
A.u. MouuIy, lloio hyIy iojmonovny
noho iooiganIzovny
384
A.u.2. urllib
Pyllon 2 ohsalovaI zml ioliyvajIcIcl so mouuIu io iozlIau (aiso) a louovnI URL a io zIslvnI
iIsIusnolo ohsalu. V Pyllonu 8 hyIy mouuIy ioIalloiIzovny a sIoucony uo jounolo haIIlu urllib.
Poznmky Python 2 Python 3
}1] import urllib import urllib.request, urllib.parse, urllib.error
}2] import urllib2 import urllib.request, urllib.error
}8] import urlparse import urllib.parse
}4] import robotparser import urllib.robotparser
}] from urllib import FancyURLopener from urllib.request import FancyURLopener
from urllib import urlencode from urllib.parse import urlencode
}6] from urllib2 import Request from urllib.request import Request
from urllib2 import HTTPError from urllib.error import HTTPError
}1] Slaiy mouuI urllib v Pyllonu 2 ohsalovaI iauu IunlcI vcoln urlopen() io nacIlnI ual
a splittype(), splithost() a splituser() io iozlIau URL na ouslalno cslI. IvnIli novolo
haIIlu urllib hyIy lylo Iunlco IogIcljI iooiganIzovny. SliIl 2to3 lalo zmnI vsoclna
voInI lcllo IunlcI, ahy zolIounII novo scloma ojmonovnI.
}2] PuvounI mouuI urllib2 z Pyllonu 2 hyI v Pyllonu 8 vIozon uo haIIclu urllib. Vsoclny
ohIIhono vcI z urllib2 moloua build_opener(), liIuy Request a HTTPBasicAuthHandler
a souvIsojIcI vcI jsou slIo l uIsozIcI.
}8] MouuI urllib.parse z Pyllonu 8 ohsalujo vsoclny Iunlco z uvounIlo mouuIu urlparse
z Pyllonu 2.
}4] MouuI urllib.robotparser ziacovv souhoiy robots.txt.
}] TiIua FancyURLopener, lloi ohsIulujo HTTP iosmiovnI a uaIsI slavovo louy, jo v novom
mouuIu urllib.request slIo l uIsozIcI. Iunlco urlencode() so iosunuIa uo urllib.parse.
}6] TiIua Request jo v urllib.request slIo l uIsozIcI, aIo lonslanly jalo HTTPError hyIy iosu-
nuly uo urllib.error.
ZmInII jsom so o lom, zo 2to3 ioIso lalo voInI vasIcl IunlcI Poluu naiIlIau v louu io Pyllon 2
Imoilujolo mouuI urllib a zIslvlo uala voInIm urllib.urlopen(), sliIl 2to3 oiavI jal iIlaz
Imoil, lal voInI Iunlco.
Python 2 Python 3
import urllib import urllib.request, urllib.parse, urllib.error
print urllib.urlopen print(urllib.request.urlopen('http://diveintopython3.
('http://diveintopython3.org/').read() org/').read())
A.u. MouuIy, lloio hyIy iojmonovny
noho iooiganIzovny
385
A.u.8. dbm
Vsoclny lIony DBM so nynI naclzojI jouInom haIIlu dbm. Poluu oliohujomo ouzIl njalou socIIIc-
lou vaiIanlu, jalo naiIlIau GNU DBM, muzomo Imoiloval iIsIusny mouuI z haIIlu uhm.
Python 2 Python 3
import dbm import dbm.ndbm
import gdbm import dbm.gnu
import dbhash import dbm.bsd
import dumbdbm import dbm.dumb
import anydbm import dbm
import whichdb
A.u.4. xmlrpc
XML-RPC jo ouIolcon (IIgllvoIgll) moloua io iovunI RPC (vzuIono voInI iocouui) ios HTTP.
KIIonlsl lnIlovna io XML-RPC a nloIIl ImIomonlacI XML-RPC soivoiu jsou nynI zlomhInovny
uo jounolo haIIclu xmlrpc.
Python 2 Python 3
import xmlrpclib import xmlrpc.client
import DocXMLRPCServer import xmlrpc.server
import SimpleXMLRPCServer
A.u. MouuIy, lloio hyIy iojmonovny
noho iooiganIzovny
386
A.u.. OslalnI mouuIy
Poznmky Python 2 Python 3
}1] try: import io
import cStringIO as StringIO
except ImportError:
import StringIO
}2] try: import pickle
import cPickle as pickle
except ImportError:
import pickle
}8] import __builtin__ import builtins
}4] import copy_reg import copyreg
}] import Queue import queue
}6] import SocketServer import socketserver
}7] import ConfigParser import configparser
}8] import repr import reprlib
}u] import commands import subprocess
}1] MozI hzno ohialy v Pyllonu 2 aliII olus o import cStringIO as StringIO. Poluu ooiaco
soIlaIa, iovouI so mIslo lolo iIlaz import StringIO. V Pyllonu 8 uz lo nouIojlo. MouuI
io lo uuI za vs. NaIozno nojiyclIojsI uoslunou ImIomonlacI a ouzIjo jI aulomalIcly.
}2] Pouohny ohial so ouzIvaI io ImoilovnI nojiyclIojsI ImIomonlaco pickle. V Pyllonu 8
uz lo nouIojlo. MouuI pickle lo uuI za vs.
}8] MouuI builtins ohsalujo gIohInI Iunlco, liIuy a lonslanly, lloio so ouzIvajI naiIc coIym
jazylom Pyllon. RouoIInIcI Iunlco v mouuIu builtins iovouolo iouoIInIcI gIohInI Iunlco
In vsuuo. Jo lo iosn lal mocno a usIvo, jal lo znI.
MouuI copyreg iIuv ouoiu ,IlIonI io uzIvaloIslo lyy uoIInovano v C.
MouuI queue ImIomonlujo Iionlu io vIco iouuconlu a vIco lonzumonlu.
MouuI socketserver oslylujo ohocno (gonoiIclo) hzovo liIuy io ImIomonlacI iuznycl
uiulu sololovycl soivoiu.
MouuI configparser ziacovv lonIIguiacnI souhoiy vo slyIu INI.
MouuI reprlib ioImIomonlujo zahuuovanou IunlcI repr() s iIuanym ovIunIm. Lzo iouo-
sal, jal uIoulo molou ioiozonlaco hyl, noz uojuo l jojIcl oioznI.
MouuI subprocess umozujo vylviol iocosy, iIojoval so l jojIcl iouim (Io) a zIslval
jojIcl nvialovo louy.
A.u. MouuIy, lloio hyIy iojmonovny
noho iooiganIzovny
387
A.1u. RoIalIvnI Imoily uvnIli haIIclu
BaIIcol jo sluIna souvIsojIcIcl mouuIu, lloio so ouzIvajI jalo coIol. Poluu so v Pyllonu 2 mouuIy
uvnIli haIIclu oliohovaIy oulazoval jouon na uiuly, ouzIvaII jsmo iIlaz import foo noho from
foo import Bar. V Pyllonu 2 Inloiiol lIouaI foo.py nojuiIvo uvnIli alluInIlo haIIclu a loivo o-
lom iolIouvaI oslalnI auiosio z yllonovslo vylIouvacI cosly (sys.path). Pyllon 8 Iungujo lioslu
jInal. MIslo iolIouvnI alluInIlo haIIclu zacno iImo yllonovslou vylIouvacI coslou. Poluu
clcomo, ahy jouon mouuI uvnIli haIIclu ImoilovaI jIny mouuI zo slojnolo haIIclu, musImo oxIIcIln
zaual ioIalIvnI coslu mozI uvouonymI mouuIy.
Dojmo lomu, zo hyclom mII nsIouujIcI haIIcol s vIco souhoiy vo slojnom auiosiI:
chardet/
|
+--__init__.py
|
+--constants.py
|
+--mbcharsetprober.py
|
+--universaldetector.py
Tou iouolIuojmo, zo universaldetector.py oliohujo Imoiloval coIy souhoi constants.py
a jounu liIuu z mbcharsetprober.py. Jal lo vIasln uuImo
Poznmky Python 2 Python 3
}1] import constants from . import constants
}2] from mbcharsetprober import from .mbcharsetprober import
MultiByteCharSetProber MultiByteCharsetProbei
}1] Poluu oliohujomo Imoiloval coIy mouuI ounluu z nasolo haIIclu, ouzIjomo novou synlaxI
from . import. Tocla vo slulocnoslI oznacujo ioIalIvnI coslu ou lololo souhoiu
(universaldetector.py)
l souhoiu, lloiy clcomo Imoiloval (constants.py). V lomlo iIau so naclzojI vo slojnom
auiosiI, lalzo ouzIjomo jounu loclu. Imoiloval muzomo I z iouIcovslolo auiosio
(from .. import jinymodul) noho z ouauiosio.
}2] Poluu clcomo Imoiloval uicIlou liIuu noho IunlcI z jInolo mouuIu iImo uo iosloiu jmon naso-
lo mouuIu, iIumo l cIIovomu mouuIu jalo ioIIx ioIalIvnI coslu hoz loncovolo IomIlla. V lomlo
iIau so mbcharsetprober.py naclzI vo slojnom auiosiI jalo universaldetector.py, lalzo
coslu vyjuiImo jounou loclou. Imoiloval muzomo I z iouIcovslolo auiosio (from ..jinymodul
import JinaTrida) noho z ouauiosio.
A.1u. RoIalIvnI Imoily uvnIli haIIclu
388
A.11. Moloua Iloiloiu next()
V Pyllonu 2 mIy Iloiloiy molouu next(), lloi viacoIa uaIsI oIozlu z osIounoslI. V Pyllonu 8
lo slIo IalI, aIo mmo l uIsozIcI lalo gIohInI IunlcI next(), lloi iohIi Iloiloi jalo aigumonl.
Poznmky Python 2 Python 3
}1] anIterator.next() next(anIterator)
}2] funkce_ktera_vraci_iterator().next() next(funkce_ktera_vraci_iterator())
}8] class A: class A:
def next(self): def __next__(self):
pass pass
}4] class A: 20dn0 zm6nu
def next(self, x, y):
pass
}] next = 42 next = 42
for an_iterator in a_sequence_of_iterators: for an_iterator in a_sequence_of_iterators:
an_iterator.next() an_iterator.__next__()
}1] V nojjounouussIm iIau nynI mIslo voInI molouy Iloiloiu next() iouvmo Iloiloi
gIohInI IunlcI next().
}2] Poluu mmo IunlcI, lloi viacI Iloiloi, zavoImo jI a vysIouol ioumo IunlcI next().
(SliIl 2to3 jo uosl clyliy na lo, ahy lo iovouI sivn.)
}8] Poluu uoIInujomo svou vIaslnI liIuu a mInImo jI ouzIl jalo Iloiloi, uoIInujomo socIInI
molouu __next__().
}4] Poluu uoIInujomo svou vIaslnI liIuu a la slouou oloInoslI ohsalujo molouu ojmonovanou
next(), lloi iohIi jouon noho vIc aigumonlu, nocl jI sliIl 2to3 hozo zmny. Talo liIua
nomuzo hyl ouzIla jalo Iloiloi, iolozo jojI moloua next() vyzauujo aigumonly.
}] TolIo jo lioslu osomolno. Poluu mmo IolInI iomnnou ojmonovanou noxl, al huuo
mIl iounosl iou novou gIohInI IunlcI next(). V lalovom iIau huuomo musol io zIsl-
nI uaIsIlo ivlu osIounoslI voIal socIInI molouu Iloiloiu __next__(). (AIloinalIvn
hyclom molII ioIalloiIzoval lou lal, zo hy IolInI iomnn nohyIa ojmonovna next,
aIo lo za ns 2to3 aulomalIcly nouuI.)
A.12. GIohInI Iunlco filter()
V Pyllonu 2 viacoIa Iunlco filter() soznam, lloiy hyI vysIoulom IIIliovnI osIounoslI ios IunlcI,
lloi io lazuy ivol osIounoslI viacoIa lounolu Tiuo noho IaIso. V Pyllonu 8 Iunlco filter()
noviacI soznam, aIo Iloiloi.
A.11. Moloua Iloiloiu next()
A.12. GIohInI Iunlco filter()
389
Poznmky Python 2 Python 3
}1] filter(a_function, a_sequence) list(filter(a_function, a_sequence))
}2] list(filter(a_function, a_sequence)) 20dn0 zm6nu
}8] filter(None, a_sequence) [i for i in a_sequence if i]
}4] for i in filter(None, a_sequence): 20dn0 zm6nu
}] [i for i in filter(a_function, a_sequence)] 20dn0 zm6nu
}1] V nojzlIaunjsIm iIau ohaII sliIl 2to3 voInI Iunlco filter() voInIm Iunlco list().
TIm so iovouo iuclou ios vsoclny lounoly a vilI so slulocny soznam.
}2] Poluu jo aIo voInI Iunlco filter() u2 oIueno v list(), nohuuo 2to3 uIal nIc, iolozo
slulocnosl, zo filter() viacI Iloiloi v lalovom iIau nonI uuIozIl.
}8] SocIInI synlaxI filter(None, ...) sliIl 2to3 naliauI ouzIlIm somanlIcly slouno
gonoiloiovo nolaco soznamu.
}4] V lonloxlu ouohajIcImu so cylIum for, luy slojn uoclzI l iuclouu coIou osIounoslI,
nonI nulno iovul zuno zmny.
}] AnI zuo so nomusI uIal zuno zmny, iolozo gonoiloiov nolaco soznamu huuo Iloioval
ios vsoclny ivly osIounoslI, a lo muzo uuIal, al uz filter() viacI Iloiloi noho soznam.
A.18. GIohInI Iunlco map()
Iunlco map() nynI viacI Iloiloi. Juo o slojny iIau jalo u Iunlco filter(). (V Pyllonu 2 so viacoI
soznam.)
Poznmky Python 2 Python 3
}1] map(a_function, 'PapayaWhip') list(map(a_function, 'PapayaWhip'))
}2] map(None, 'PapayaWhip') list('PapayaWhip')
}8] map(lambda x: x+1, range(42)) [x+1 for x in range(42)]
}4] for i in map(a_function, a_sequence): 20dn0 zm6nu
}] [i for i in map(a_function, a_sequence)] 20dn0 zm6nu
}1] Slojn jalo u filter() v nojzlIaunjsIm iIau ohaII sliIl 2to3 voInI Iunlco map() voInIm
list().
}2] SocIInI synlaxI map(None, ...), vyjauiujIcI IunlcI IuonlIly, iovouo sliIl 2to3 na olvIvaIonl-
nI voInI list().
}8] Poluu jo ivnIm aigumonlom map() Iamhua Iunlco, iovouo 2to3 zIs s vyuzIlIm ouovIuajIcI
gonoiloiovo nolaco soznamu.
}4] V lonloxlu jalo u cylIu for, lloio slojn ioclzojI coIou osIounoslI, nonI nulno iovul zmny.
}] AnI zuo so nomusI uIal zuno zmny, iolozo gonoiloiov nolaco soznamu iouoIsujo iu-
clou ios vsoclny ivly osIounoslI, a lo muzo uuIal, al uz ma() viacI Iloiloi noho soznam.
A.18. GIohInI Iunlco map()
390
A.14. GIohInI Iunlco reduce()
V Pyllonu 8 hyIa Iunlco reduce() vyala z gIohInIlo iosloiu jmon a umIslna uo mouuIu functools.
Python 2 Python 3
reduce(a, b, c) from functools import reduce
reduce(a, b, c)
A.1. GIohInI Iunlco apply()
V Pyllonu 2 oxIslovaIa gIohInI Iunlco apply(), lloi iohIiaIa IunlcI f a soznam [a, b, c] a vilIIa
f(a, b, c). Slojno vcI muzomo uoslnoul lIm, zo IunlcI zavoImo iImo a iou iouvany soznam
aigumonlu iIIsomo lvzuIclu. V Pyllonu 8 jIz Iunlco apply() nooxIslujo. MusImo ouzIl zIs
s lvzuIclou.
Poznmky Python 2 Python 3
}1] apply(a_function, a_list_of_args) a_function(*a_list_of_args)
}2] apply(a_function, a_list_of_args, a_function(*a_list_of_args,
a_dictionary_of_named_args) **a_dictionary_of_named_args)
}8] apply(a_function, a_list_of_args + z) a_function(*a_list_of_args + z)
}4] apply(aModule.a_function, a_list_of_args) aModule.a_function(*a_list_of_args)
}1] V nojjounouussIm iIau muzomo IunlcI iI voInI ioual soznam aigumonlu (slulocny
soznam, jalo naiIlIau [a, b, c]) iIunIm lvzuIcly iou soznam (*). Juo o iosny
olvIvaIonl slaio Iunlco apply() z Pyllonu 2.
}2] V Pyllonu 2 muzo Iunlco apply() vo slulocnoslI iohIial liI aiamoliy: IunlcI, soznam
aigumonlu a sIovnIl s ojmonovanymI aigumonly. V Pyllonu 8 muzomo loloz uoslnoul
iIunIm lvzuIcly iou soznam aigumonlu (*) a iIunIm uvou lvzuIcol iou sIovnIl
ojmonovanycl aigumonlu (**).
}8] Zuo so ooiloi + ouzIv io ziolzonI soznamu. Ooiloi + m vyssI iIoiIlu noz ooiloi *,
lalzo loIom a_list_of_args + z nomusImo iIuval zvoily.
}4] SliIl 2to3 jo uosl clyliy na lo, ahy iovouI I sIozIl voInI apply(), vcoln voInI IunlcI
z Imoilovanycl mouuIu.
A.16. GIohInI Iunlco intern()
V Pyllonu 2 hyIo mozno ,Inloinoval iolzoc voInIm Iunlco intern(), cImz uosIo l olImaIIzacI
vylonu iI icI s lImlo iolzcom. V Pyllonu 8 hyIa Iunlco intern() iosunula uo mouuIu sys.
A.14. GIohInI Iunlco reduce()
A.1. GIohInI Iunlco apply()
A.16. GIohInI Iunlco intern()
391
Python 2 Python 3
intern(aString) sys.intern(aString)
A.17. PiIlaz exec
PiIlaz exec so v Pyllonu 8 zmnII na IunlcI slojn, jalo so na IunlcI zmnII iIlaz print. Iunlco
exec() iohIi iolzoc, lloiy ohsalujo IIhovoIny yllonovsly lou, a iovouo joj, jalo luyhy lo hyI
njaly iIlaz noho vyiaz. Iunlco exec() so ouoh eval(), aIo jo josl mocnjsI a zIovslnjsI. Iunl-
co eval() muzo vylounocoval jouIny vyiaz, aIo Iunlco exec() muzo iovosl vIco iIlazu, Imoilu,
uolIaiacI IunlcI v ouslal coIy yllonovsly iogiam, iouany jalo iolzoc.
Poznmky Python 2 Python 3
}1] exec codeString exec(codeString)
}2] exec codeString in a_global_namespace exec(codeString, a_global_namespace)
}8] exec codeString in a_global_namespace, exec(codeString, a_global_namespace,
a_local_namespace a_local_namespace)
}1] V nojjounouussIm iIau sliIl 2to3 iosl uzavio lou v ouoh iolzco uo zvoiol, iolozo
exec() jo lou Iunlco a no iIlaz.
}2] PuvounI iIlaz exec molI iohIial iosloi jmon v ouoh souliomolo iosliouI s gIohInImI
jmony, vo lloiom so mI lou v ouoh iolzco iovul. V Pyllonu 8 Izo uIal loloz. Piosloi
jmon so IunlcI exec() jounouuso iou jalo uiuly aiamoli.
}8] PuvounI iIlaz exec umozovaI uolonco iohIial IolInI iosloi jmon (ouohajIcI so iosloiu
iomnnycl uoIInovanycl uvnIli njalo Iunlco). V Pyllonu 8 lo Iunlco exec() uolzo lalo.
A.18. PiIlaz execfile
PuvounI iIlaz execfile, ouohn jalo uvounI iIlaz exec, souslI iolzco, vo lloiycl hyI uIozon
yllonovsly lou. Tam, luo exec iohIiaI iolzoc, execfile iohIiaI jmono souhoiu. Z Pyllonu 8
hyI iIlaz execfile vyiazon. Poluu oiavuu clcolo ouzIl souhoi s yllonovslym louom a suslIl
joj (aIo noclcolo joj iIlom jounouuso Imoiloval), muzolo slojno IunlcnoslI uoslnoul olovionIm
souhoiu, naclonIm jolo ohsalu, zavoInIm gIohInI Iunlco compile() (ahy hyI yllonovsly Inloiiol
uonucon lou ioIozIl) a nalonoc zavoInIm novo Iunlco exec().
Python 2 Python 3
execfile('a_filename') exec(compile(open('a_filename').read(),
'a_filename', 'exec'))
A.17. PiIlaz exec
A.18. PiIlaz execfile
392
A.1u repr-IIloiIy (zlno aoslioIy)
V Pyllonu 2 hyIo mozno zIslal ioiozonlacI ohjollu ouzIlIm socIInI synlaxo, luy so IIhovoIny
ohjoll ohaIII zlnymI aoslioIy (hacllIcls; jalo naiIlIau `x`). V Pyllonu 8 lalo sclonosl slIo
oxIslujo, aIo uz jI nomuzomo vyvoIal ouzIlIm zlnycl aoslioIu. MIslo nIcl musImo ouzIl gIohInI
IunlcI repr().
Poznmky Python 2 Python 3
}1] `x` repr(x)
}2] `'PapayaWhip' + `2`` repr('PapayaWhip' + repr(2))
}1] PiIomomo sI, zo x muzo hyl coloIIv liIua, Iunlco, mouuI, iImIlIvnI ualovy ly alu.
Iunlco repr() Iungujo na vsoclno.
}2] V Pyllonu 2 molIy hyl zlno aoslioIy zanoiony, coz vouIo l lomulo uiulu maloucIcl (aIo
Ialnycl) vyiazu. SliIl 2to3 jo uosl clyliy na lo, ahy zIs iovouI na zanoiono voInI repr().
A.2u. PiIlaz try...except
Synlaxo io ouclylvnI vyjImol so mozI voizomI Pyllon 2 a Pyllon 8 mIin zmnIIa.
Poznmky Python 2 Python 3
}1] try: try:
import mymodule import mymodule
except ImportError, e except ImportError as e:
pass pass
}2] try: try:
import mymodule import mymodule
except (RuntimeError, ImportError), e except (RuntimeError, ImportError) as e:
pass pass
}8] try: 20dn0 zm6nu
import mymodule
except ImportError:
pass
}4] try: 20dn0 zm6nu
import mymodule
except:
pass
A.1u. repr-IIloiIy (zlno aoslioIy)
A.2u. PiIlaz try...except
393
}1] MIslo cily so za lyom vyjImly v Pyllonu 8 ouzIv novo lIIcovo sIovo as.
}2] KIIcovo sIovo as Iungujo I io ouclylvnI vIco lyu vyjImol najounou.
}8] Poluu vyjImlu jon ouclylImo, aIo vo slulocnoslI ns nozajIm moznosl iIsluovnI l samol-
nomu ohjollu vyjImly, al so synlaxo ouzIvan v Pyllonu 2 slouujo so synlaxI v Pyllonu 8.
}4] Pouohn, oluu ouzIvmo zclianu v ouoh ouclylvnI v:eth vyjImol, jo synlaxo IuonlIcl.
> Nouzovo ouclylvnI vsocl vyjImol hyslo nIluy nomII ouzIval iI ImoilovnI mouuIu (anI
vo vlsIn oslalnIcl iIauu). TImlo zusohom ouclylIlo I vcI jalo KeyboardInterrupt (oluu
so uzIvaloI olousoI o ioiusonI cInnoslI iogiamu slIslom Ctrl-C) a zlIzIlo sI lIm IaunI.
A.21. PiIlaz raise
Synlaxo io vyvoIvnI nasIcl vIaslnIcl vyjImol so mozI voizomI Pyllon 2 a Pyllon 8 mIin zmnIIa.
Poznmky Python 2 Python 3
}1] raise MyException 20dn0 zm6nu
}2] raise MyException, 'error message' raise MyException('error message')
}8] raise MyException, 'error message', raise MyException('error message').
a_traceback with_traceback(a_traceback)
}4] raise 'error message' neodorov0no
}1] PiI ouzIlI nojjounouussI Ioimy, vyvoInI vyjImly hoz uzIvaloIslo clyhovo zivy, so synlaxo
nozmnIIa.
}2] Zmny sI ovsImnomo, luyz clcomo vyvoIal vyjImlu s uzIvaloIslym clyhovym lIsonIm.
Pyllon 2 ouuIovaI liIuu vyjImly a uzIvaloIslou zivu cilou. Pyllon 8 iouv clyhovou
zivu jalo aiamoli.
}8] Pyllon 2 ouoiovaI iI sIozIljsI synlaxI vyvoInI vyjImly s uzIvaloIslym zlnym liasov-
nIm (slacl liaco). V Pyllonu 8 lolo muzomo uoslnoul lalo, aIo synlaxo so uocoIa IIsI.
}4] V Pyllonu 2 jsmo molII vyvoIal vyjImlu, anIz jsmo zauvaII liIuu vyjImly. SlacIIo zaual cly-
hovou zivu. V Pyllonu 8 lo jIz nonI mozno. SliIl 2to3 vs huuo vaioval, zo nohyI scloon
lulo sIluacI oiavIl aulomalIcly.
A.22. Moloua gonoiloiu throw
V Pyllonu 2 uoIInovaIy gonoiloiy molouu throw(). VoInI a_generator.throw() vyvoI vyjImlu
v mIsl, luo so gonoiloi zaslavII. Polom so viacI uaIsI lounola, lloi jo vyiouulovna (yIoIu) gonoi-
loiovou IunlcI. V Pyllonu 8 jo uvouon Iunlcnosl slIo l uIsozIcI, aIo synlaxo so lioclu zmnIIa.
A.21. PiIlaz raise
A.22. Moloua gonoiloiu throw
394
Poznmky Python 2 Python 3
}1] a_generator.throw(MyException) 20dn0 zm6nu
}2] a_generator.throw(MyException, a_generator.throw(MyException('error
'error message') message'))
}8] a_generator.throw('error message') neodorov0no
}1] V nojjounouussIm iIau gonoiloi vyvoIv vyjImlu hoz uzIvaloIslo clyhovo zivy. V lomlo
iIau so synlaxo v Pyllonu 8 vucI Pyllonu 2 nozmnIIa.
}2] Poluu gonoiloi vyvoIv vyjImlu : u2vu|e:Lou thyIovou zr0vou, musImo iolzoc so zivou
ioual vylvionomu ohjollu vyjImly.
}8] Pyllon 2 ouoiovaI vyvoInI vyjImly, lloi hyIa lvoiona ouzo uzIvaloIslym clyhovym lIso-
nIm. Pyllon 8 lolo clovnI noouoiujo a sliIl 2to3 zohiazI vaiovnI, lloio iIl, zo lo huuolo
musol oiavIl iucn.
A.28. GIohInI Iunlco xrange()
V Pyllonu 2 oxIslovaIy uva zusohy zIslvnI lounol InloivaIu cIsoI: Iunlco range() viacoIa soznam
a Iunlco xrange(), viacoIa Iloiloi. V Pyllonu 8 Iunlco range() viacI Iloiloi a Iunlco xrange()
uz nooxIslujo.
Poznmky Python 2 Python 3
}1] xrange(10) range(10)
}2] a_list = range(10) a_list = list(range(10))
}8] [i for i in xrange(10)] [i for i in range(10)]
}4] for i in range(10): 20dn0 zm6nu
}] sum(range(10)) 20dn0 zm6nu
}1] V nojjounouussIm iIau sliIl 2to3 jounouuso zmnI xrange() na range().
}2] Poluu lou io Pyllon 2 ouzIvaI range(), al sliIl 2to3 novI, zua jsmo slulocn oliohovaII
soznam, noho zua hy vylovI Iloiloi. V imcI oalinoslI so viacon lounola iovuI na soznam
voInIm Iunlco list().
}8] Poluu hy hyIa Iunlco xrange() ouzIla uvnIli gonoiloiovolo zIsu soznamu, al jo sliIl
2to3 uosl clyliy na lo, ahy IunlcI range() neoIu voInIm list(). Gonoiloiovy zIs sozna-
mu huuo hoz iohIomu Iungoval s Iloiloiom, lloiy jo IunlcI range() vicon.
}4] Boz iohIomu huuo s Iloiloiom Iungoval I cylIus for, lalzo anI zuo nonI nulno nIc mnIl.
}] Iunlco sum() iacujo s Iloiloiom lalo, lalzo 2to3 nomusI nIc mnIl anI zuo. Ivouony iIslu
so, slojn jalo v iIau molou sIovnIlu, lloio viacojI olIouy (vIov) mIslo soznamu, aIIlujo
I u IunlcI min(), max(), sum(), list(), tuple(), set(), sorted(), any() a all().
A.28. GIohInI Iunlco xrange()
395
A.24. GIohInI Iunlco raw_input() a input()
Pyllon 2 oslylovaI io vyzunI sI uzIvaloIslolo vsluu z iIlazovo iuly uv gIohInI Iunlco.
PivnI z nIcl, zvan input(), ocolvaIa, zo uzIvaloI vIozI yllonovsly vyiaz (viacI so jolo vysIouol).
Diul z nIcl, zvan raw_input(), viacoIa lo, co uzIvaloI nasaI. ZaclocnIly lo voImI mlIo a ovazo-
vaIo so lo za ,hiauavIcI (vail) na jazyco. Pyllon 8 lulo nolnosl iosI iojmonovnIm raw_input()
na input(), lalzo lo Iungujo zusohom, lloiy vlsIna naIvn ocolv.
Poznmky Python 2 Python 3
}1] raw_input() input()
}2] raw_input('prompt') input('prompt')
}8] input() eval(input())
}1] V nojjounouussIm iIau so raw_input() mnI na input().
}2] V Pyllonu 2 molIa Iunlco raw_input() iohIial vyzyvacI iolzoc jalo aiamoli.
Talo moznosl jo zaclovna I v Pyllonu 8.
}8] Poluu clcolo, ahy so oiavuu vylounocovaI yllonovsly vyiaz zauany uzIvaloIom,
ouzIjlo IunlcI input() a iouojlo jojI vysIouol IunlcI eval().
A.2. AliIhuly IunlcI func_*
V Pyllonu 2 muzo lou uvnIli Iunlco iIsluoval lo socIInIm aliIhulum, lloio so lylajI Iunlco
samolno. V Pyllonu 8 hyIy lylo socIInI aliIhuly IunlcI iojmonovny, ahy so uoslaIy uo souIauu
s oslalnImI aliIhuly.
Poznmky Python 2 Python 3
}1] a_function.func_name a_function.__name__
}2] a_function.func_doc a_function.__doc__
}8] a_function.func_defaults a_function.__defaults__
}4] a_function.func_dict a_function.__dict__
}] a_function.func_closure a_function.__closure__
}6] a_function.func_globals a_function.__globals__
}7] a_function.func_code a_function.__code__
}1] AliIhul __name__ (uiIvo func_name) ohsalujo jmono Iunlco.
}2] AliIhul __doc__ (uiIvo func_doc) ohsalujo doLumen|utn Ie|6zet, lloiy hyI uoIInovn
vo zuiojovom loxlu Iunlco.
}8] AliIhul __defaults__ (uiIvo func_defaults) jo n-lIco ohsalujIcI vyclozI lounoly aigumonlu
io ly z aigumonlu, io lloio hyIy vyclozI lounoly uoIInovny.
A.24. GIohInI Iunlco raw_input() a input()
A.2. AliIhuly IunlcI func_*
396
}4] AliIhul __dict__ (uiIvo func_dict) jo iosloi jmon uclovvajIcI IIhovoIno aliIhuly Iunlco.
}] AliIhul __closure__ (uiIvo func_closure) jo n-lIco hunl, lloio ohsalujI vazhy (hInuIngs)
na voIno iomnno, lloio so vo IunlcI ouzIvajI.
}6] AliIhul __globals__ (uiIvo func_globals) jo oulaz na gIohInI iosloi jmon mouuIu,
vo lloiom hyIa Iunlco uoIInovna.
}7] AliIhul __code__ (uiIvo func_code) jo ohjoll louu (couo ohjocl), ioiozonlujIcI ioIozono
lIo Iunlco.
A.26. Moloua xreadlines() VlV ohjollu
V Pyllonu 2 mIy souhoiovo ohjolly molouu xreadlines(), lloi viacoIa Iloiloi ioclzojIcI souho-
iom o iucIcl. Kiom jInolo so lo louIIo io cylIy for. Vo slulocnoslI lo hyIa lal uzIlocn moloua,
zo ozujsI voizo Pyllonu 2 iIuaIy sclonosl Iloioval samolnym souhoiovym ohjollum.
V Pyllonu 8 ioslaIa moloua xreadlines() oxIsloval. SliIl 2to3 jo scloon iovosl jounouuclo iI-
auy, aIo v lianIcnIcl sIluacIcl o vs huuo vyzauoval iucnI zsal.
Poznmky Python 2 Python 3
}1] for line in a_file.xreadlines(): for line in a_file:
}2] for line in a_file.xreadlines(5): 20dn0 zm6nu /vede L ne[unLtnmu Lodu)
}1] Poluu jslo hyII zvylII voIal xreadlines() hoz aigumonlu, iovouo lolo voInI sliIl 2to3 jon
na souhoiovy ohjoll. V Pyllonu 8 zajIslI lonlo zIs slojnou Iunlcnosl: clo so zo souhoiu iuol
o iulu a iovuI so lIo cylIu for.
}2] Poluu jslo hyII zvylII voIal xreadlines() s aigumonlom (ocol iulu, lloio so majI nacIsl
najounou), al lo sliIl 2to3 nooiavI a vs lou soIzo s vysvlIonIm AttributeError: '_io.
TextIOWrapper' object has no attribute 'xreadlines'. Oiavu io Pyllon 8 muzolo iucn
iovosl zmnou xreadlines() na readlines(). (Moloua readlines() lou viacI Iloiloi, lalzo jo
lo slojn oIollIvnI, jalo hyIo xreadlines() v Pyllonu 2.)
A.27. ambda Iunlco, lloio alcolujI n-lIcI mIslo vIco aiamoliu
V Pyllonu 2 jsmo molII uoIInoval anonymnI lambda IunlcI, lloi iohIi vIco aiamoliu, lIm, zo
jsmo jI uoIInovaII jalo IunlcI, lloi iohIi n-lIcI s uiconym oclom oIozol. V uusIoulu lolo Pyllon
2 ,iozhaIII n-lIcI uo ojmonovanycl aigumonlu, na lloio jsmo so al molII uvnIli lambda Iunlco
oulazoval jmonom. V Pyllonu 8 muzomo lambda IunlcI lalo iouval n-lIcI, aIo yllonovsly Inloi-
iol jI noiozhaII uo ojmonovanycl aigumonlu. MIslo lolo so huuomo musol na jounolIIvo aigumonly
oulazoval ozIcnIm Inuoxom.
A.26. Moloua xreadlines() VlV ohjollu
A.27. lambda Iunlco, lloio alcolujI
n-lIcI mIslo vIco aiamoliu
397
Poznmky Python 2 Python 3
}1] lambda (x,): x + f(x) lambda x1: x1[0] + f(x1[0])
}2] lambda (x, y): x + f(y) lambda x_y: x_y[0] + f(x_y[1])
}8] lambda (x, (y, z)): x + y + z lambda x_y_z: x_y_z[0] + x_y_z[1][0]
+ x_y_z[1][1]
}4] lambda x, y, z: x + y + z 20dn0 zm6nu
}1] Poluu jsmo uoIInovaII lambda IunlcI, lloi iohIi n-lIcI s jounIm ivlom, slano so z nI
v Pyllonu 8 lambda Iunlco, lloi so oulazujo na x1[0]. Jmono x1 jo gonoiovno sliIlom
2to3 aulomalIcly, na zlIau ojmonovanycl aigumonlu uvounI n-lIco.
}2] Iamhua Iunlco s uvouivlovou n-lIcI (x, y) huuo iovouona na x_y s ozIcnImI aigumonly
x_y[0] a x_y[1].
}8] SliIl 2to3 zvIuno uolonco lambda Iunlco s vnoionymI n-lIcomI ojmonovanycl aigumonlu.
VysIouny lou v Pyllonu 8 jo onluu nocIloIny, aIo Iungujo slojnym zusohom, jalym Iungo-
vaI uvounI lou v Pyllonu 2.
}4] Muzomo uoIInoval lambda Iunlco, lloio iohIiajI vIc aigumonlu. Poluu loIom aigumonlu
nouvouomo zvoily, clov so Pyllon 2 l zIsu jalo l lambda IunlcI s vIco aigumonly. IvnIli
Iamhua Iunlco so na ojmonovano aigumonly oulazujomo jmonom jalo v lazuo jIno IunlcI.
V Pyllonu 8 lalo synlaxo oiu Iungujo.
A.28. AliIhuly socIInIcl molou
V Pyllonu 2 so molIy molouy liIu oulazoval na ohjoll liIuy, vo lloio jsou uoIInovny, a lalo na samol-
ny ohjoll molouy. RoIoionco im_self oulazovaIa na ohjoll Inslanco liIuy, im_func na ohjoll Iunlco
a im_class so oulazujo na liIuu ohjollu im_self. V Pyllonu 8 hyIy lylo socIInI aliIhuly molou
iojmonovny, ahy so uoslaIy uo souIauu s ojmonovnIm oslalnIcl aliIhulu.
Python 2 Python 3
aClassInstance.aClassMethod.im_func aClassInstance.aClassMethod.__func__
aClassInstance.aClassMethod.im_self aClassInstance.aClassMethod.__self__
aClassInstance.aClassMethod.im_class aClassInstance.aClassMethod.__self__.__class__
A.2u. SocIInI moloua __nonzero__
V Pyllonu 2 jsmo molII vylviol svo vIaslnI liIuy, lloio so uaIy ouzIval v hooIoovslom lonloxlu.
MolII jsmo naiIlIau vylvoiIl InslancI lalovo liIuy a al jI ouzIl v iIlazu if. DIaIo so lo lal, zo
jsmo uoIInovaII socIInI molouu __nonzero__(), lloi viacoIa True noho False. Ta so voIaIa, luyloIIv
hyIa Inslanco ouzIla v hooIoovslom lonloxlu. V Pyllonu 8 Izo uIal loloz, aIo jmono molouy hyIo
zmnno na __bool__().
A.28. AliIhuly socIInIcl molou
A.2u. SocIInI moloua __nonzero__
398
Poznmky Python 2 Python 3
}1] class A: class A:
def __nonzero__(self): def __bool__(self):
pass pass
}2] class A: 20dn0 zm6nu
def __nonzero__(self, x, y):
pass
}1] PiI vylounocovnI Inslanco v hooIoovslom lonloxlu so v Pyllonu 8 mIslo __nonzero__()
voI moloua __bool__().
}2] Poluu aIo mmo uoIInovnu molouu __nonzero__(), lloi vyzauujo njalo aigumonly, huuo
nslioj 2to3 iouolIual, zo jsmo jI ouzIvaII io njaly jIny coI, a noiovouo zuno zmny.
A.8u. OllaIovo IIloiIy
Synlaxo io zIs cIsoI v osmIclovo souslav (lj. ollaIovycl) so mozI Pyllonom 2 a Pyllonom 8 mIin
zmnIIa.
Python 2 Python 3
x = 0755 x = 0o755
A.81. sys.maxint
V souvIsIoslI so sIouconIm lyu long a int ozhyIa lonslanla sys.maxint vyovIuacI iosnosl. Talo
lounola muzo hyl slIo uzIlocn iI zjIslovnI sclonoslI zvIsIycl na IalIoim. Piolo hyIa v Pyllo-
nu onoclna, aIo hyIa iojmonovna na sys.maxsize.
Poznmky Python 2 Python 3
}1] from sys import maxint from sys import maxsize
}2] a_function(sys.maxint) a_function(sys.maxsize)
}1] Z maxInl so slv maxsize.
}2] JaloloIIv ouzIlI sys.maxint so mnI na sys.maxsize.
A.8u. OllaIovo IIloiIy
A.81. sys.maxint
399
A.82. GIohInI Iunlco callable()
V Pyllonu 2 jsmo molII voInIm gIohInI Iunlco callable() zlonlioIoval, zua so u ohjoll voIal (jalo
Iunlco). Z Pyllonu 8 hyIa lalo gIohInI Iunlco vyiazona. Poluu clcomo zjIslIl, zua so u ohjoll voIal,
musImo zlonlioIoval, zua m socIInI molouu __call__().
Python 2 Python 3
callable(anything) hasattr(anything, '__call__')
A.88. GIohInI Iunlco zip()
V Pyllonu 2 iohIiaIa gIohInI Iunlco zip() IIhovoIny ocol osIounoslI a viacoIa soznam n-lIc.
PivnI n-lIco ohsalovaIa ivnI oIozly zo vsocl osIounoslI, uiul n-lIco ohsalovaIa uiulo oIozly
zo vsocl osIounoslI a lal uIo. V Pyllonu 8 viacI Iunlco zip() mIslo soznamu Iloiloi.
Poznmky Python 2 Python 3
}1] zip(a, b, c) list(zip(a, b, c))
}2] d.join(zip(a, b, c)) 20dn0 zm6nu
}1] NojjounouussI zusoh uosazonI uvounIlo clovnI Iunlco zip() socIv v ohaIonI nvialovo
lounoly voInIm list(). TIm uojuo l iuclouu vsomI lounolamI Iloiloiu viaconolo IunlcI
zip() a vylvoiI so slulocny soznam vysIoulu.
}2] V lonloxlu, luo so jIz vyuzIv Iloiaco ios vsoclny oIozly osIounoslI (jalo naiIlIau iI
voInI lolo molouy join()), Iungujo Iloiloi viacony IunlcI zip() hoz iohIomu. SliIl 2to3 jo
uosl clyliy na lo, ahy lalovo iIauy uololovaI a noiovuI vo vasom louu zuno zmny.
A.84. VyjImla StandardError
V Pyllonu 2 hyIa StandardError hzovou liIuou vsocl zahuuovanycl vyjImol az na StopIterati-
on, GeneratorExit, KeyboardInterrupt a SystemExit. V Pyllonu 8 hyIa liIua StandardError ziusona.
MIslo nI so ouzIv liIua Exception.
Python 2 Python 3
x = StandardError() x = Exception()
x = StandardError(a, b, c) x = Exception(a, b, c)
A.82. GIohInI Iunlco callable()
A.88. GIohInI Iunlco zip()
A.84. VyjImla StandardError
400
A.8. Konslanly mouuIu types
MouuI types ohsalujo sIiolou aIolu lonslanl, lloio nm omlajI uicoval ly ohjollu. V Pyllonu 2
ohsalovaI lonslanly io vsoclny iImIlIvnI lyy, jalo jsou dict a int. Z Pyllonu 8 hyIy lylo lonslan-
ly ouslianny. MIslo nIcl so ouzIv jmono iImIlIvnIlo lyu.
Python 2 Python 3
types.UnicodeType str
types.StringType bytes
types.DictType dict
types.IntType int
types.LongType int
types.ListType list
types.NoneType type(None)
types.BooleanType bool
types.BufferType memoryview
types.ClassType type
types.ComplexType complex
types.EllipsisType type(Ellipsis)
types.FloatType float
types.ObjectType object
types.NotImplementedType type(NotImplemented)
types.SliceType slice
types.TupleType tuple
types.TypeType type
types.XRangeType range
> types.StringType so iovuI na bytes a no na str, iolozo ,iolzoc v Pyllonu 2 (no InIcouo
iolzoc, aIo ohycojny iolzoc) jo vo slulocnoslI jon osIounoslI hajlu ouovIuajIcIcl uicIlomu
znalovomu louovnI.
A.86. GIohInI Iunlco isinstance()
Iunlco isinstance() lonlioIujo, zua jo ohjoll InslancI uicIlo liIuy noho lyu. V Pyllonu 2 jsmo molII
ioual n-lIcI lyu a isinstance() vilIIa True, oluu hyI ohjoll jounIm z uvouonycl lyu. V Pyllonu
8 Izo uIal loloz, aIo iouvnI slojnolo lyu uvalil so ovazujo za nozuoucI (uoiocalou).
Python 2 Python 3
isinstance(x, (int, float, int)) isinstance(x, (int, float))
A.8. Konslanly mouuIu types
A.86. GIohInI Iunlco isinstance()
401
A.87. Dalovy ly basestring
Pyllon 2 iacovaI s uvma lyy iolzcu: InIcouo a no-InIcouo. AIo oxIslovaI v nm josl jouon ly,
basestring. JounaIo so o ahsliallnI ly, nauliIuu jal io ly str, lal io ly unicode. NohyIo mozno jI
voIal noho z nI vylviol InslancI iImo, aIo molII jslo jI ioual gIohInI IunlcI isinstance(), luyz jslo
cllII zlonlioIoval, zua jo ohjoll huu InIcouo, noho no-InIcouo iolzcom. V Pyllonu 8 oxIslujo jouIny
iolzcovy ly, lalzo uuvou l oxIsloncI lyu basestring omInuI.
Python 2 Python 3
isinstance(x, basestring) isinstance(x, str)
A.88. itertools mouuIo
Pyllon 2.8 zavouI mouuI itertools, lloiy uoIInovaI vaiIanly gIohInIcl IunlcI zip(), map() a filter(),
lloio mIslo soznamu viacoIy Iloiloiy. V Pyllonu 8 lylo gIohInI Iunlco viacojI Iloiloiy, lalzo uvouono
Iunlco hyIy z mouuIu itertools ouslianny. (V mouuIu itertools jo slIo mnolo uzIlocnycl IunlcI,
nojon ly iv zmInno.)
Poznmky Python 2 Python 3
}1] itertools.izip(a, b) zip(a, b)
}2] itertools.imap(a, b) map(a, b)
}8] itertools.ifilter(a, b) filter(a, b)
}4] from itertools import imap, izip, foo from itertools import foo
}1] MIslo itertools.izip() ouzIjlo jounouuso gIohInI IunlcI zip().
}2] MIslo itertools.imap() ouzIjlo jounouuso map().
}8] Z itertools.ifilter() so slv filter().
}4] MouuI IloilooIs v Pyllonu 8 oiu oxIslujo. Jon v nm clyhI Iunlco, lloio hyIy iosunuly
uo gIohInIlo iosloiu jmon. SliIl 2to3 jo uosl clyliy na lo, ahy ouslianII Imoily, lloio
nooxIslujI, a onoclaI oslalnI Imoily nouolcono.
A.8u. sys.exc_type, sys.exc_value, sys.exc_traceback
I Pyllonu 2 so v mouuIu sys naclzoIy liI iomnno, lloio jsmo molII ouzIval hlom ohsIuly vyjIm-
ly: sys.exc_type, sys.exc_value, sys.exc_traceback. (Vo slulocnoslI majI uvou uz v Pyllonu 1.)
Iz ou Pyllonu 1. hyIo ouzIvnI lcllo iomnnycl ovazovno za nozuoucI (uoiocalou) vo io-
scl sys.exc_info(), coz jo Iunlco viacojIcI n-lIcI so vsomI liomI lounolamI. V Pyllonu 8 hyIy lylo
liI InuIvIuuInI iomnno nalonoc ouslianny. MusImo ouzIval IunlcI sys.exc_info().
A.87. Dalovy ly basestring
A.88. itertools mouuIo
A.8u. sys.exc_type, sys.exc_value,
sys.exc_traceback
402
Python 2 Python 3
sys.exc_type sys.exc_info()[0]
sys.exc_value sys.exc_info()[1]
sys.exc_traceback sys.exc_info()[2]
A.4u. Gonoiloiy soznamu nau n-lIcomI
Poluu jsmo v Pyllonu 2 cllII ouzIl gonoiloiovou nolacI soznamu, lloi iouoIsovaIa IloiacI ios
n-lIcI, nomusoII jsmo lounoly n-lIco uzavIial uo luIalycl zvoiol. V Pyllonu 8 so oxIIcIlnI zvoily
vyzauujI.
Python 2 Python 3
[i for i in 1, 2] [i for i in (1, 2)]
A.41. Iunlco os.getcwdu()
V Pyllonu 2 hyIa l uIsozIcI Iunlco ojmonovan os.getcwd(), lloi viacoIa alluInI iacovnI
auiosi jalo (no-InIcouo) iolzoc. Piolozo mouoinI souhoiovo syslomy umI iacoval so jmony auios-
iu v IIhovoInom znalovom louovnI, zavouI Pyllon 2.8 IunlcI os.getcwdu(). Iunlco os.getcwdu()
viacoIa alluInI iacovnI auiosi jalo InIcouo iolzoc. V Pyllonu 8 oxIslujo jouIny iolzcovy ly
(InIcouo), lalzo os.getcwd() jo vsIm, co oliohujomo.
Python 2 Python 3
os.getcwdu() os.getcwd()
A.42. MolaliIuy
V Pyllonu 2 jsmo molII molaliIuy vylviol huu uoIInIcI aigumonlu metaclass v uolIaiacI liIuy, noho uo-
IInIcI socIInIlo aliIhulu __metaclass__ na iovnI liIuy. V Pyllonu 8 hyI lonlo aliIhul liIuy ousliann.
Poznmky Python 2 Python 3
}1] class C(metaclass=PapayaMeta): 20dn0 zm6nu
pass
}2] class Whip: class Whip(metaclass=PapayaMeta):
__metaclass__ = PapayaMeta pass
}8] class C(Whipper, Beater): class C(Whipper, Beater, metaclass=PapayaMeta):
__metaclass__ = PapayaMeta pass
A.4u. Gonoiloiy soznamu nau n-lIcomI
A.41. Iunlco os.getcwdu()
A.42. MolaliIuy
403
}1] DolIaiaco molaliIuy v mIsl uolIaiaco liIuy IungovaIa v Pyllonu 2 a Iungujo slojn I v Pyllonu 8.
}2] DolIaiaco molaliIuy omocI aliIhulu liIuy IungovaIa v Pyllonu 2, aIo v Pyllonu 8 jIz no.
}8] SliIl 2to3 jo uosl clyliy na lo, ahy zlonsliuovaI Ialnou uolIaiacI liIuy uolonco I v iIa-
uocl, luy liIua uuI z jouno noho vIco hzovycl liIu.
A.48. VcI lylajIcI so slyIu
Zhylol zuo osanycl ,oiav vo slulocnoslI nojsou oiavy jalo lalovo. Tylo iavy nomnI ousla-
lu, aIo slyI. Juo o vcI, lloio IungujI jal v Pyllonu 2, lal v Pyllonu 8. VyvojiI Pyllonu aIo majI zjom
na lom, ahy hyI yllonovsly lou lal jounolny, jal jo lo jon mozno. Z lololo olIouu oxIslujo oIIcIInI
Pythnn stylo guido (Piuvouco slyIom jazyla Pyllon), lloiy oIsujo az uo nosnosIloInoslI vsocl-
ny mozno uolaIIy, lloio vs lomi uicIl nozajImajI. A luyz uz 2to3 vylviI lal molulnou InIiasliullu-
iu io lonvoizI yllonovslolo louu z jouno ouohy uo uiulo, vzaII sI auloiI za svo iIual i noo-
vInnycl iysu, lloio hy zIosIIy cIloInosl vasIcl yllonovslycl iogiamu.
A.48.1. MnozInovo IIloiIy (set(); oxIIcIln)
V Pyllonu 2 hyIo jouInym moznym vyjuionIm uoIInIco mnozInovolo IIloiIu voInI set(posloupnost).
V Pyllonu 8 lalo moznosl slIo Iungujo, aIo cIslsI zusoh socIv v ouzIlI novolo zIsu mnozInovolo
IIloiIu: sIozono zvoily. Iungujo lo io vsoclny mnozIny s vyjImlou izuno mnozIny. Jo lo lIm,
zo sIovnIly ouzIvajI sIozono zvoily lalo a zIs {} hyI jIz vyliazon io izuny sIovnIl a no io
izunou mnozInu.
> SliIl 2to3 slanuaiun mnozInovo IIloiIy zasano omocI set() nouiavujo. Poluu clcomo
lulo iavu ovoIIl, uvouomo iI voInI 2to3 na iIlazovom iulu -f set_literal (I jalo IIx).
Ped Po
set([1, 2, 3]) {1, 2, 3}
set((1, 2, 3)) {1, 2, 3}
set([i for i in a_sequence]) {i for i in a_sequence}
A.48.2. GIohInI Iunlco buffer() (oxIIcIln)
Pyllonovslo ohjolly ImIomonlovano v jazyco C oxoilujI lalzvano ,iozlianI hIolu amlI (huIIoi
InloiIaco), lloio umozujo oslalnImu yllonovslomu louu iImo cIsl hIol amlI a zaIsoval
uo nj. (Jo lo iosn lal mocno a usIvo, jal lo znI.) V Pyllonu 8 hyIa Iunlco buffer() iojmonovna
na memoryview(). (Vo slulocnoslI jo lo sIco o nco lomIIlovanjsI, aIo iozuIIy muzolo lomi uicIl
Ignoioval.)
A.48. VcI lylajIcI so slyIu
404
> SliIl 2to3 slanuaiun IunlcI buffer() nooiavujo. Poluu clcomo lulo iavu ovoIIl, uvouo-
mo iI voInI 2to3 na iIlazovom iulu -f buffer.
Ped Po
x = buffer(y) x = memoryview(y)
A.48.8. BIIo znaly loIom ciol (oxIIcIln)
Navzuoiy uialonIclym iavIuIum io ouzIvnI hIIycl znalu (vlIlosaco) iI ousazovnI a iousa-
zovnI so Pyllon clov uocoIa voIn l ouzIvnI hIIycl znalu v jInycl ohIaslocl. IvnIli soznamu,
n-lIc, mnozIn a sIovnIlu so molou hIIo znaly ohjovIl iou a za cilamI hoz slouIIvycl cInlu. Jonzo
Piuvouco slyIom jazyla Pyllon iIl, zo iou cilamI so nom sl zun mozoia a za cilou so m
sl jouna. AcloIIv so zuo joun o cIsl oslolIclou zIozIlosl (lou Iungujo lal jalo lal, v Pyllonu 2
I v Pyllonu 8), sliIl 2to3 lulo vc muzo voIIloIn oiavIl.
> SliIl 2to3 slanuaiun sanI hIIycl znalu loIom ciol nouiavujo. Poluu clcomo lulo iavu
ovoIIl, uvouomo iI voInI 2to3 na iIlazovom iulu -f wscomma.
Ped Po
a ,b a, b
{a :b} {a: b}
A.48.8. Bzno ohialy (oxIIcIln)
V yllonovslo lomunIl oslun vznIlIa coI iaua ouzIvanycl ohialu. Nlloio so ualujI az l Pyllo-
nu 1, jalo naiIlIau cylIus while 1:. (Az uo voizo 2.8 nomI Pyllon oiavuovy hooIoovsly ly, lalzo
vyvojiI mIslo iavuIvoslnIcl lounol ouzIvaII 1 a u.) MouoinI yllonovslI iogiamloiI hy svo mozly
mII nalionoval na mouoinjsI ouohu lalovycl ohialu.
> SliIl 2to3 slanuaiun oiavu hznycl ohialu noiovuI. Poluu clcomo lulo iavu ovoIIl,
uvouomo iI voInI 2to3 na iIlazovom iulu -f idioms.
Ped Po
while 1: while True:
do_stuff() do_stuff()
type(x) == T isinstance(x, T)
type(x) is T isinstance(x, T)
a_list = list(a_sequence) a_list = sorted(a_sequence)
a_list.sort() do_stuff(a_list)
do_stuff(a_list)
A.48. VcI lylajIcI so slyIu
405
B. Jmna specilnch metod
B. PiIIola
My specialty is being right when
other people are wrong.
(Mou socIaIIlou jo mIl iavuu,
luyz so oslalnI IIuo myII.)
Gooigo Boinaiu Slav
406
Ohsal iIIoly
B. Jmna specilnch metod 405
B.1. Ponoimo so 407
B.2. ZlIauy 407
B.8. TiIuy, lloio so clovajI jalo Iloiloiy 407
B.4. VyocIlvano aliIhuly 408
B.. TiIuy, lloio so clovajI jalo Iunlco 411
B.6. TiIuy, lloio so clovajI jalo mnozIny 412
B.7. TiIuy, lloio so clovajI jalo sIovnIly 413
B.8. TiIuy, lloio so clovajI jalo cIsIa 414
B.u. TiIuy, lloio so uajI oiovnval 417
B.1u. TiIuy, lloio ouoiujI soiIaIIzacI 418
B.11. TiIuy, lloio molou hyl ouzIly
v hIolu with 418
B.12. Oiavuu osoloiIclo vcI 420
B.18. Piocllo sI 420
407
B.1. Ponoimo so
V coIo lnIzo jsmo so sollvaII s iIlIauy ,socIInIcl molou v jIslom smysIu ,magIclycl molou,
lloio Pyllon vyvoIv, luyz ouzIjomo uicIlou synlaxI. Poluu vaso liIuy ouzIjI socIInI molouy,
molou so cloval jalo mnozIny, jalo sIovnIly, jalo Iunlco, jalo Iloiloiy noho uolonco jalo cIsIa. Talo
iIIola sIouzI jalo ioIoioncnI iIiucla lo socIInIm moloum, so lloiymI jsmo so uz sollaII, a jalo
sliucny vou l nlloiym osoloiIcljsIm socIInIm moloum.
B.2. ZlIauy
Poluu jslo uz colII vou l liIum, uz jslo so sollaII s nojhznjsI socIInI molouou, s molouou __init__().
VlsIna liIu, lloio Isomo, nalonoc oliohujo njalou InIcIaIIzacI. LxIslujo nloIIl uaIsIcl zlIaunIcl
socIInIcl molou, lloio jsou zvIsl uzIlocno iI IaunI nasIcl uzIvaloIsly uoIInovanycl liIu.
}1] Moloua __init__() so voI az olo, co hyIa Inslanco vylvoiona. Poluu clcomo ovIual iocos
slulocnolo vylvionI Inslanco, musImo ouzIl molouu __new__().
}2] Moloua __repr__() hy ouIo lonvonco mIa viacol iolzoc, lloiy jo Ialnym yllonovslym vyiazom.
}8] Moloua __str__() so voI lalo v iIau, luy ouzIjomo print(x).
}4] NovnLu v Fy|honu 8, lloi souvIsI so zavouonIm lyu bytes.
}] PouIo lonvonco hy mI hyl format_spec v souIauu s mInIjazylom io socIIIlacI Ioimlu.
MouuI decimal.py z yllonovslo slanuaiunI lnIlovny m svou vIaslnI molouu __format__().
B.8. TiIuy, lloio so clovajI jalo Iloiloiy
V laIloIo o Iloiloiocl jsmo sI ulzaII, jal muzomo vylvoiIl Iloiloi ou zlIauu s vyuzIlIm molou
__iter__() a __next__().
B.1. Ponoimo so
B.2. ZlIauy
B.8. TiIuy, lloio so clovajI jalo Iloiloiy
Poznmky To, co chceme Take napeme A Python zavol
}1] InIcIaIIzaco Inslanco x = MyClass() x.__init__()
}2] ,oIIcIInI iolzcov ioiozonlaco repr(x) x.__repr__()
}8] ,noIoimInI iolzcov ouoha str(x) x.__str__()
}4] ,noIoimInI ouoha v oII hajlu bytes(x) x.__bytes__()
}] lounola jalo naIoimlovany format(x, format_spec) x.__format__(format_spec)
iolzoc
Poznmky To, co chceme Take napeme A Python zavol
}1] IloiovnI ios osIounosl iter(seq) seq.__iter__()
}2] zIslnI uaIsI lounoly Iloiloiu next(seq) seq.__next__()
}8] vylvoionI Iloiloiu ioclzojIcIlo reversed(seq) seq.__reversed__()
v oacnom oiauI
408
}1] Moloua __iter__() so voI, luyloIIv vylviImo novy Iloiloi. Jo lo uohio mIslo io naslavonI
oclocnIcl lounol Iloiloiu.
}2] Moloua __next__() so voI, luyloIIv so snazImo o zIslnI novo lounoly Iloiloiu.
}8] Moloua __reversed__() so hzn noouzIv. Vozmo oxIslujIcI osIounosl a viacI Iloiloi,
lloiy iouulujo ivly osIounoslI v oacnom oiauI, lj. ou osIounIlo l ivnImu.
Jal jsmo sI ulzaII v laIloIo o Iloiloiocl, cylIus for so muzo cloval jalo Iloiloi. V nsIouujIcIm cylIu:
for x in seq:
print(x)
Pyllon 8 vylvoiI Iloiloi voInIm seq.__iter__() a olom huuo zIslval lounoly x voInIm jolo molouy
__next__(). JalmIIo moloua __next__() vyvoI vyjImlu StopIteration, cylIus for soiuan sloncI.
B.4. VyocIlvano aliIhuly
}1] Poluu liIua uoIInujo molouu __getattribute__(), zavoI jI Pyllon I Lu2d6m odLuzu nu
Iovony u|rIu| neIo jm6no me|ody (s vyjImlou jmon socIInIcl molou, iolozo hy lIm vznIlI
noiIjomny nolonocny cylIus).
}2] Poluu liIua uoIInujo molouu __getattr__(), huuo jI Pyllon voIal az olo, co aliIhul nonajuo
na nlloiom z hznycl mIsl. Poluu Inslanco x uoIInujo aliIhul coIoi, neovede ouzIlI x.color
l voInI x.__getattr__('color'). Jounouuso so vilI jIz uoIInovan lounola x.color.
}8] Moloua __setattr__() so voI, luyloIIv clcomo aliIhulu iIiauIl njalou lounolu.
}4] Moloua __delattr__() so voI, luyloIIv clcomo aliIhul ziusIl.
}] Moloua __dir__() jo uzIlocn v iIauocl, luy uoIInujomo molouu __getattr__() noho molo-
uu __getattribute__(). NoimIn hyclom voInIm Iunlco dir(x) zIslaII jon soznam hznycl
aliIhulu a molou. Poluu naiIlIau moloua __getattr__() vylviI aliIhul color uynamIcly,
novyIsovaI hy so color v soznamu viaconom IunlcI dir(x) jalo jouon z uoslunycl aliIhulu.
PiouoIInovnI molouy __dir__() nm umoznI vysal color jalo uosluny aliIhul. Muzo lo hyl
uzIlocno io jIno iogiamloiy, lloiI sI iojI ouzIval nasI liIuu, anIz hy musoII zloumal jojI
vnIlinI moznoslI.
B.4. VyocIlvano aliIhuly
Poznmky To, co chceme Take napeme A Python zavol
1] zIslal vyocIlany aliIhul x.my_property x.__getattribute__
(nooumInn) ('my_property')
}2] zIslal vyocIlany aliIhul (IaIIhacl) x.my_property x.__getattr__('my_property')
}8] naslavIl lounolu aliIhulu x.my_property = value x.__setattr__('my_property',
value)
}4] ziusIl aliIhul del x.my_property x.__delattr__('my_property')
}] vysal soznam aliIhulu a molou dir(x) x.__dir__()
409
RozuII mozI molouamI __getattr__() a __getattribute__() jo jomny, aIo uuIozIly. VysvlIImo sI lo
na uvou iIlIauocl:
class Dynamo:
def __getattr__(self, key):
if key == 'color': }1]
return 'PapayaWhip'
else:
raise AttributeError }2]
>>> dyn = Dynamo()
>>> dyn.color }8]
'PapayaWhip'
>>> dyn.color = 'LemonChiffon'
>>> dyn.color }4]
'LemonChiffon'
}1] Jmono aliIhulu so iou molou __getattr__() jalo iolzoc. Poluu jo jmono iovno 'color',
vilI moloua lounolu. (V lomlo iIau so joun o ovn zauany iolzoc, aIo noimIn hyclom
zuo iovouII njaly vyocol a vilIII hyclom iolzoc.)
}2] Poluu jmono aliIhulu noznmo, musI moloua __getattr__() vyvoIal vyjImlu AttributeError.
V oacnom iIau hy ns lou iI iIsluu l nouoIInovanomu aliIhulu olIclu soIlaI. (Poluu
moloua novyvoI vyjImlu noho oxIIcIln novilI njalou lounolu, al z loclnIclolo lIouIs-
la viacI None, coz jo yllonovsl lounola nuII. To znamon, zo hy v:ethny aliIhuly, lloio hy
nohyIy oxIIcIln uoIInovny, nahyvaIy lounoly None. To lomi uicIl noclcomo.)
}8] Inslanco dyn nom aliIhul jmonom color, lalzo so zavoI moloua __getattr__(), lloi vilI
vyocIlanou lounolu.
}4] JalmIIo oxIIcIln naslavImo dyn.color, ioslano so moloua __getattr__() io zIslnI lounoly
dyn.color voIal, iolozo aliIhul dyn.color uz jo v InslancI uoIInovn.
Vo siovnnI s lIm jo moloua __getattribute__() ahsoIulnI a nooumInn.
class SuperDynamo:
def __getattribute__(self, key):
if key == 'color':
return 'PapayaWhip'
else:
raise AttributeError
B.4. VyocIlvano aliIhuly
410
>>> dyn = SuperDynamo()
>>> dyn.color }1]
'PapayaWhip'
>>> dyn.color = 'LemonChiffon'
>>> dyn.color }2]
'PapayaWhip'
}1] Pio zIslnI lounoly uyn.coIoi so voI moloua __getattribute__().
}2] Dolonco I luyz oxIIcIln naslavImo dyn.color, huuo so io zIslvnI lounoly dyn.color
slIo voIal moloua __getattribute__(). Poluu jo moloua __getattribute__() uoIInovna,
vo0 :e neodmn6n6 iI lIounI lazuolo aliIhulu noho molouy. PIalI lo I io aliIhuly, lloio
jsmo o vylvoionI Inslanco oxIIcIln naslavIII (a lIm vylvoiIII).
> Poluu vaso liIua uoIInujo molouu __getattribute__(), al iavuouohn clcolo uoIInoval
lalo molouu __setattr__(). Pio uuizonI iolIouu o lounolcl aliIhulu musIlo mozI lmIlo
molouamI zajIslIl soIuicI. V oacnom iIau hy so aliIhuly naslavono o vylvoionI Inslan-
co zlicoIy v coino uIio.
I molouy __getattribute__() musImo hyl voImI ocIIvI, iolozo jI Pyllon ouzIv I iI lIounI
jmon molou liIuy.
class Rastan:
def __getattribute__(self, key):
raise AttributeError }1]
def swim(self):
pass
>>> hero = Rastan()
>>> hero.swim() }2]
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "<stdin>", line 3, in __getattribute__
AttributeError
}1] Talo liIua uoIInujo molouu __getattribute__(), lloi vzuy vyvoI vyjImlu AttributeError.
HIounI lazuolo aliIhulu noho molouy sloncI nossn.
}2] Poluu zavoImo hero.swim(), zacno Pyllon v liIu Rastan lIoual molouu swim(). HIounI
ioclzI molouou __getattribute__(), ro|o2e hed0n v:eth u|rIu| u me|od roth0z
me|odou __getattribute__(). V lomlo iIau moloua __getattribute__() vyvoI vyjImlu
AttributeError, lalzo lIounI molouy soIzo a lIm uom soIzo I jojI voInI.
B.4. VyocIlvano aliIhuly
411
B.. TiIuy, lloio so clovajI jalo Iunlco
Poluu liIua uoIInujo molouu __call__(), muzomo InslancI liIuy voIal (caIIahIo), jalo luyhy
lo hyIa Iunlco.
To, co chceme Take napeme A Python zavol
,voIal InslacI jalo IunlcI my_instance() my_instance.__call__()
MouuI zipfile lonlo zusoh ouzIv io uoIInIcI liIuy, lloi umI zauanym losIom uosIIioval (uociyl)
zasIIiovany (onciylou) zI souhoi. DosIIiovacI aIgoiIlmus io zI vyzauujo, ahy so hlom uosIIiovnI
ulIuaI slav. Poluu uosIIiloi (uociyloi) uoIInujomo jalo liIuu, muzo sI slav uclovval uvnIli Inslanco
svo liIuy. Slav so InIcIaIIzujo v molou __init__() a alluaIIzujo so hlom uosIIiovnI souhoiu. AIo io-
lozo jo liIua uoIInovna jalo ,voIaloIn (jalo Iunlco), muzomo InslancI liIuy ioual jalo ivnI aigumonl
Iunlco map() lallo:
# vatek ze zipfile.py
class _ZipDecrypter:
.
.
.
def __init__(self, pwd):
self.key0 = 305419896 }1]
self.key1 = 591751049
self.key2 = 878082192
for p in pwd:
self._UpdateKeys(p)
def __call__(self, c): }2]
assert isinstance(c, int)
k = self.key2 | 2
c = c ^ (((k * (k^1)) >> 8) & 255)
self._UpdateKeys(c)
return c
.
.
.
zd = _ZipDecrypter(pwd) }8]
bytes = zef_file.read(12)
h = list(map(zd, bytes[0:12])) }4]
}1] TiIua _ZipDecryptor uuizujo slav v ouoh liI iolujIcIcl lIIcu, lloio so ozujI alluaIIzujI
molouou _UpdateKeys() (zuo noulzna).
B.. TiIuy, lloio so clovajI jalo Iunlco
412
}2] TiIua uoIInujo molouu __call__(), lloi zusohujo, zo Inslanco liIuy muzomo voIal, jalo luyhy
lo hyIy Iunlco. V lomlo iIau moloua __call__() uosIIiujo jouon hajl zo zI souhoiu a olom
alluaIIzujo iolujIcI lIIco ouIo lounoly uosIIiovanolo hajlu.
}8] zu jo InslancI liIuy _ZipDecryptor. Piomnn pwd (assvoiu; losIo) jo iouna molou
__init__(), lloi jojI ohsal uIozI a ouzIjo joj io ivnI alluaIIzacI iolujIcIcl lIIcu.
}4] Mmo ivnIcl 12 hajlu zI souhoiu. DosIIiujomo jo zohiazonIm hajlu ios zd. To znamon, zo so
12lil ,voI zd, coz znamon, zo so 12lil voI moloua __call__(), lloi alluaIIzujo vnIlinI
slav Inslanco a 12lil viacI vysIouny hajl.
B.6. TiIuy, lloio so clovajI jalo mnozIny
Poluu so naso liIua clov jalo lonlojnoi io mnozInu lounol lj. oluu m smysI ll so, zua naso
liIua ,ohsalujo lounolu , al hy iavuouohn mIa uoIInoval nsIouujIcI socIInI molouy,
lloio zusohI, zo so huuo cloval jalo mnozIna.
To, co chceme Take napeme A Python zavol
ocol oIozol len(s) s.__len__()
losl, zua osIounosl ohsalujo x in s s.__contains__(x)
uicIlou lounolu
MouuI cgi lylo molouy ouzIv vo svo liIu FieldStorage, lloi ioiozonlujo vsoclna oIo IoimuIio
noho aiamoliy uolazu, lloio hyIy zasIny na uynamIclou vohovou slinlu.
# Skript, kter reaguje na http://example.com/search?q=cgi
import cgi
fs = cgi.FieldStorage()
if 'q' in fs: }1]
do_search()
# Vatek z cgi.py, kter vysvtluje, jak to funguje
class FieldStorage:
.
.
.
def __contains__(self, key): }2]
if self.list is None:
raise TypeError('not indexable')
return any(item.name == key for item in self.list) }8]
def __len__(self): }4]
return len(self.keys()) }]
B.6. TiIuy, lloio so clovajI jalo mnozIny
413
}1] JalmIIo vylvoiImo InslancI liIuy cgi.FieldStorage, muzomo ouzIl ooiloi ,In io ovionI,
zua so v iolzcI s uolazom naclzI uicIly aiamoli.
}2] KouzIom, lloio lo umoznI, jo moloua __contains__(). Poluu naIsomo if 'q' in fs, lIou
Pyllon molouu __contains__() ohjollu fs, lloiy jo uoIInovn v cgi.py. Hounola 'q' jo iou-
na molou __contains__() jalo aigumonl key.
}8] Iunlco any() iohIi gonoiloiovy vyiaz a viacI True, oluu gonoiloi vilI aIoso jouon
ivol. NavIc jo uosl clyli, ahy sloncIIa s loslovnIm lnou, jal so ouaiI oumInlu sInIl.
}4] Slojn liIua FieldStorage ouoiujo lalo viaconI svo uoIly, lalzo muzomo nasal len(fs) a za-
voI so moloua __len__() liIuy FieldStorage, lloi vilI ocol iozoznanycl aiamoliu uolazu.
}] Moloua self.keys() lonlioIujo, zua self.list is None (zua soznam vuhoc oxIslujo), lalzo
moloua __len__ nomusI uvouonou lonlioIu clyh uuhIoval.
B.7. TiIuy, lloio so clovajI jalo sIovnIly
Kuyz iouclozI moznoslI lioslu iozsIiImo, muzomo uoIInoval liIuy, lloio nojonzo ioagujI na ooiloi ,in
a na IunlcI len(), aIo lloio so molou cloval jalo Inolounolno sIovnIly viacojIcI lounoly vzano na lIIco.
To, co chceme Take napeme A Python zavol
zIslal lounolu ouIo lIIco x[key] x.__getitem__(key)
naslavIl lounolu vzanou na lIIc x[key] = value x.__setitem__(key, value)
ziusIl uvojIcI lIIc-lounola del x[key] x.__delitem__(key)
vilIl vyclozI lounolu x[nonexistent_key] x.__missing__(nonexistent_key)
io clyhjIcI lIIco
TiIua FieldStorage z mouuIu cgi uoIInujo iovnz lylo socIInI molouy, coz znamon, zo muzomo
uIal naiIlIau nsIouujIcI vcI:
# Skript, kter reaguje na http://example.com/search?q=cgi
import cgi
fs = cgi.FieldStorage()
if 'q' in fs:
do_search(fs['q']) }1]
# Vatek z cgi.py, kter ukazuje, jak to funguje
class FieldStorage:
.
.
.
def __getitem__(self, key): }2]
if self.list is None:
raise TypeError('not indexable')
B.7. TiIuy, lloio so clovajI jalo sIovnIly
414
found = []
for item in self.list:
if item.name == key: found.append(item)
if not found:
raise KeyError(key)
if len(found) == 1:
return found[0]
else:
return found
}1] Ohjoll fs jo InslancI cgi.FieldStorage, aIo ioslo muzomo ouzIval vyiazy jalo fs['q'].
}2] fs['q'] zavoI molouu __getitem__() s aiamoliom loy naslavonym na 'q'. Polom so
vo vnIlinIm soznamu aiamoliu uolazu (self.list) lIou oIozla, jojIz aliIhul .name jo
iovon zauanomu lIIcI.
B.8. TiIuy, lloio so clovajI jalo cIsIa
PiI ouzIlI iIsIusnycl socIInIcl molou muzomo uoIInoval svo vIaslnI liIuy, lloio so clovajI jalo
cIsIa. To znamon, zo jo muzomo scIlal, oucIlal a iovul s nImI uaIsI malomalIclo ooiaco. TImlo
zusohom jsou ImIomonlovny vcI v mouuIu fractions liIua IiaclIon ImIomonlujo socIInI
molouy, lloio nm umozujI iovul lalovolo vcI:
>>> from fractions import Fraction
>>> x = Fraction(1, 3)
>>> x / 3
Fraction(1, 9)
Zuo jo Iny soznam socIInIcl molou, lloio musI ImIomonloval liIua clovajIcI so jalo cIsIo.
To, co chceme Take napeme A Python zavol
scIlnI x + y x.__add__(y)
oucIlnI x - y x.__sub__(y)
nsohonI x * y x.__mul__(y)
uIonI x / y x.__truediv__(y)
coIocIsoIno uIonI (IIooi uIvIsIon) x // y x.__floordiv__(y)
mouuIo (zhylol) x % y x.__mod__(y)
coIocIsoIno uIonI a zhylol divmod(x, y) x.__divmod__(y)
umocnnI na x ** y x.__pow__(y)
hIlovy osun uoIova x << y x.__lshift__(y)
hIlovy osun uoiava x >> y x.__rshift__(y)
IogIcly soucIn o hIlocl (and) x & y x.__and__(y)
xor o hIlocl x ^ y x.__xor__(y)
IogIcly soucol o hIlocl (or) x | y x.__or__(y)
B.8. TiIuy, lloio so clovajI jalo cIsIa
415
Poluu jo x InslancI liIuy, lloi lylo molouy ImIomonlujo, huuo lo Iungoval hoz iohIomu. AIo co luyz
liIua nlloiou z lcllo molou noImIomonlujo Noho josl lui co luyz jo ImIomonlujo, aIo nooia-
uI sI s nlloiymI uiuly aigumonlu NaiIlIau:
>>> from fractions import Fraction
>>> x = Fraction(1, 3)
>>> 1 / x
Fraction(3, 1)
TolIo nen iIau, luy so vozmo Fraction a uII so coIym cIsIom (jalo v iouclozIm iIlIauu). MInuIy
iIlIau hyI iImocaiy: x / 3 voI x. __truediv__(3) a moloua __truediv__() liIuy Fraction iovouo
malomalIclou ooiacI. AIo ohjolly lyu coIo cIsIo (int) ,noumI uIal aiIlmolIclo ooiaco so zIomly.
Talzo jal jo mozno, zo lon iIlIau Iungujo
LxIslujo uiul saua aiIlmolIclycl socIInIcl molou : oIr0tenym oerundy (ioIIoclou ooianus).
Poluu malomalIcl ooiaco vyzauujo uva ooianuy (naiIlIau x / y), u so lo iosIl uvma zusohy:
1. Rolnomo x, ahy ouIIIo samo soho lounolou y, noho
2. iolnomo y, ahy so zaclovaIo jalo uIIloI lounoly x.
Vyso uvouon saua socIInIcl molou ouzIv ivnI iIslu: oluu mmo x / y, oslylujI molouy
zusoh, jal muzo x iIcI: ,J vIm, jal vyuIIl soho lounolou y. NsIouujIcI saua socIInIcl molou so
ouslI uo uiulolo iIsluu molouy oslylujI zusoh, jalym muzo y vyjuiIl: ,J vIm, jal hyl uII-
loIom a ouIIl sohou lounolu x.
To, co chceme Take napeme A Python zavol
scIlnI x + y y.__radd__(x)
oucIlnI x - y y.__rsub__(x)
nsohonI x * y y.__rmul__(x)
uIonI x / y y.__rtruediv__(x)
coIocIsoIno uIonI (IIooi uIvIsIon) x // y y.__rfloordiv__(x)
mouuIo (zhylol) x % y y.__rmod__(x)
coIocIsoIno uIonI a zhylol divmod(x, y) y.__rdivmod__(x)
umocnnI na x ** y y.__iov__(x)
hIlovy osun uoIova x << y y.__iIslIIl__(x)
hIlovy osun uoiava x >> y y.__rrshift__(x)
IogIcly soucIn o hIlocl (and) x & y y.__rand__(x)
xor o hIlocl x ^ y y.__rxor__(x)
IogIcly soucol o hIlocl (or) x | y y.__ror__(x)
AIo momonl! Ono jo lolo josl vIc! Poluu iovuImo ooiaco ,iImo nau iomnnou (In-Iaco,
In sIlu, na mIsl samom), jalo naiIlIau x/=3, muzomo uoIInoval josl uaIsI socIInI molouy.
B.8. TiIuy, lloio so clovajI jalo cIsIa
416
To, co chceme Take napeme A Python zavol
scIlnI nau iomnnou x += y x.__iadd__(y)
oucIlnI nau iomnnou x -= y x.__isub__(y)
nsohonI nau iomnnou x *= y x.__imul__(y)
uIonI nau iomnnou x /= y x.__itruediv__(y)
coIocIsoIno uIonI nau iomnnou x //= y x.__ifloordiv__(y)
(IIooi uIvIsIon)
mouuIo nau iomnnou x %= y x.__imod__(y)
umocnnI nau iomnnou x **= y x.__ipow__(y)
hIlovy osun uoIova x <<= y x.__ilshift__(y)
nau iomnnou
hIlovy osun uoiava x >>= y x.__irshift__(y)
nau iomnnou
IogIcly soucIn o hIlocl x &= y x.__iand__(y)
nau iomnnou (and)
xor o hIlocl nau iomnnou x ^= y x.__ixor__(y)
IogIcly soucol o hIlocl x |= y x.__ior__(y)
nau iomnnou (or)
Poznmla: Vo vlsIn iIauu so ImIomonlaco ,In sIlu molou novyzauujo. Poluu io uicIlou
ooiacI iIsIusnou ,In sIlu molouu (lj. nau iomnnou) nouoIInujomo, Pyllon so jI olusI naliauIl.
NaiIlIau iI iovunI vyiazu x /= y Pyllon...
1. VyzlousI zavoIal x.__itruediv__(y). Poluu jo moloua uoIInovna a vilIIa lounolu jInou
noz NotImplemented, jo lo lolovo.
2. VyzlousI zavoIal x.__truediv__(y). Poluu jo moloua uoIInovna a vilIIa lounolu jInou
noz NotImplemented, jo uvounI lounola x zalozona a jo naliazona vysIounou lounolou
jalo luyhyclom mIslo lolo nasaII x = x / y.
8. VyzlousI zavoIal y.__rtruediv__(x). Poluu jo moloua uoIInovna a vilIIa lounolu jInou
noz NotImplemented, jo uvounI lounola x zalozona a jo naliazona vysIounou lounolou.
Talzo ,In sIlu molouu jalo __itruediv__() uoIInujomo jon v iIauocl, luy clcomo io In sIlu
ooianuy iovul njalou socIInI olImaIIzacI. V oacnom iIau Pyllon v ouslal ioIoimuIu-
jo ozauavol iovouonI ooianuu nau iomnnou na hznou ouohu ooianuu s iIiazonIm vysIoulu
uo iomnno.
Ohjolly, lloio so clovajI jalo cIsIo, molou nau sohou iovul lalo i ,uninIcl malomalIclycl
ooiacI.
B.8. TiIuy, lloio so clovajI jalo cIsIa
417
B.u. TiIuy, lloio so uajI oiovnval
Tulo csl jsom ou iouclozI ouuIII, iolozo oiovnnI so noomozujo jon na cIsIa. Poiovnval so
uajI lounoly mnola ualovycl lyu iolzco, soznamy a uolonco I sIovnIly. Poluu vylviImo svou
vIaslnI liIuu a m smysI uvazoval o oiovnvnI nasolo ohjollu s jInymI ohjolly, muzomo oiovnnI
ImIomonloval nsIouujIcImI socIInImI molouamI.
To, co chceme Take napeme A Python zavol
iovnosl x == y x.__eq__(y)
iuznosl (noiovnosl) x != y x.__ne__(y)
monsI noz x < y x.__lt__(y)
monsI noz noho iovno x <= y x.__le__(y)
vlsI noz x > y x.__gt__(y)
vlsI noz noho iovno x >= y x.__ge__(y)
iavuIvoslnI lounola if x: x.__bool__()
v hooIoovslom lonloxlu
> Poluu uoIInujomo molouu __lt__(), aIo nouoIInujomo molouu __gt__(), ouzIjo Pyllon
molouu __lt__() s iolozonymI ooianuy. AIo Pyllon noiovuI lomhInacI molou. Poluu
naiIlIau uoIInujomo molouu __lt__() a molouu __eq__() a olusImo so olosloval, zua jo
x <= y, Pyllon nozavoI oslun __lt__() a __eq__(). ZavoI ouzo molouu __le__().
B.u. TiIuy, lloio so uajI oiovnval
Poznmky To, co chceme Take napeme A Python zavol
uninI mInus (zoino cIsIo) -x x.__neg__()
uninI Ius (lIauno cIsIo) +x x.__pos__()
ahsoIulnI lounola abs(x) x.__abs__()
Invoizo ~x x.__invert__()
iovou na lomIoxnI cIsIo complex(x) x.__complex__()
iovou na coIo cIsIo int(x) x.__int__()
iovou na ioIno cIsIo float(x) x.__float__()
iovou na nojhIIzsI coIo cIsIo round(x) x.__round__()
zaolioulIonIm
iovou na nojhIIzsI cIsIo round(x, n) x.__round__(n)
zaolioulIonIm na n uosolInnycl
mIsl
nojmonsI coIo cIsIo >= x mall.coII(x) x.__coII__()
nojvlsI coIo cIsIo <= x math.floor(x) x.__floor__()
ousolnulI x na nojhIIzsI coIo math.trunc(x) x.__trunc__()
cIsIo smiom l 0
PEP 87 cIsIo jalo Inuox soznamu a_list[x] a_list[x.__index__()]
418
B.1u. TiIuy, lloio ouoiujI soiIaIIzacI
Pyllon ouoiujo soiIaIIzacI a uosoiIaIIzacI IIhovoInycl ohjollu. (VlsIna yllonovslycl iIiucol lonlo
iocos nazyv ,IclIIng a ,unIclIIng.) Muzo lo hyl uzIlocno io uIozonI slavu ohjollu uo souhoiu
a jolo ozujsI ohnovonI. Vsoclny iIiozono ualovo lyy jIz ,IlIonI ouoiujI. Poluu vylvoiIlo uzI-
valoIslou liIuu a clcolo jI uml soiIaIIzoval, iocllo sI nco o IclIo iololoIu, ahyslo vuII, luy
a jal so voIajI nsIouujIcI socIInI molouy.
* PiI znovuvylvionI soiIaIIzovanolo ohjollu musI Pyllon nojuiIvo vylvoiIl novy ohjoll, lloiy
vyau jalo lon soiIaIIzovany, a olom musI naslavIl lounoly vsocl jolo aliIhulu. Moloua
__getnewargs__() iIuI zusoh vylvionI ohjollu. Moloua __setstate__() olo iIuI ohnovonI
lounol aliIhulu.
B.11. TiIuy, lloio molou hyl ouzIly v hIolu with
BIol with uoIInujo ooiacnI lonloxl (iunlImo conloxl). ,Vsluujomo uo nj (onloi) v olamzIlu iov-
unI iIlazu with a ,vysluujomo z nj (oxIl) o iovouonI osIounIlo iIlazu v jolo hIolu.
To, co chceme Take napeme A Python zavol
uuIoj nco socIInIlo with x: x.__enter__()
iI vsluu uo hIolu vIll
uuIoj nco socIInIlo with x: x.__exit__(exc_type, exc_value,
iI oouslnI hIolu vIll traceback)
B.1u. TiIuy, lloio ouoiujI soiIaIIzacI
B.11. TiIuy, lloio molou hyl
ouzIly v hIolu with
Poznmky To, co chceme Take napeme A Python zavol
uzIvaloIsl loIo ohjollu copy.copy(x) x.__copy__()
uzIvaloIsl loIo ohjollu copy.deepcopy(x) x.__deepcopy__()
uo lIouhly (uoo coy)
* zjIslnI slavu ohjollu pickle.dump(x, file) x.__getstate__()
iou soiIaIIzacI
* soiIaIIzaco ohjollu pickle.dump(x, file) x.__reduce__()
* soiIaIIzaco ohjollu (novy pickle.dump(x, file, x.__reduce_ex__(protocol
soiIaIIzacnI iololoI) protocol_version) _version)
* lonlioIa nau vylvionIm ohjollu x = pickle.load(file) x.__getnewargs__()
hlom uosoiIaIIzaco (unIclIIng)
* ohnovonI slavu ohjollu x = pickle.load(file) x.__setstate__()
o uosoiIaIIzacI
419
Ohial with souhoi Iungujo nsIouovn:
# vatek z io.py
def _checkClosed(self, msg=None):
'''Internal: raise an ValueError if file is closed
'''
if self.closed:
raise ValueError('I/O operation on closed file.'
if msg is None else msg)
def __enter__(self):
'''Context management protocol. Returns self.'''
self._checkClosed() }1]
return self }2]
def __exit__(self, *args):
'''Context management protocol. Calls close()'''
self.close() }8]
}1] Ohjoll souhoiu uoIInujo jal molouu __enter__(), lal molouu __exit__(). Moloua __enter__()
lonlioIujo, zua jo souhoi olovion. Poluu no, vyvoI moloua _checkClosed() vyjImlu.
}2] Moloua __enter__() hy mIa lomi vzuy vilIl self, coz jo ohjoll, lloiy huuo v hIolu with
ouzIl io icI s vIaslnoslmI (iooilIos) a l voInI molou.
}8] Po ulonconI hIolu with so souhoiovy ohjoll aulomalIcly uzavio. Jal so lo uuI V molou
__exit__() so zavoI self.close().
> Moloua __oxIl__() so zavoI vzuy, uolonco I luyz jo uvnIli hIolu with vyvoIna vyjImla.
Vo slulocnoslI jo lo lal, zo iI vyvoInI vyjImly jo InIoimaco o vyjImco iouna molou
__exit__(). DaIsI uolaIIy naIoznolo vo slanuaiunI uolumonlacI: With Stutomont Cnntoxt
Munugors (sivcI lonloxlu iIlazu vIll).
O sivcIcl lonloxlu so uozvIlo vIc v cslI AulomalIclo zavIinI souhoiu a PiosmiovnI slanuaiunI-
lo vysluu.
B.11. TiIuy, lloio molou hyl
ouzIly v hIolu with
Ka.
420
B.12. Oiavuu osoloiIclo vcI
Poluu vImo, co uImo, muzomo zIslal lomi Inou lonlioIu nau lIm, jal jsou liIuy oiovnvny, jal
jsou uoIInovny aliIhuly a jaly uiul liIu so ovazujo za ouliIuy nasI liIuy.
* OloInoslI lolo, luy iosn Pyllon voI socIInI molouu __del__(), jsou nouviIloIn lomII-
lovano. Ahyslo lomu oiozumII In, musIlo vul, jalym zusohom Pyllon sIouujo ohjolly
v amlI. Tauy najuolo uohiy cInol n mochunismu uutnmutickhn uvnlnvn pumti (gaihago
coIIoclIon) a n dostruktnroch trd v |uzyco Pythnn (angIIcly). MII hyslo sI lalo iocIsl o sIahycl
ioIoioncIcl (voal ioIoioncos), o mouuIu weakref a navicl iavuouohn lalo o mouuIu gc.
B.18. Piocllo sI
MouuIy zmInno v lolo iIIozo (slanuaiunI uolumonlaco):
- Mndul zipfile
(lll:lluocs.yllon.oigly8llIIhiaiylzIIIIo.llmI)
- Mndul cgi
(lll:lluocs.yllon.oigly8llIIhiaiylcgI.llmI)
- Mndul collections
(lll:lluocs.yllon.oigly8llIIhiaiylcoIIoclIons.llmI)
B.12. Oiavuu osoloiIclo vcI
B.18. Piocllo sI
Poznmky To, co chceme Take napeme A Python zavol
lonsliulloi liIuy x = MyClass() x.__new__()
* uosliulloi liIuy del x x.__del__()
uoIInoval jon uicIlo aliIhuly x.__slots__()
uzIvaloIsl los-lounola hash(x) x.__hash__()
zIslal lounolu vIaslnoslI x.color type(x).__dict__['color'].
(iooily) __get__(x, type(x))
naslavIl lounolu vIaslnoslI x.color = type(x).__dict__['color'].
'PapayaWhip' __set__(x, 'PapayaWhip')
ziusIl vIaslnosl del x.color type(x).__dict__['color'].
__del__(x)
zlonlioIoval, zua jo njaly ohjoll isinstance MyClass.__instancecheck__(x)
(x, MyClass)
InslancI nasI liIuy
zlonlioIoval, zua jo njal liIua issubclass MyClass.__subclasscheck__(C)
ouliIuou nasI liIuy (C, MyClass)
zlonlioIoval, zua jo njal liIua issubclass(C, MyABC) MyABC.__subclasshook__(C)
ouliIuou nasI ahsliallnI
hzovo liIuy
421
- Mndul math
(lll:lluocs.yllon.oigly8llIIhiaiylmall.llmI)
- Mndul pickle
(lll:lluocs.yllon.oigly8llIIhiaiylIclIo.llmI)
- Mndul copy
(lll:lluocs.yllon.oigly8llIIhiaiylcoy.llmI)
- Mndul abc (,Ahsliacl Baso CIassos; ahsliallnI hzovo liIuy)
(lll:lluocs.yllon.oigly8llIIhiaiylahc.llmI)
DaIsI Iollo clonI (slanuaiunI uolumonlaco):
- Fnrmut Spocificutinn Mini-Lunguugo (mInIjazyl io socIIIlacI Ioimlu)
(lll:lluocs.yllon.oiglioIoasol8.1lIIhiaiylsliIng.llmI)
- Pythnn dutu mndol (yllonovsly ualovy mouoI)
(lll:lluocs.yllon.oiglioIoasol8.1lioIoioncolualamouoI.llmI)
- Built-in typos (zahuuovano lyy)
(lll:lluocs.yllon.oiglioIoasol8.1lIIhiaiylslulyos.llmI)
- PEP 87: Allnwing Any Ob|oct tn bo Usod fnr Slicing (jal umoznIl lazuomu ohjollu
hyl ouzIl io iozy)
(vvv.yllon.oigluovloslo-u87l)
- PEP 8110: Intrnducing Abstruct Buso Clussos (vou uo ahsliallnIcl hzovycl liIu)
(vvv.yllon.oigluovloslo-811ul)
B.18. Piocllo sI
422
423
C. m pokraovat
C. PiIIola
Go forth on your path, as it exists
only through your walking.
(JuI uI svou coslou, iolozo
la oxIslujo jon ou lvymI lioly.)
Sv. AuguslIn z HIo (iIIsovno)
424
Ohsal iIIoly
C. m pokraovat 423
C.1. DooiucujI l ioclonI 425
C.2. Kuo lIoual lou lomalIhIInI s Pyllonom 8 426
425
C.1. DooiucujI l ioclonI
V lolo lnIzo so holuzoI nomuzu zahyval vsomI slinlamI jazyla Pyllon 8. NaslslI muzolo vsuuo najIl
mnolo nuloinycl, voIn uoslunycl ucohnIc.
Doloiloiy:
- Functinn Docnrutnrs AiIoI OilIz (uoloiloiy IunlcI)
(lll:lliogiammInghIls.yllonhIogs.coml27_iogiammInghIlslaiclIvolu_IunclIon_uocoia-
lois.llmI)
- Mnro nn Functinn Docnrutnrs AiIoI OilIz (vIco o uoloiloiocl IunlcI)
(lll:lliogiammInghIls.yllonhIogs.coml27_iogiammInghIlslaiclIvol1_moio_on_IunclI-
on_uocoialois.llmI)
- Churming Pythnn: Docnrutnrs muko mugic ousy DavIu Moilz (uoloiloiy s magIclou IolloslI)
(vvv.Ihm.comluovoIooivoilslIInuxlIIhiaiylI-cuocoi.llmI)
- Functinn Dofinitinns (uoIInIco IunlcI) v oIIcIInI yllonovslo uolumonlacI
(lll:lluocs.yllon.oiglioIoioncolcomounu_slmls.llmIIunclIon)
VIaslnoslI (iooilIos):
- Tho Pythnn property builtin Auam Gomaa
(lll:llauam.gomaa.uslhIogl2uu8laugl11lllo-yllon-iooily-huIIlInl)
- Gottors/Sottors/Fuxnrs Ryan Tomaylo
(lll:lllomaylo.comlviIlIngslgollois-sollois-Iuxois)
- property() functinn v oIIcIInI yllonovslo uolumonlacI
(lll:lluocs.yllon.oiglIIhiaiylIunclIons.llmIiooily)
DosliIloiy:
- Hnw-Tn Guido Fnr Doscriptnrs Raymonu HollIngoi
(lll:llusois.icn.comlyllonluovnIoaulDosciIloi.llm)
- Churming Pythnn: Pythnn ologunco und wurts, Purt Z DavIu Moilz
(vvv.Ihm.comluovoIooivoilslIInuxlIIhiaiylI-yllon-oIoganco-2.llmI)
- Pythnn Doscriptnrs Mail SummoiIIoIu
(vvv.InIoimIl.comlailIcIosliInloiIiIonuIy.asx=18uu28u)
- Invnking Doscriptnrs v oIIcIInI yllonovslo uolumonlacI
(lll:lluocs.yllon.oigly8llioIoioncolualamouoI.llmI)
VIlna a muIlIiocosIng:
- Mndul threading
(lll:lluocs.yllon.oigly8llIIhiaiylllioauIng.llmI)
- threading Munugo cnncurront throuds
(vvv.uougloIImann.comlPyMOTWlllioauIngl)
- Mndul multiprocessing
(lll:lluocs.yllon.oigly8llIIhiaiylmuIlIiocossIng.llmI)
C.1. DooiucujI l ioclonI
426
- multiprocessing Munugo prncossos liko throuds
(lll:llvvv.uougloIImann.comlPyMOTWlmuIlIiocossIngl)
- Pythnn throuds und tho Glnbul Intorprotor Lnck Josso NoIIoi
(lll:lljossonoIIoi.coml2uuulu2lu1lyllon-llioaus-anu-llo-gIohaI-Inloiioloi-Iocll)
- Insido tho Pythnn GIL (vIuoo) DavIu BoazIoy
(lll:llhII.lvlIIIol228241u)
MolaliIuy:
- Motucluss prngrumming in Pythnn DavIu Moilz a MIcloIo SImIonalo
(vvv.Ihm.comluovoIooivoilslIInuxlIIhiaiylI-ymola.llmI)
- Motucluss prngrumming in Pythnn, Purt Z DavIu Moilz a MIcloIo SImIonalo
(vvv.Ihm.comluovoIooivoilslIInuxlIIhiaiylI-ymola2l)
- Motucluss prngrumming in Pythnn, Purt 8 DavIu Moilz a MIcloIo SImIonalo
(vvv.Ihm.comluovoIooivoilslIInuxlIIhiaiylI-ymola8.llmI)
A navIc IanlaslIcly iuvouco mnola mouuIy zo slanuaiunI yllonovslo lnIlovny ou Douga
HoIImana Pythnn Mndulo nf tho Wook (lll:llvvv.uougloIImann.comlPyMOTWlconlonls.llmI).
C.2. Kuo lIoual lou lomalIhIInI s Pyllonom 8
Pyllon 8 jo ioIalIvn novy, lalzo o lomalIhIInI lnIlovny jo nouzo. Tauy jsou njal mIsla, luo muzo-
lo lIoual lou, lloiy Iungujo s Pyllonom 8 (vso angIIcly).
- Pythnn Puckugo Indox: soznam haIIclu io Pyllon 8
(lll:llyI.yllon.oiglyI:aclIon=hiovso8c=888slov=aII)
- Pythnn Cnnkbnnk: soznam iocolu oznaclovanycl ,yllon8
(lll:llcouo.aclIvoslalo.comliocIoslIangslyllonllagslyllon8l)
- Gnnglo Prn|oct Hnsting: soznam iojollu oznaclovanycl ,yllon8
(lll:llcouo.googIo.comlloslInglsoaiclq=IahoI:yllon8)
- SnurcoFnrgo: soznam iojollu vylIouanycl ouIo ,Pyllon 8
(lll:llsouicoIoigo.nollsoaicllvoius=22yllon+822)
- GitHub: soznam iojollu vylIouanycl ouIo ,yllon8 (a lalo ouIo ,yllon 8)
(llls:llgIlluh.comlsoaicllyo=RoosIloiIos8Ianguago=yllon8q=yllon8)
(llls:llgIlluh.comlsoaicllyo=RoosIloiIos8Ianguago=yllon8q=yllon+8)
- BitBuckot: soznam iojollu vylIouanycl ouIo ,yllon8 (a ouIo ,yllon 8)
(lll:llhIlhuclol.oiglioolaIIlnamo=yllon8)
(lll:llhIlhuclol.oiglioolaIIlnamo=yllon+8)
C.2. Kuo lIoual lou lomalIhIInI
s Pyllonom 8
427
D. Odstraovn problm
D. PiIIola
Wheres the ANY key?
(Kuo jo LI BOVOLN lIvosa)
iIIsovno luolomu
428
Ohsal iIIoly
D. Odstraovn problm 427
D.1. Ponoimo so 429
D.2. Jal so uoslal l iIlazovomu iulu 429
D.8. SuslnI Pyllonu z iIlazovolo iulu 429
429
D.1. Ponoimo so
D O P S A T
D.2. Jal so uoslal l iIlazovomu iulu
V coIo lnIzo so sollvmo s iIlIauy souslnI Pyllonu z iIlazovolo iulu. AIo jal so mlo l iIla-
zovomu iulu uoslal
V LInuxu so ouIvojlo uo monu Applications a lIouojlo iogiam zvany Terminal. (Muzo so naclzol
v oumonu jalo Accessories noho System.)
V Mac OS X naIoznolo v auiosiI /Application/Utilities/ aIIlacI nazvanou Terminal.app. Dosla-
nolo so lam lal, zo lIIlnolo na iacovnI Ioclu, oloviolo monu Go, vyhoiolo Go to folder... (iojIl
uo auiosio) a naIsolo /Applications/Utilities/. Nalonoc olIoolo na iogiam Terminal.
Vo WInuovs lIIlnolo na Start, vyhoiolo oIozlu Spustit..., naIsolo cmd a slIslnolo ENTER.
D.8. SuslnI Pyllonu z iIlazovolo iulu
JalmIIo so uoslanolo na iIlazovy iuol, mII hyslo hyl sclonI suslIl yllonovsly InloiallIvnI
sloII. V LInuxu noho v Mac OS X naIslo na iIlazovy iuol python3 a slIslnlo ENTER. Vo WInuovs
naIslo na iIlazovy iuol c:\python31\python a slIslnlo ENTER. Poluu ujuo vso uohio, mII hyslo
vIul nco lalovolo:
you@localhost:~$ python3
Python 3.1 (r31:73572, Jul 28 2009, 06:52:23)
[GCC 4.2.4 (Ubuntu 4.2.4-1ubuntu4)] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>>
(Az huuolo cllIl yllonovsly InloiallIvnI sloII ouslIl a vilIl so na iIlazovy iuol, naIslo exit()
a slIslnlo ENTER. Tonlo ohial Iungujo na vsocl IalIoimcl.)
Poluu zozoiujolo clyhu ,iIlaz nonaIozon (commanu nol Iounu), znamon lo, zo iavuouohn
nomlo Pyllon 8 naInslaIovn.
you@localhost:~$ python3
bash: python3: command not found
D.1. Ponoimo so
D.2. Jal so uoslal l iIlazovomu iulu
D.8. SuslnI Pyllonu z iIlazovolo iulu
430
Poluu so uo yllonovslolo InloiallIvnIlo sloIIu uoslanolo, aIo cIsIo voizo noouovIu vasomu oco-
lvnI, mlo mozn naInslaIovnu vIco noz jounu voizI Pyllonu. Slv so lo sIs na syslomocl LInux
a Mac OS X, luo muzo hyl slaisI voizo Pyllonu iouInslaIovna. PosIounI voizI muzolo naInslaIoval,
anIz hyslo musoII slaisI voizI mazal (molou hyl hoz iohIomu InslaIovny vouIo soho), aIo iI sousl-
nI Pyllonu z iIlazovolo iulu so al musIlo vyjuiIl iosnjI.
NaiIlIau na svom uomcIm IInuxovom sliojI mm naInslaIovno nloIIl voizI Pyllonu, ahycl
na nIcl molI olosloval soIlvaio, lloiy vylviIm. Kuyz clcI suslIl uicIlou voizI, muzu nasal
python3.0, python3.1 noho python2.6.
mark@atlantis:~$ python3.0
Python 3.0.1+ (r301:69556, Apr 15 2009, 17:25:52)
[GCC 4.3.3] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> exit()
mark@atlantis:~$ python3.1
Python 3.1 (r31:73572, Jul 28 2009, 06:52:23)
[GCC 4.2.4 (Ubuntu 4.2.4-1ubuntu4)] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> exit()
mark@atlantis:~$ python2.6
Python 2.6.5 (r265:79063, Apr 16 2010, 13:57:41)
[GCC 4.4.3] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> exit()
D.8. SuslnI Pyllonu z iIlazovolo iulu
431
432
2u1u Mail PIIgiIm
Ponome se do Python(u) 3
DIvo Inlo Pyllon 8
Layoul Jan Svohoua 3e[|one
VyuaI CZ.NIC, z. s. . o.
AmoiIcl 28, 12u uu Piala 2
www.nic.cz
ISBN: u78-8u-uu4248-2-1
LuIco CZ.NIC
KnIlu jo mozno ohjounal na knihy.nic.cz
433
434
Edice CZ.NIC
O autorovi Mark Pilgrim se nesmazateln zapsal do povdom pythonovsk komunity u svoj knihou
Dive Into Python, ve kter originlnm a nezapomenutelnm zpsobem piblil tenm osobit styl
programovn v tomto jazyce, aby se o nkolik let pozdji pipomenul jet vraznji s knihou Dive Into
Python 3, kter je stejn originlnm a zbavnm zpsobem vnovna jeho nejnovj verzi. S podobnm
nadenm se vak zabv i dalmi tmaty, jeho nejnovj kniha HTML5: Up & Running je tivm
vodem do problematiky poslednho hitu na poli pedvn informac na Internetu standardu HTML5.

O edici Edice CZ.NIC je jednm z osvtovch projekt sprvce esk domny nejvy rovn. Clem
tohoto projektu je vydvat odborn, ale i populrn publikace spojen s internetem a jeho technologiemi.
Krom titnch verz vychz v tto edici souasn i elektronick podoba knih. Ty je mon najt
na strnkch knihy.nic.cz
M
a
r
k

P
i
l
g
r
i
m


P
o
n
o

m
e

s
e

d
o

P
y
t
h
o
n
(
u
)

3
E
d
i
c
e

C
Z
.
N
I
C
Edice CZ.NIC
3
Ponome se do Python(u) 3
Mark Pilgrim
Dive Into Python 3 knihy.nic.cz
D
i
v
e

I
n
t
o

P
y
t
h
o
n

3
ISBN: 978-80-904248-2-1
Python
NIC_python3_cover_v6_full.indd 1 11/18/10 6:05:19 PM
Process CyanProcess MagentaProcess YellowProcess BlackPANTONE 636 C