Obálka

Python
Kompletní příručka jazyka pro verzi 3.8

Naposledy aktualizováno:    2020-01-18 – 10:34

Obsah

 


Účel a cíl publikace

Publikace podrobně probírá jazyk Python a jeho možnosti včetně těch,
na které v jiných učebnicích již nezbývá místo.
Python vznikl jako jazyk, který měl laikům usnadnit vstup do světa programování
a umožnit jim s co nejmenším úsilím vytvářet jednoduché programy.
Jak jeho obliba rostla, rostly i požadavky na rozšíření jeho schopností.
Většina učebnic Pythonu však zůstává u výkladu jeho základních možností.

Tato příručka se snaží představit jazyk Python hlouběji,
aby v ní uživatelé našli potřebné informace i v okamžiku,
kdy začnou své původně jednoduchých programy zdokonalovat
a budou se potřebovat seznámit s konstrukcemi,
které jim usnadní další vylepšování jejich dítek.

Kniha je koncipována tak, aby mohla zpočátku sloužit jako učebnice
a později jako referenční příručka.
Tím, že se soustředí především na výklad jazyka,
může vše vysvětlit podrobněji a do větší hloubky, než je v učebnicích zvykem.
Veškerý výklad je prokládán příklady,
na nichž jsou probírané konstrukce a rysy jazyka demonstrovány.



Soubory ke stažení

Pokud vám nebude ve vašich programech něco fungovat, podívejte se sem,
jestli na podobný problém nenarazil už někdo před vámi,
a jestli proto není k dispozici novější verze.
Verzi poznáte podle data a případně podle jemu předcházejícího čísla verze
v mém verzovacím systému.

K dispozici jsou následující soubory:

 

Doplňkové texty (co se do knihy nevešlo)

Většinou to jsou podrobnější vysvětlení některých pasáží výkladu
doplněná jako reakce na dotazy čtenářů,
kterým nepřipadá některá pasáž dostatečně srozumitelná.

Tak, jak budou postupně přicházet žádosti o upřesnění výkladu,
budou se postupně rozšiřovat i tato upřesňující vysvětlení.

Obsah


 

Syntaktické diagramy

Doplněk k pasáži Koncepce výkladu na straně 23

V přiloženém dokumentu je stručně popsán způsob zápisu syntaktických diagramů.
Vše je demonstrováno na syntaxi zápisu čísel.

Text najdete v souboru 60R_Python_Add_SyntaxDiagrams_v1.00.8269_2020-01-17.pdf,

 

Použití výrazu yield a funkce send()

 
V tomoto textu je podrobněji probrána problematika základní definice generátorů
a speciálně pak, jak pracuje výraz yield vracející hodnotu.

Text najdete v souboru 60R_Python_Add_Yield_v1.00.8262_2020-01-09.pdf,
doprovodné programy v souboru mAd_01_Yield.py.

 

Alternativní formát a vedoucí nuly

 
V této pasáži jsem zapomněl zmínit význam znaku 0 uvedeného na konci prvního řádku
syntaktického diagramu 17.4 na stránce 263.

Význam je jednoduchý: zadáteli ji, budou se mezi případné znaménko a číslo vkládat vedoucí nuly.
Má tedy stejný význam, jako když zadáte zarovnání 0= použitém na stránce 269
ve výpisu 17.9 v příkazu na řádcích 5–7.
 

Nejčastější dotazy (FAQ)

Tato sekce je určena pro odpovědi na vaše nejčastější dotazy.
Budete-li mít nějaký dotaz nebo upozornění na chybu, pošlete mi
mail s předmětem začínajícím 60_PYTHON_DOTAZ
Bude-li se dotaz týkat něčeho obecnějšího, zveřejním zde odpověď i pro ty ostatní.


 

Errata – opravy odhalených chyb

Nejprve se musím čtenářům omluvit. Jak jsem spěchal, aby rukopis odevzdal co nejdříve po vydání
verze 3.8, tak jsme přehlédl, že jsem několika úpravami v programech zanesl do textu nesoulad
mezi podobami doprovodných programů a textem knihy. Tento nesoulad, bohužel, neměl redaktor šanci
odhalit a upozornit mne na nutnost nápravy. Opravy proto uvádím v následující pasáži,
kde jsou prozatím chyby, jež jsem s velkým zahanbením odhalil sám nebo mne na ně upozornili kolegové,
kteří ode mne dostali autorské výtisky. Už ale začala chodit i první upozornění od všímavých čtenářů,
kterým za ně tímto děkuji. Pokusím se, aby alespoň v elektronické verzi byla většina odstraněna,
protože z jejich množství na mne jdou mrákoty.

Protože je odhalených chyb více, než je mi milo a než jsem ze svých knížek zvyklý,
rozdělil jsem sekci oprav na dvě části: v první z nich jsou opravy závažnějších chyb,
ve druhé pak opravy nejrůznějších překlepů, kterých si občas běžný čtenář ani nevšimne,
a opravy špatných odvolávek na čísla řádků, jež vznikly v důsledku některých úprav v programech,
které jsem při zapracování do textu přehlédl, ale při nichž se jednou drobnou změnou zanesla do textu
velá řada chybných čísel řádků najednou. Jelikož se většinou jedná o posun o jeden řádek,
pevně věřím, že tyto chyby čtenáře nezmatou, a proto jsem je zařadil mezi překlepy.

 

Obsah

 

Způsob značení

Pozici chybného místa v knize budu u běžného textu deklarova číslem stránky následovaným pořadím odstavce
na stránce a pořadím inkriminovaného řádku v daném odstavci.
Bude-li pořadové čáíslo odstavce či řádku záporné, označuje pořadí od konce stránky, resp. odstavce.
budeli kladné, označuje pořadí od počátku. Např. text

Strana 43, odst -5, řádek +1

bude označovat 1. řádek shora v 5. odstavci odspodu na stránce 43.
V případě výpisu programu bude místo toho uvedeno číslo výpisu a číslo řádku ve výpisu - např.

Strana 145, výpis 8.16, řádek 17

Při počítání odstavců je celý výpis (bez popisku) brán jako jeden odstavec
(popisek je brán jako samostatný odstaec).
V sekci V knize: bude uveden celý řádek s chybou (v případě potřeby i více řádků)
a chybný text (slovo či část věty) bude podtržený.

Bude-li někdy potřeba další vysvětlení nebo nějaká pomocná informace,
bude umístěna hned za navigaci (číslo stránky, odstavce, řádku) a bude vysazena kurzivou.
 

Důležité opravy

Strana 43, odst -5, řádek +1
V knize:
\t Vodorovný tabulátor (TAB nebo HT – kód \x07).
Správně:
\t Vodorovný tabulátor (TAB nebo HT – kód \x09).
 

Strana 162, odst. -4, řádek -4
V knize:
příkazu, tří rozšiřujících příkazů a příkazu else. V definici funkce aktivita1 (řádky
Správně:
příkazu, tří rozšiřujících příkazů a příkazu else. V definici funkce akt1 (řádky
 

Strana 162, odst. -4, řádek -2
V knize:
příslušné hlavičky, v definici funkce aktivita2 (řádky 14 až 26) jsou těla definována na
Správně:
příslušné hlavičky, v definici funkce akt2 (řádky 14 až 26) jsou těla definována na
 

Strana 171, odst. +1, řádek -1
V knize:
funkce je použita větev else.
Správně:
funkce def sum3xE() je použita větev else.
 

Strana 178, odst +4, řádek +12
V knize:
12 >>> for x in iterator: print(x, end=' ')
Správně:
12 >>> for x in iter: print(x, end=' ')

 

Strana 348, odst +6, řádek +1
V knize:
Výpis 23.4: Definice třídy v60_23_04_cClassDceraB v modulu m23_01_Diamant
Správně:
Výpis 23.4: Definice třídy DceraB v modulu m23_01_Diamant
 
 

Překlepy

Strana 80, odst -3, řádek +1
V knize:
Jak naznačují reakce na příkazy na řádcích 15 a 16, datové typy jsou hodnotami
Správně:
Jak naznačují reakce na příkazy na řádcích 15 a 17, datové typy jsou hodnotami
 

Strana 98, odst -2, řádek +1
V knize:
Na řádku 2 je zadán příkaz assert s pravdivou podmínkou. Podle očekávání
Správně:
Na řádku 3 je zadán příkaz assert s pravdivou podmínkou. Podle očekávání
 

Strana 98, odst -1, řádek +1
V knize:
Na řádku 3 je příkaz zadán s chybnou podmínkou, avšak prozatím bez upřesňující
Správně:
Na řádku 4 je příkaz zadán s chybnou podmínkou, avšak prozatím bez upřesňující
 

Strana 99, odst -4, řádek +3
V knize:
odlišily texty od Windows, od Pythonu a od uživatele, jsou texty od Windows vysazeny
Správně:
odlišily texty systému Windows od textů platformy Python a od textů zadaných uživatelem, jsou texty od Windows vysazeny
 

Strana 104, odst -2, řádek +1
V knize:
atributy modulu, v němž se nachází kód, který tento atribut používá.
Správně:
atributy modulu, v němž se nachází kód, který tyto atributy používá.
 

Strana 105, odst +4, řádek -1
V knize:
takže úplný název obsahuje celou sérii kvalifikací.
Správně:
takže úplný název může obsahovat celou sérii kvalifikací.
 

Strana 106, odst -1, řádek +2
V knize:
želvy o 50 bodů vpřed a na řádku 9 příkaz dalšímu posunu a otočení. Výslednou
Správně:
želvy o 50 bodů vpřed a na řádku 9 příkazy k otočení a dalšímu posunu. Výslednou
 

Strana 112, odst -3, řádek +1,+2
V knize:
Když jej však na řádku 5 explicitně importujeme, tak na zopakovaný příkaz na
řádku 5 již Python odpoví podpisem daného modulu.
Správně:
Když jej však na řádku 6 explicitně importujeme, tak na zopakovaný příkaz na
řádku 7 již Python odpoví podpisem daného modulu.
 

Strana 112, odst -1, řádek (+8)-(+12)
Narušené číslování řádků programu.
V knize:
 7 >>> builtins
 8 ´<module 'builtins' (built-in)>
 1 >>> int, builtins.int
 9 (<class 'int'>, <class 'int'>)
10 >>> int is builtins.int
11 True
12 >>>

    
Správně:
 7 >>> builtins
 8 <module 'builtins' (built-in)>
 9 >>> int, builtins.int
10 (<class 'int'>, <class 'int'>)
11 >>> int is builtins.int
11 True
13 >>>

 

Strana 114, odst -1 řádek +1,+2
V knize:
Zdrojový text na řádcích 26–44 výpisu 7.7.je pouze pomocný a obsahuje string
s různými verzemi příkazů na řádcích 14–16. Ty budeme používat v podkapitole
Správně:
Zdrojový text na řádcích 27–45 výpisu 7.7.je pouze pomocný a obsahuje string
s různými verzemi příkazů na řádcích 13–15. Ty budeme používat v podkapitole
 

Strana 118, odst +4 řádek +1
V knize:
Příkaz na řádku 18 je výrazový příkaz. Kdybychom jej zadali v interaktivním režimu,
Správně:
Příkaz na řádku 20 je výrazový příkaz. Kdybychom jej zadali v interaktivním režimu,
 

Strana 118, odst +4 řádek -1
V knize:
informace o jeho průběhu, použijte funkci print(), jak je tomu např. na řádcích 19–20.
Správně:
informace o jeho průběhu, použijte funkci print(), jak je tomu např. na řádcích 22–23.
 

Strana 121, odst +6, řádek +1,+2, odst +7 řádek +1,+4
V knize:
Upravte definice proměnných modulu m07_01_Modul na řádcích 14–16 výpisu 7.7 na straně 115 (řádek 13 s komentářem uvádím pouze pro snazší orientaci) do tvaru:

13 # Definice proměnných – atributů
14 text = 'Druhá verze'
15 num = 23_456
16 txt2 = 'Stále druhá verze'
Správně:
Upravte definice proměnných modulu m07_01_Modul na řádcích 13–15 výpisu 7.7 na straně 115 (řádek 12 s komentářem uvádím pouze pro snazší orientaci) do tvaru:

12 # Definice proměnných – atributů
13 text = 'Druhá verze'
14 num = 23_456
15 txt2 = 'Stále druhá verze'

 

Strana 122, odst +4, řádek +2
V knize:
řádku 14, zobrazující výsledek testu z předchozího řádku, jedná se o týž objekt.
Správně:
řádku 12, zobrazující výsledek testu z předchozího řádku, jedná se o týž objekt.
 

Strana 123, odst +1, řádek +2
V knize:
110), takže při použití pouhého import…from nemohu použít funkci reload(), protože
Správně:
110), takže při použití pouhého from…import nemohu použít funkci reload(), protože
 

Strana 123, odst +7, řádek +2, odst +8, všechny řádky, odst +9, řádek +1
V knize:
odkomentujte řádek 11 a příkazy na řádcích 14–16 upravte do tvaru:
13 # Definice proměnných – atributů
14 text = 'Třetí verze'
15 num = 3_456 / 0
16 txt2 = 'Stále třetí verze'
Všimněte si chyby na řádku 15 – je záměrná, protože se chystáme otestovat načtení
Správně:
odkomentujte řádek 10 a příkazy na řádcích 13–15 upravte do tvaru:

12 # Definice proměnných – atributů
13 text = 'Třetí verze'
14 num = 3_456 / 0
15 txt2 = 'Stále třetí verze'
Všimněte si chyby na řádku 14 – je záměrná, protože se chystáme otestovat načtení
 

Strana 123, odst -6, řádek +2
V knize:
odkomentovaného příkazu na řádku 11 výpisu 7.7 na straně 115. Příkaz tiskne
Správně:
odkomentovaného příkazu na řádku 10 výpisu 7.7 na straně 115. Příkaz tiskne
 

Strana 123, odst -5, řádek +2
V knize:
15. Tentokrát je delší a zabírá ve výpisu řádky 4–14.
Správně:
14. Tentokrát je delší a zabírá ve výpisu řádky 4–14.
 

Strana 123, odst -3, řádek -2
V knize:
nakonec na řádcích 12–13 dozvíme, že se interpret pokusil provést řádek 13 v souboru
Správně:
nakonec na řádcích 12–13 dozvíme, že se interpret pokusil provést řádek 14 v souboru
 

Strana 123, odst -1, řádek +1
V knize:
Řádek 15 pak informuje, že odhalenou chybou je dělení nulou.
Správně:
Řádek 14 pak informuje, že odhalenou chybou je dělení nulou.
 

Strana 124, odst +2, řádek 12
V knize:
12   File "P:\60_PGM\_SRC\m07_01_Modul.py", line 17, in 
Správně:
12   File "P:\60_PGM\_SRC\m07_01_Modul.py", line 14, in 

 

Strana 124, odst +5, řádek +1
V knize:
Demonstruje to příkaz na řádku 16, který tiskne hodnoty všech atributů. Atribut
Správně:
Demonstruje to příkaz na řádku 15, který tiskne hodnoty všech atributů. Atribut
 

Strana 124, odst -3, řádek +2, odst -2, řádek +1
V knize:
13 # Definice proměnných – atributů
14 text = 'Čtvrtá verze'
15 num = 0456
16 txt2 = 'Stále čtvrtá verze'
(číslo na řádku 15 chybně začíná nulou), systém by chybu odhalil již při pokusu
Správně:
12 # Definice proměnných – atributů
13 text = 'Čtvrtá verze'
14 num = 0456
15 txt2 = 'Stále čtvrtá verze'
(číslo na řádku 14 chybně začíná nulou), systém by chybu odhalil již při pokusu
 

Strana 128, odst +5, řádek +1
V knize:
Výpis 8.1: Defince bezparametrické funkce
Správně:
Výpis 8.1: Definice bezparametrické funkce
 

Strana 145, výpis 8.16, řádek 17
V knize:
17     """Definice funkce přilepná k předchozí."""
Správně:
17     """Definice funkce přilepená k předchozí."""

 

Strana 145, výpis 8.16, řádek 24
V knize:
24     """Defince odsazená oproti předchozí podle konvencí."""
Správně:
24     """Definice odsazená oproti předchozí podle konvencí."""

 

Strana 146, odst -2, řádek +2,+4
Číslování se mělo vzhledem k prvnímu řádku výpisu posunou o jednitku.
V knize:
Na řádcích 110 je zde
definována funkce vnější(), v jejímž těle je na řádcích 37 definována vnitřní
funkce vnitřní1(). V té je pak na řádku 5 definována její vnitřní funkce vnitřní2().
Správně:
Na řádcích 2 až 11 je zde
definována funkce vnější(), v jejímž těle je na řádcích 4 až 8 definována vnitřní
funkce vnitřní1(). V té je pak na řádku 6 definována její vnitřní funkce vnitřní2().
 

Strana 186, odst +3, řádek +1
V knize:
Na řádku 6 je uvedeno, že prvotním příkazem byl příkaz na prvním řádku 35. příkazu
Správně:
Na řádku 7 je uvedeno, že prvotním příkazem byl příkaz na prvním řádku 35. příkazu
 

Strana 186, odst +4, řádek +1
V knize:
Na následujícím řádku výpisu (řádek 7) se dozvíme, že text onoho spouštěcího
Správně:
Na následujícím řádku výpisu (řádek 8) se dozvíme, že text onoho spouštěcího
 

Strana 186, odst +6, řádek +1, -1
V knize:
Následující řádek (8) říká, že dalším příkazem na cestě k chybě byl příkaz na řádku
...
na řádku 9 prozrazuje, že text tohoto příkazu je
Správně:
Následující řádek (9) říká, že dalším příkazem na cestě k chybě byl příkaz na řádku
...
na řádku 10 prozrazuje, že text tohoto příkazu je
 

Strana 186, odst +8, řádek +1
V knize:
Jinými slovy: volá se funkce _exec() z modulu _bootstrap. Řádek 10 nám oznamuje,
Správně:
Jinými slovy: volá se funkce _exec() z modulu _bootstrap. Řádek 11 nám oznamuje,
 

Strana 186, odst -3, řádek -2, -1
V knize:
řádku 13 se dozvídáme, že se vykonávání programu přesunulo do našeho modulu,
kde se zaseklo na řádku 13, protože narazilo na příkaz (viz řádek 14)
Správně:
řádku 14 se dozvídáme, že se vykonávání programu přesunulo do našeho modulu,
kde se zaseklo na řádku 13, protože narazilo na příkaz (viz řádek 15)
 

Strana 186, odst -4, řádek -1
V knize:
řádku 15 sděluje.
Správně:
řádku 16 sděluje.
 

Strana 187, odst -1, řádek -1
V knize:
řádek 15 ve výpisu 7.12 na straně 124).
Správně:
řádek 14 ve výpisu 7.12 na straně 124).
 

Strana 207, Výpis 12.10, řádek 1, 2, 17, 19
(Mississippi se píše se dvěma p.)
V knize:
 1  >>> mis = list('Mississipi');   mis
    2  ['M', 'i', 's', 's', 'i', 's', 's', 'i', 'p', 'i']
 3  >>> mis.index('s'),   mis.index('s', 4)
 4  (2, 5)
 5  >>> mis.index('p',0,6)
 6  Traceback (most recent call last):
 7    File "", line 1, in 
 8      mis.index('p',0,6)
 9  ValueError: 'p' is not in list
10  >>> lp = list('Python');   lp[1]='a';   lp[3]='t';   lp
11  ['P', 'a', 't', 't', 'o', 'n']
12  >>> lp.insert(3, 'h');   lp
13  ['P', 'a', 't', 'h', 't', 'o', 'n']
14  >>> lp.pop(4),   lp.pop(),   lp
15  ('t', 'n', ['P', 'a', 't', 'h', 'o'])
16  >>> mis.remove('i');   mis
17  ['M', 's', 's', 'i', 's', 's', 'i', 'p', 'i']
18  >>> mis.remove('i');   mis
19  ['M', 's', 's', 's', 's', 'i', 'p', 'i']
20  >>>

 
Správně:
 1  >>> mis = list('Mississippi');   mis
 2  ['M', 'i', 's', 's', 'i', 's', 's', 'i', 'p', 'p', 'i']
 3  >>> mis.index('s'),   mis.index('s', 4)
 4  (2, 5)
 5  >>> mis.index('p',0,6)
 6  Traceback (most recent call last):
 7    File "", line 1, in 
 8      mis.index('p',0,6)
 9  ValueError: 'p' is not in list
10  >>> lp = list('Python');   lp[1]='a';   lp[3]='t';   lp
11  ['P', 'a', 't', 't', 'o', 'n']
12  >>> lp.insert(3, 'h');   lp
13  ['P', 'a', 't', 'h', 't', 'o', 'n']
14  >>> lp.pop(4),   lp.pop(),   lp
15  ('t', 'n', ['P', 'a', 't', 'h', 'o'])
16  >>> mis.remove('i');   mis
17  ['M', 's', 's', 'i', 's', 's', 'i', 'p', 'p', 'i']
18  >>> mis.remove('i');   mis
19  ['M', 's', 's', 's', 's', 'i', 'p', 'p', 'i']
20  >>>

 

Strana 361, Výpis 24.1, řádek 6
V knize:
6         a jmenovatelem) a bude mít kladného jmenovatlele."""
Správně:
6         a jmenovatelem) a bude mít kladného jmenovatlele."""

 

Strana 370, Výpis 24.7, řádek 12
V knize:
12             raise ValueError("Hodnotu konstany nelze měnit")
Správně:
12             raise ValueError("Hodnotu konstanty nelze měnit")

 

Strana 371, Výpis 24.8, řádek 15, 16
V knize:
15     raise ValueError("Hodnotu konstany nelze měnit")
16 ValueError: Hodnotu konstany nelze měnit
Správně:
15     raise ValueError("Hodnotu konstanty nelze měnit")
16 ValueError: Hodnotu konstanty nelze měnit

 

Strana 381, Výpis 25.5, řádek 24
V knize:
24 lass singletonCLS():
Správně:
24 class singletonCLS():

 

Strana 386, Výpis 26.1, řádek 5
V knize:
5         print(f'Vytvořen desriptor s výchozí hodnotou «{initval}»')
Správně:
5         print(f'Vytvořen deskriptor s výchozí hodnotou «{initval}»')

 

Strana 387, Výpis 26.2, řádek 9, 10
V knize:
 9 Vytvořen desriptor s výchozí hodnotou «První»
10 Vytvořen desriptor s výchozí hodnotou «Druhý»
Správně:
 9 Vytvořen deskriptor s výchozí hodnotou «První»
10 Vytvořen deskriptor s výchozí hodnotou «Druhý»

 

Strana 419, odst +1, řádek +1
V knize:
Výpis 29.3: Definice metody xxx ve třídě YYY
Správně:
Výpis 29.3: Analýza datových typů