Upozornění pro čtenáře a uživatele této knihy

Všechna práva vyhrazena. Žádná část této tištěné či elektronické knihy nesmí být reprodukována a šířena v papírové, elektronické či jiné podobě bez předchozího písemného souhlasu nakladatele. Neoprávněné užití této knihy bude trestně stíháno.

Automatizovaná analýza textů nebo dat ve smyslu čl. 4 směrnice 2019/790/EU a použití této knihy k trénování AI jsou bez souhlasu nositele práv zakázány.

Rudolf Pecinovský

Začínáme programovat v jazyku Python

Druhé, přepracované a rozšířené vydání

Vydala Grada Publishing, a.s.

U Průhonu 22, Praha 7

obchod@grada.cz, www.grada.cz

tel.: +420 234 264 401

jako svou 8412. publikaci

Odpovědný redaktor: Petr Somogyi

Fotografie na obálce Depositphotos/novotnyfi

Grafická úprava a sazba Rudolf Pecinovský

Počet stran 320

Druhé, přepracované a rozšířené vydání, Praha 2022

Vytiskla tiskárna PBtisk a.s. Příbram

© Grada Publishing, a.s., 2022

Cover Design © Grada Publishing, a. s., 2022

Cover Photo © Depositphotos/novotnyfi

Názvy produktů, firem apod. použité v knize mohou být ochrannými známkami nebo registrovanými ochrannými známkami příslušných vlastníků.

ISBN 978-80-271-4752-6 (ePub)

ISBN 978-80-271-4751-9 (pdf)

ISBN 978-80-271-3609-4 (print)

Mé ženě Jarušce a dětem

Štěpánce, Pavlínce, Ivance a Michalovi

Poděkování

Vím, že se v českých knížkách většinou neděkuje, ale tvorba knih v současném tempu je spojena s takovými oběťmi řady lidí z mého blízkého i vzdálenějšího okolí, že bych měl velkou újmu na duši, kdybych tak neučinil.

Chtěl bych především nesmírně poděkovat své ženě Jarušce, která byla po celou dobu mojí největší oporou a jejíž nekonečná trpělivost a vstřícnost mi pomohla dokončit knihu v termínu, který se příliš nelišil od toho, jejž jsme původně s nakladatelem dohodli, a ne až někdy za rok po něm. Původně jsem se domníval, že s druhým vydáním nebude moc práce. Šeredně jsem se zmýlil, protože veškeré úpravy, které jsem se rozhodl do knihy zanést (a že jich bylo požehnaně), musely zapadnout do předchozího textu.

Na vylepšování textu nového vydání se ale podílela řada dalších lidí. Mezi nimi musím poděkovat především těm, kteří si dali tu práci a při objevení chyby v minulém vydáni mi o ní napsali. Mezi nimi pak především Luďkovi Šťastnému, který po celou přípravu rukopis pročítal a odhaloval v něm pasáže, které by si zasloužily vylepšit. Neméně pak děkuji Mirkovi Viriusovi, který celý finální rukopis pečlivě přečetl a objevil v něm několik přehlédnutí, za něž bych se po vydání styděl. Velkou zásluhu na současné podobě má i Jirka Kofránek, který mne upozornil na některé problémy s výukou podle minulého vydání a průběžně pak se mnou konzultoval problémy, na něž narazili jeho studenti. Svými poznámkami přispěl ke srozumitelnosti textu i Josef Froněk.

Svůj dík si zaslouží i Karina Mukhambetova, Iuliia Shestopalova, Paulina Znamenaková a Valeriia Zvezdina, které pročetly rukopis jako laické lektorky a upozorňovaly na pasáže, který byly hůře pochopitelné.

Velký dík patří i redaktoru Petrovi Somogyimu, který musel opakovaně procházet některé již zredigované pasáže, protože jsem je znovu a znovu upravoval. Nemalý dík patří i šéfredaktoru Radku Matulíkovi, který mne k napsání jednotlivých knih z posledních let vyhecoval, a byl pak ochoten týden či dva počkat, když se mi nepodařilo přesně dodržet původně dohodnutý termín.

Úvod

Python je moderní programovací jazyk, který umožňuje velmi jednoduše navrhovat jednoduché programy, ale na druhou stranu nabízí dostatečně mocné prostředky k tomu, abyste mohli s přiměřeným úsilím navrhovat i programy poměrně rozsáhlé. Je pro něj vyvinuto obrovské množství knihoven a frameworků, které uživatelům umožňují soustředit se na řešený úkol a nerozptylovat se vývojem nejrůznějších pomocných podprogramů.

Python je v současné době nejlepším jazykem pro ty, kteří se nechtějí živit jako programátoři, ale jejich profese či zájem je nutí jednou za čas něco naprogramovat. Potřebují proto jazyk, který se mohou rychle naučit a v němž budou moci rychle vytvářet jednoduché programy řešící (nebo pomáhající řešit) jejich problém. Na druhou stranu ale sílí i jeho využití profesionálními vývojáři pro rozsáhlé podnikové a webové aplikace.

Komu je kniha určena

Tato kniha je určena především těm, kteří ještě nikdy neprogramovali, anebo se je to sice někdo snažil naučit, ale oni už většinu látky zapomněli. Nepředpokládá žádné předběžné znalosti a dovednosti kromě základů práce s počítačem. Jejím cílem je předat čtenáři základní znalosti a naučit ho dovednosti potřebné k vytváření jednoduchých aplikací. Osvojené základy jim pak umožní, aby v případě hlubšího zájmu o programování v jazyku Python pokračovali některou z učebnic určených pro mírně pokročilé programátory – nejlépe samozřejmě mojí učebnicí [13] a doplňkovou příručkou [14].

Zkušenost však ukázala, že v této učebnici najdou řadu cenných informací i programátoři, kteří již mají jisté zkušenosti, ale kurzy, jimiž doposud prošli, se soustředily především na odpověď na otázku jak program zapsat, a oni by se nyní rádi dozvěděli také odpověď na otázku jak složitější program navrhnout.

Kniha je učebnicí programování. Učí své čtenáře navrhovat programy a dále je vylepšovat. Není učebnicí jazyka Python (tou je učebnice [13]), a proto se nesnaží probrat všechny jeho konstrukce, ale omezuje se při výkladu pouze na ty, jejichž zvládnutí je pro návrh jednoduché aplikace nezbytné.

Vedle konstrukcí jazyka ale učí čtenáře také řadu zásad moderního programování, jejichž zvládnutí je nutnou podmínkou pro všechny, kdo nehodlají zůstat u malých žákovských programů, ale chtějí se naučit efektivně vyvíjet robustní středně rozsáhlé aplikace, jejichž údržba nebude vést uživatele k chrlení nepublikovatelných výroků na adresu autora.

Dopředu se omlouvám, že se kniha částečně překrývá se zmíněnou příručkou [13]. Některé věci je prostě třeba vysvětlit jak naprostým začátečníkům v programování, pro něž je určena tato učebnice, tak těm, kteří jsou sice zkušení programátoři, ale potřebují na Python přejít z jiného jazyka nebo si prostě prohloubit své znalosti (pro ně jsem napsal knihu [13]).

Koncepce výkladu a jeho uspořádání

Kniha je koncipována tak, aby mohla sloužit jako středoškolská učebnice programování i jako učebnice pro samouky zajímající se o programování. Probírá vše potřebné od naprostých základů až po některé rysy, které se v běžných příručkách často neprobírají, ale jejichž znalost považuji za velmi užitečnou, protože pomáhá rychleji odhalit příčiny mnohých chyb.

Kniha je rozdělena do čtyř částí.

První část

První část probírá naprosté základy, bez jejichž znalosti nelze vytvořit ani velice jednoduchou aplikaci. Naučíte se v ní pracovat s čísly a texty a dozvíte se, jak používat funkce. Poté stručně probere naprosté základy používání objektů, bez nichž se v Pythonu nedá programovat, a na závěr vysvětlí, jak vytvářet moduly, abyste mohli své programy také ukládat a opakovaně používat.

Doprovodné programy v první části se nesnaží nic řešit. Jsou to vesměs AHA-příklady, tj. příklady, jejichž jediným cílem je, aby si čtenář řekl: „Aha, takto to funguje.“

Druhá část

V druhé části začnete vytvářet jednoduché programy. Naučí vás definovat vlastní funkce a postupně probere základní algoritmické konstrukce a datové struktury, mezi něž patří především různé druhy kontejnerů. Na závěr vysvětlí koncepci ošetřování chyb a předvede používání k tomu určených programových konstrukcí.

Na konci druhé části budete umět samostatně navrhnout a odladit jednoduchý program. Kdo bude chtít, může v tuto chvíli příručku na chvíli odložit a pustit se do vývoje svých programů. Ke studiu dalších částí se vrátí, až získá v programování Pythonu jisté zkušenosti a bude umět docenit témata probíraná v těchto částech.

Třetí část

Třetí část vás seznámí se základy objektově orientovaného programování. Vysvětlí, kdy začne být výhodný přechod na objektově orientované paradigma, probere základní vlastnosti objektů a tříd a naučí vás pravidla pro jejich vytváření a používání. Zvláštní kapitola je věnována dědění, jeho různým podobám a pravidlům a především jeho nástrahám. Poté pokračuje výkladem některých specifických konstrukcí a datových typů.

Na konci druhé části budete nadstandardně obeznámeni s objektově orientovaným paradigmatem a jeho implementací v Pythonu. Budete připraveni vytvářet rozsáhlejší aplikace, které by se vám bez schopnosti vytvářet vlastní třídy a objekty navrhovaly mnohem obtížněji.

Čtvrtá část

Hlavním cílem čtvrté části je procvičit probranou látku na nějaké netriviální aplikaci a při té příležitosti také naučit čtenáře několik klíčových zásad objektově orientovaného programování. Její text vás nejprve seznámí se základy objektově orientované architektury a s principem návrhových vzorů. Poté navrhne základní architekturu demonstrační aplikace a začne ji realizovat. Představí vám metodiku programování řízeného testy a ukáže, jak navrhnout vlastní test. Pak už bude třeba jenom opakovaně spouštět tento test, který vždy oznámí, kde je v programu další chyba, a postupným opravováním těchto chyb nakonec vyvinout celou aplikaci.

Na konci této části budete mít rozchozenou jednoduchou aplikaci realizující textovou konverzační hru a budete mít základní představu o tom, jako se objektově orientované aplikace navrhují.

Předposlední kapitola představí dva náměty, jak je možné aplikaci zdokonalit, a předvede realizaci těchto změnu. Poslední kapitola naznačuje některé další možnosti vylepšení a ukazuje učitelům, kteří by podle knihy chtěli učit, jak modifikovat vyvíjenou aplikaci, aby mohla sloužit jako příklad k závěrečným zkouškám.

Přílohy

V prvním vydání této učebnice bylo několik příloh. S nakladatelstvím jsme se dohodli, že stránky s těmito přílohami ušetříme a věnujeme výkladu. Čtenáři elektronických verzí najdou tyto přílohy přibalené na konci dokumentu, čtenáři papírové verze učebnice si je budou moci stáhnout z její webové stránky.

Potřebné vybavení

Pro úspěšné studium této knihy je vhodné mít instalovanou platformu Python ve verzi nejméně 3.10. Tu lze stáhnout na adrese https://www.python.org/downloads/. Při instalaci určitě zaškrtněte, že chcete instalovat „tcl/tk and IDLE“ a že chcete instalovat dokumentaci, i když se dá používat i on-line dokumentace na stránkách Pythonu.

U některých operačních systémů je instalace poněkud složitější, tak jsem se rozhodl, že budu šetřit místem a nejčastější odchylky shrnu v samostatném dokumentu na webových stránkách knihy.

Doprovodné programy

Text knihy je prostoupen řadou doprovodných programů. Budete-li si je chtít spustit a ověřit jejich funkci, potřebujete je nejprve stáhnout. Najdete je na stránce knihy na adrese[01] http://knihy.pecinovsky.cz/70_pythonvb2. Na stránce najdete i podrobný výklad obsahu doprovodných programů a řadu doplňkových textů.

Mezi jiným zde budou i soubory obsahující všechny výpisy programů v knize i s uvedenými čísly řádků. Tyto soubory vám mají usnadnit sledování rozboru některých programů, abyste si je mohli vytisknout, položit vedle knihy či čtečky a nemuseli při čtení rozboru programů neustále listovat mezi rozborem a rozebíraným výpisem.

Kromě toho tu najdete i PDF soubory s přílohami, o nichž jsem se zmiňoval před chvílí, a některé další doplňkové soubory.

Použité typografické konvence

K tomu, abyste se v textu lépe vyznali a také abyste si vykládanou látku lépe zapamatovali, používám několik prostředků pro odlišení a zvýraznění textu.

Termíny První výskyt nějakého termínu a další texty, které chci zvýraznit, vysazuji tučně.

Název Názvy firem a jejích produktů vysazuji kurzivou. Kurzivou vysazuji také názvy kapitol, podkapitol a oddílů, na něž v textu odkazuji.

Citace Texty, které si můžete přečíst na displeji, např. názvy polí v dialogových oknech či názvy příkazů v nabídkách, vysazuji tučným bezpatkovým písmem.

Odkaz Celá kniha je prošpikovaná křížovými odkazy na související pasáže. Není-li odkazovaný objekt (kapitola, obrázek, výpis programu, …) na stejné stránce nebo na některé ze sousedních stránek, je pro čtenáře tištěné verze doplněn o číslo stránky, na níž se nachází. Čtenářům elektronické verze stačí, když na něj klepnou. Použitý prohlížeč by je měl na odkazovaný objekt ihned přenést.

Adresa Názvy souborů a internetové adresy vysazuji obyčejným bezpatkovým písmem.

Program Identifikátory a další části programů zmíněné v běžném textu vysazuji neproporcionálním písmem, které je v elektronických verzích pro zvýraznění tmavě červené.

zadání V záznamech komunikace se systémem budou texty, které zadává uživatel, vysazeny tučně (v elektronických verzích pro zvýraznění tmavě modře).

>>>  Značná část výpisů zaznamenává konverzaci mezi uživatelem a interpretem jazyka. Výzvy interpretu k zadání příkazu jsou vysazeny s jiným podbarvením a barvou písma, aby je bylo možné snadno odlišit od zadání uživatele a odpovědi na zadaný příkaz.

Kromě výše zmíněných částí textu, které považuji za důležité zvýraznit nebo alespoň odlišit od okolního textu, najdete v knize ještě řadu doplňujících poznámek a vysvětlivek. Všechny budou v jednotném rámečku, jenž bude označen ikonou charakterizující druh informace, kterou vám chce poznámka či vysvětlivka předat.

Symbol jin-jang bude uvozovat poznámky, s nimiž se setkáte na počátku každé kapitoly. Zde vám vždy prozradím, co se v dané kapitole naučíte.

Píšící ruka označuje obyčejnou poznámku, která pouze doplňuje informace z hlavního proudu výkladu o nějakou zajímavost.

Ruka s hrozícím prstem upozorňuje na věci, které byste měli určitě vědět a na které byste si měli dát pozor, protože jejich zanedbání vás většinou dostane do problémů.

Usměváček vás bude upozorňovat na různé tipy, jimiž můžete vylepšit svůj program nebo zefektivnit svoji práci.

Mračoun vás naopak bude upozorňovat na různá úskalí programovacího jazyka nebo programů, s nimiž budeme pracovat, a bude vám radit, jak se těmto nástrahám vyhnout či jak zařídit, aby vám alespoň pokud možno nevadily.

Obrázek knihy označuje poznámku týkající se používané terminologie. Tato poznámka většinou upozorňuje na další používané termíny označující stejnou skutečnost nebo na konvence, které se k probírané problematice vztahují.

Brýle označují tzv. „poznámky pro šťouraly“, ve kterých se vás snažím seznámit s některými zajímavými vlastnostmi probírané konstrukce nebo upozorňuji na některé souvislosti, avšak které nejsou k pochopení látky nezbytné.

Odbočka – podšeděný blok

Občas je potřeba vysvětlit něco, co nezapadá přímo do okolního textu. V takových případech používám podšeděný blok se silnou čarou po straně. Tento podšeděný blok je takovou drobnou odbočkou od ostatního výkladu. Nadpis podšeděného bloku pak najdete i v podrobném obsahu mezi nečíslovanými nadpisy.

Zpětná vazba

Předem přiznávám, že tato kniha je sice druhým vydáním učebnice programování v jazyku Python, ale oproti prvnímu vydání je natolik přepracovaná, že je to vlastně nová kniha. Nelze proto vyloučit, že přestože knihu četlo několik lektorů, mohou se v ní objevit přehlédnutí, která nemá redaktor šanci zachytit a opravit.

Pokud vám proto bude někde připadat text nepříliš srozumitelný nebo budete mít nějaký dotaz (ať už k vykládané látce či použitému vývojovému prostředí), anebo pokud v knize objevíte nějakou chybu či budete mít návrh na nějaké její vylepšení, neostýchejte se poslat na adresu rudolf@pecinovsky.cz e-mail s předmětem 70_PYTHON_NZ_DOTAZ.

Bude-li se dotaz týkat něčeho obecnějšího nebo to bude upozornění na chybu, pokusím se co nejdříve zveřejnit na stránce knihy http://knihy.pecinovsky.cz/70_pythonvb2 odpověď i pro ostatní čtenáře, kteří by mohli o danou chybu zakopnout, nebo by je mohl obdobný dotaz napadnout za pár dní, anebo jsou natolik ostýchaví, že si netroufnou se sami zeptat.

Dopředu se ale omlouvám, že na poštu často odpovídám se značným zpožděním, protože jsem se nechal přemluvit k napsání několika dalších knih a rychleji to stihnout neumím.

Část A

Superzáklady

První část knihy vás seznámí se základními konstrukcemi jazyka Python, bez jejichž znalosti se při sestavování programu neobejdete. Nejprve poskytne základní informace o počítačích, programech a programovacích jazycích. Pak představí zadávání čísel a textů, naučí vás volat funkce, vysvětlí, jak pracovat s objekty, a na závěr ukáže, jak ukládat a načítat vaše programy.

Kapitola 1

Počítače a jejich programy

Co se v kapitole naučíte

Kapitola poskytuje základní přehled o historii způsobu vývoje počítačových programů a o základních termínech, které budu v textu knihy používat. Probírá rozdíl mezi překladači a interprety a objasňuje termín platforma. Na závěr vás seznámí se základními charakteristikami jazyka a platformy Python.

1.1Hardware a software

První počítače

První samočinný počítač řízený programem byl mechanický a navrhl jej v roce 1837 Charles Babbage. Tou dobou byl také publikován první program. Napsala jej Ada Lovelace a vyšel v jejích poznámkách překladatele ke knize o Babbageově stroji.

První fungující elektromechanický samočinný počítač zprovoznil v roce 1938 Konrad Zuse v Německu. V průběhu druhé světové války vznikly další počítače v Anglii a ve Spojených státech.

Po válce vznikl poměrně rychle trh s počítači. Počítače konstruovali převážně muži a programovaly je převážně ženy, protože řada mužů považovala programování za něco přízemního, co není hodno jejich intelektu. Situace se začala měnit až v šedesátých letech, protože se postupně ukazovalo, že podniky utratí mnohem více za programové vybavení než za vlastní počítač.

Navíc většina důvtipných řešení a patentů v oblasti hardwaru rychle zastarala a byla překonána mnohem důvtipnějšími řešeními někoho jiného, kdežto objevy na poli softwaru přežívaly celá desetiletí. V současné době se už proto hlavní vývoj neodehrává v oblasti hardwaru, ale softwaru.

Co je to program

Program bychom mohli charakterizovat jako v nějakém programovacím jazyku zapsaný předpis popisující, jak má procesor, pro nějž je program určen (v našem případě počítač), splnit zadanou úlohu.

Cílovým procesorem nemusí být vždy počítač. Oblíbeným příkladem programů jsou např. kuchařské předpisy. V předpočítačových dobách zaměstnávaly některé instituce (např. armáda) velké skupiny počtářů[02] řešících na mechanických kalkulačkách výpočty podle algoritmů, které dnes zakódujeme v nějakém programovacím jazyku a předhodíme počítači.

Na programu je důležité, že musí být napsán v nějakém programovacím jazyku, kterému rozumí programátor. V počátcích používání počítačů bylo nutné programovat ve strojovém kódu. Programátor si musel pamatovat kombinace čísel spouštějící jednotlivé instrukce počítače a ve správném pořadí je zadávat do počítače. To samozřejmě vedlo k velkému množství chyb.

Záhy proto vznikly programy, které umožňovaly zadat jednotlivé instrukce pomocí zkratek,[03] a takto zadaný program převedly do podoby, které rozuměl počítač. Takový program byl označován jako překladač (anglicky compiler), protože překládal zadání z tzv. jazyka symbolických instrukcí (JSI) do strojového kódu.

Toto zefektivnění práce se programátorům zalíbilo, začali proto vymýšlet, jak ještě více přiblížit způsob zápisu programu způsobu, jímž člověk přemýšlí. Postupně tak vznikaly stále dokonalejší vyšší programovací jazyky, které programátorům umožňovaly se maximálně soustředit na řešený problém, aniž by museli nějak výrazně uvažovat nad tím, jak bude počítač jejich program zpracovávat.

Vybrat jazyk pro kuchařský předpis je poměrně jednoduché, vybrat jazyk pro počítač je mnohem složitější. Vlastnosti použitého jazyka totiž naprosto zásadně ovlivňují jak rychlost vývoje programu, tak i rychlost a kvalitu výsledných programů. Proto také prošly programovací jazyky i metodiky jejich používání celou řadou revolučních změn.

Syntaxe – sémantika – paradigma

Při popisu programovacích jazyků se setkáte s řadou termínů. Tři klíčové termíny jsou:

•Syntaxe definuje, jak se zapisují jednotlivé konstrukce jazyka. Je to soubor pravidel definujících, jaké kombinace symbolů vedou ke správně zapsanému programu. Nijak se však netýkají toho, co bude onen správně zapsaný program dělat.

•Sémantika popisuje význam syntakticky správných textů v daném programovacím jazyce a způsob jejich interpretace – např.: „takto zadaný příkaz definuje, podle čeho se má program rozhodnout, jak bude pokračovat“.

•Paradigma označuje celkový přístup programátora k návrhu programu, jeho programovací styl a s tím spojenou sadu preferovaných programových konstrukcí. Různé programovací jazyky podporují různá paradigmata.

Používané paradigma není definováno používaným programovacím jazykem, ale způsobem přemýšlení při návrhu programu. Jazyk může pouze nabídnout nástroje, které používání daného paradigmatu usnadní.

Změny přístupu k tvorbě programů

Jak byly počítače postupně zdokonalovány, byly postupně nasazovány v dalších a dalších oblastech a programátoři pro ně vytvářeli stále dokonalejší programy. Programy byly čím dál rafinovanější a složitější, a to začalo vyvolávat velké problémy. Programátoři totiž přestávali být schopni své programy rozchodit, a když je vítězně rozchodili, nedokázali z nich v rozumném čase odstranit chyby, které uživatelé v programu objevili.

Tato krize vedla k zavádění nejrůznějších metodik a paradigmat, které měly jediný cíl: pomoci programátorům psát spolehlivé a snadno upravovatelné programy.

V padesátých letech minulého století se tak prosadily vyšší programovací jazyky, v šedesátých letech modulární programování, v sedmdesátých letech na ně navázalo strukturované programování a v průběhu osmdesátých a zejména pak devadesátých let ovládlo programátorský svět objektově orientované programování. To se široce používá dodnes, i když se od počátku tohoto století začíná v některých oblastech prosazovat také funkcionální programování, takže bychom mohli říci, že současné době kraluje objektově-funkcionální paradigma.

Teď jsem vás asi tou záplavou termínů vylekal, ale nebojte se. Během dalšího výkladu vás s jednotlivými paradigmaty seznámím a ukážu vám, ve kterých situacích je vhodné určité paradigma zvolit. Python je totiž multiparadigmatický jazyk, takže vás ve výběru vhodného paradigmatu nijak neomezuje.

V počátcích programování bylo hlavním cílem programátorů, aby jejich programy spotřebovaly co nejméně paměti a byly co nejrychlejší. Tehdejší počítače totiž měly paměti málo, byly z dnešního hlediska velice pomalé a jejich strojový čas byl drahý. Se stoupající složitostí programů však byly takto psané programy stále méně stabilní a stále hůře udržovatelné. Současně s tím, jak klesala cena počítačů, jejich strojového času i paměti, začínal být nejdražším článkem v celém vývoji člověk.

Cena strojového času a dalších prostředků spotřebovaných za dobu života programu začínala být pouze zlomkem ceny, kterou bylo nutné zaplatit za jeho návrh, zakódování, odladění a následnou údržbu. Začal se proto klást stále větší důraz na produktivitu programátorů, a to i za cenu snížení efektivity výsledného programu.

Důležitost čitelnosti programu

Prakticky každý program zaznamená během svého života řadu změn. Požadavky zákazníka na to, co má program umět, se většinou průběžně mění, a program je proto třeba průběžně upravovat, rozšiřovat a vylepšovat. Celé současné programování je proto vedeno snahou psát programy nejenom tak, aby pracovaly efektivně, tj. rychle a s minimální spotřebou různých zdrojů (operační paměť, prostor na disku, kapacita sítě atd.), ale aby je také bylo možné kdykoliv jednoduše upravit a vylepšit. A k tomu je třeba, aby byl program čitelný a srozumitelný, protože programátoři věnují mnohem více času čtení programu než jeho psaní.

Je přitom úplně jedno, jestli autor píše program pro někoho cizího, anebo jej píše pro sebe, protože jej chce použít při řešení nějakého problému. Každý program, který se osvědčí, nás po chvíli používání přivede na myšlenku jej vylepšit.

Problém je, že když se po čtvrt roce jiných aktivit ke svému programu vrátíte, zjistíte, že je to pro vás program úplně cizího člověka. Pokud jste jej nenapsali dostatečně přehledný, začnete pracně přemýšlet nad tím, jak jste to tenkrát mysleli a proč a jak jste realizovali tu kterou fintu.

„Napsat program, kterému porozumí počítač, umí každý trouba.

Dobrý programátor píše programy, kterým porozumí člověk.“[04]

Přesně k tomu se vás budu snažit vést v průběhu celého výkladu. Neustále vám proto budu vštěpovat zásadu CRIDP , což je zkratka z anglického Code Readability Increases Development Productivity – čitelnost kódu zvyšuje efektivitu vývoje.

1.2Překladače, interprety, platformy

Než se pustím do dalšího výkladu, měl bych ujasnit pár termínů, které budu v průběhu dalšího textu často používat.

Operační systém

Operační systém je sada programů, jejímž úkolem je zařídit, aby počítač co nejlépe sloužil zadanému účelu. Operační systémy osobních počítačů se snaží poskytnout co největší komfort a funkčnost jak lidským uživatelům, tak programům, které operační systém nebo tito uživatelé spouští. (Teď nehodnotím, jak se jim to daří.)

Operační systém se snaží uživatele (člověka nebo program) odstínit od hardwaru použitého počítače. Uživatel může střídat počítače, avšak dokud bude na všech stejný operační systém, bude si se všemi rozumět.

Při obsluze lidského uživatele to má operační systém jednoduché: člověk komunikuje s počítačem pomocí klávesnice, obrazovky, myši a případně několika dalších zařízení. Ty všechny může operační systém převzít do své správy a zabezpečit, aby se nejrůznější počítače chovaly vůči uživateli stejně.

U programů to má ale složitější. Programy totiž potřebují komunikovat nejenom s operačním systémem (např. když chtějí něco přečíst z disku nebo na něj něco zapsat), ale také přímo s procesorem, kterému potřebují předat své instrukce k vykonání. Problémem ale je, že různé procesory rozumí různým sadám instrukcí.

Platforma

Abychom věděli, že náš program na počítači správně poběží, musíme vědět, že počítač bude rozumět té správné sadě instrukcí a že na něm poběží ten správný operační systém. Kombinaci použitý hardware + operační systém budu v dalším textu označovat termínem platforma HWOS.

Platforma HWOS je speciálním případem obecnější počítačové platformy, kterou bychom definovali jako pracovní prostředí umožňující bezproblémovou činnost programů. Takováto obecnější platforma odstíní program, který na ní běží, od všeho (nebo alespoň téměř od všeho), co se děje „pod ní“ – např. od HWOS.

V současné době se dává často přednost oněm obecnějším platformám běžícím nad HWOS. Delší dobu byla nejrozšířenější takovou platformou Java. Běžní uživatelé se asi nejčastěji setkají s platformou jazyka JavaScript; ten ale sám běží často nad platformou definovanou příslušným prohlížečem.

Takovouto obecnější platformou je i Python. Jakmile na nějakém počítači instalujete Python, můžete na něm používat prakticky všechny programy vytvořené pro tuto platformu.

Programovací jazyky

Jak už jsme si řekli, pro zápis programů používáme nejrůznější programovací jazyky. Ty jsou vymýšleny tak, aby v nich mohl člověk co nejlépe popsat svoji představu o tom, jak má počítač splnit požadovanou úlohu.

Program zapsaný v programovacím jazyku pak musíme nějakým způsobem převést do podoby, které porozumí počítač. Podle způsobu, jakým postupujeme, dělíme programy na překládané a interpretované.

Překládaný program

U překládaných programů se musí napsaný program nejprve předat překladači (někdo dává přednost termínu kompilátor), který jej přeloží (zkompiluje), tj. převede do podoby, s níž si již daná platforma ví rady. Jinými slovy: musí jej přeložit do kódu příslušného procesoru a používat instrukce, kterým rozumí použitý operační systém. Přeložený program pak můžeme kdykoliv na požádání spustit.

Interpretovaný program

Naproti tomu interpretovaný program předáváme v podobě, v jaké jej programátor vytvořil, programu označovanému jako interpret. Ten obdržený program prochází a ihned jej také provádí – interpretuje jeho příkazy.

Porovnání

Výhodou překládaných programů je, že většinou běží výrazně rychleji, protože u interpretovaných programů musí interpret vždy nejprve přečíst kus programu, zjistit, co má udělat, a teprve pak může tento požadavek vykonat.

Výhodou interpretovaných programů bývá na druhou stranu to, že jim většinou nezáleží na tom, na jaké platformě běží. Stačí, když na daném počítači běží potřebný interpret. Mohli bychom říci, že platformou těchto programů je právě onen interpret.

Vytvoříte-li pro nový počítač interpret, můžete na něj vzápětí přenést i všechny programy schopné běhu nad tímto interpretem. Kdykoliv tyto programy po systému něco chtějí, požádají o to svoji platformu (interpret), a ta jim příslušné služby zprostředkuje. Takovým programům pak může být jedno, na jakém procesoru a pod jakým operačním systémem běží, protože se beztak „baví“ pouze se svou platformou.

Naproti tomu překládané programy se většinou musí pro každou platformu trochu (nebo také hodně) upravit a znovu přeložit. Při implementaci programu pro více platforem bývá někdy pracnost přizpůsobení programu jednotlivým platformám srovnatelná s pracností vývoje jeho první verze.

Hybridně zpracovávaný program

Vedle těchto základních druhů zpracování programů existuje ještě hybridní způsob zpracování, který se snaží sloučit výhody obou skupin. Při něm se program nejprve přeloží do jakéhosi mezijazyka, který je vymyšlen tak, aby jej bylo možné co nejrychleji interpretovat. Takto přeložený program je potom interpretován speciálním interpretem označovaným často jako virtuální stroj.[05] Ten je zodpovědný za maximálně efektivní interpretaci kódu připraveného překladačem.

Hybridní zpracování spojuje výhody obou kategorií. K tomu, aby v nich napsané programy mohly běžet na různých platformách, stačí pro každou platformu vyvinout potřebný virtuální stroj. Ten pak spolu s knihovnou vytváří vyšší, mnohem univerzálnější platformu. Je-li tento virtuální stroj dostatečně „chytrý“ (a to jsou v současné době prakticky všechny), dokáže odhalit často se opakující části kódu a někde stranou je přeložit, aby je nemusel pořád kolem dokola interpretovat.

Jazyk versus způsob zpracování

Na překládané, interpretované a hybridní bychom měli dělit způsoby zpracování vytvořených programů, avšak často se takto dělí i programovací jazyky. Je sice pravda, že to, zda bude program překládaný, interpretovaný nebo hybridní, není závislé na použitém jazyce, ale je to především záležitostí implementace daného jazyka, nicméně každý z jazyků má svoji typickou implementaci, podle které je pak zařazován.

Všechny jazyky mohou být implementovány všemi třemi způsoby a pro mnohé opravdu existují všechny tři druhy implementace. U většiny však typická implementace natolik výrazně převažuje, že se o těch ostatních prakticky nemluví. Klasický Basic je považován za interpretovaný jazyk, Java a Python za hybridní a jazyky C a Pascal za překládané.

Hybridní implementace jazyků se v posledních letech výrazně prosadila a hybridně zpracovávané jazyky jsou dnes králi programátorského světa. Vyvíjí v nich převážná většina programátorů a procento implementací v těchto jazycích neustále vzrůstá.

1.3Platforma Python

Kniha má sice v názvu, že je učebnicí programování v jazyku Python, ale samotný jazyk vám není k ničemu do té doby, než získáte nástroje k tomu, abyste jej mohli používat, tj. než si stáhnete jeho platformu.

Především potřebujete knihovnu, v níž jsou připravené podprogramy realizující nejčastější operace, abyste je nemuseli všechny vytvářet znovu sami. Pak potřebujete překladač, který váš program přeloží do interního jazyka označovaného jako bajtkód (bytecode) a propojí jej s použitými knihovnami. Nakonec potřebujete virtuální stroj, kterému přeložený program předáte, aby jej spustil.

To vše je součástí standardní instalace. Její součástí je i poměrně podrobná dokumentace s definicí jazyka, popisem instalovaných knihoven, jednoduchým tutoriálem a řadou dalších užitečných informací.

Součástí instalace je i nastavení operačního systému, aby textové soubory s některou z definovaných přípon začínajících py správně zpracoval. Spustíte-li Python z příkazového řádku v konzolovém okně zadáním příkazu python (stačí i pouhé py), spustíte základní interpret, v němž můžete hned zapisovat jednotlivé příkazy i celé programy. Jako vývojové prostředí je však základní interpret v konzolovém okně příliš těžkopádný a je vhodný maximálně pro spouštění jednotlivých skriptů.

Skripty

Termínem skript (anglicky script) označujeme spustitelný textový soubor obsahující kód v nějakém skriptovacím jazyce. Klíčové je, že tento soubor musí být spustitelný, tj. že na počítači musí existovat program, který umí tento soubor načíst a zadaný kód provést. Operační systém by pak měl umět poznat, kterému programu má zadaný soubor předat ke zpracování.

Python patří mezi skriptovací jazyky, tj. mezi jazyky, v nichž je možné zapisovat skripty. Soubory se skripty v jazyku Python by měly mít příponu py, jejich přeložené verze pak příponu pyc. Máte-li správě instalovaný Python, tak pokud takový soubor zadáte ke spuštění, měl by být spuštěn program Python, jenž kód v daném souboru provede.

Máte-li již instalovaný Python a stažené doprovodné soubory zmiňované v pasáži Potřebné vybavení, můžete si vše vyzkoušet. Otevřete složku, do níž jste umisťovali doprovodné programy, najděte v ní soubor m01a_script.py a poklepejte na něj, nebo zadejte jeho název v příkazovém řádku. Mělo by se otevřít okno konzoly s obsahem:

TotojeprvníspuštěnýskriptvPythonu.

Ažsitextpřečtete,stiskněteEnter.

StiskněteEnter

Dokumentace

Říkali jsme si, že součástí standardní instalace je i poměrně podrobná dokumentace. Přítomnost dokumentace je nesmírně důležitá (a troufám si tvrdit, že je jednou z příčin úspěchu jazyka), protože Python přichází (ostatně jako většina současných platforem) s obrovskou nabídkou možností, které si průměrný lidský mozek nedokáže zapamatovat. Proto jistě oceníte možnost rychlého získání potřebných informací jak o samotném jazyku, tak o instalovaných knihovnách. Navíc zde najdete i několik rad a doporučení.

Soubor s doprovodnou dokumentací má formát CHM (zkratka odvozená z Compiled HTML), což je starší formát Microsoftu pro tvorbu nápovědy, jehož popularita vedla k tomu, že byly vyvinuty programy umožňující jej číst i v jiných operačních systémech.

Uživatelé Windows najdou soubor s dokumentací v podsložce Doc složky, do níž instalovali Python. (Uživatelé ostatních operačních systémů to mají trochu složitější – odchylky jsou popsány na webu této učebnice.) Po svém spuštění otevře okno, jehož podobu pod operačním systémem Windows si můžete prohlédnout na obrázku 1.1. Prohlížeče těchto souborů však existují i pro ostatní platformy.

Dokumentace existuje i v jiných podobách. Na stránce https://docs.python.org/3/ najdete online dokumentaci a na stránce https://docs.python.org/3/download.html odkazy na soubory s dokumentací v různých formátech, které si můžete stáhnout.

Dokumentace je sice pouze anglicky, ale přiznejme si, že všichni, kdo se v současné době zajímají o informatiku, by měli umět anglicky alespoň pasivně, anebo se raději poohlédnout po jiném zaměstnání.

1.4Interpret spuštěný z příkazového řádku

Základní komunikace s interpretem Pythonu probíhá přes příkazový řádek. Jak už jsem řekl, interpret Pythonu spustíme zadáním příkazu python nebo py (viz obrázek 1.2). Pak můžeme zadávat příkazy.

Obrázek 1.1:

Okno s dokumentací platformy

Obrázek 1.2:

Spuštění interpretu z příkazového řádku Windows

Potěšitelné je, že od verze 3.6 přepíná Python konzoli Windows do kódování UTF-8 (kódová stránka 65001), takže odpadá otravné hlídání korektnosti kódování vstupů a výstupů. Ostatní operační systémy tyto problémy samozřejmě nemají, protože na UTF-8 přešly samy.

Po spuštění se zobrazí úvodní řádky oznamující spuštění interpretu následované řádkem s výzvou (anglicky prompt) k zadání příkazů, jejichž prostřednictvím získáte další informace nebo spustíte zadanou akci.

Výzvu tvoří čtveřice znaků „>>>“ (tři většítka následovaná mezerou). Když za ní něco napíšete a stisknete ENTER, interpret zadaný řádek zpracuje a zdá-li se mu, že jste zadali celý příkaz, vypíše na další řádek výsledek.

Odsazování

V Pythonu je (na rozdíl od většiny ostatních programovacích jazyků) důležité, jak moc daný řádek kódu odsadíte od levého kraje. Odsadíte-li jej méně nebo více, než je v danou chvíli potřeba, překladač se vzbouří a ohlásí syntaktickou chybu, tj. prohřešek proti pravidlům zápisu jazyka.

Příkaz zadávaný za výzvou >>> musí vždy začínat hned za výzvou bez jakýchkoliv úvodních mezer či tabulátorů, jak je předvedeno na řádku 1 ve výpisu 1.1, kde jsem zadal součet dvou čísel. Pokud bychom však před naše zadání vložili byť jedinou mezeru, jak je naznačeno na řádku 3, interpret ohlásí syntaktickou chybu.

Výpis 1.1: Komunikace s interpretem spuštěným v konzolovém okně

1>>>12+34

246

3>>>0

4File"<stdin>",line1

50

6IndentationError:unexpectedindent

7>>>(56

8...+78

9...)-100

1034

11>>>

Nevejde-li se nám celé zadání na řádek, musíme interpret včas varovat – např. tím, že otevřeme závorku. Po stisku klávesy ENTER pak interpret přečte řádek, zjistí, že ještě není ukončen (otevřená závorka není uzavřena), a připraví další řádek, v němž vypíše pokračovací výzvu tvořenou třemi tečkami a mezerou (viz řádky 8–9). Když při čtení řádku pozná, že zadání skončilo (v našem případě, že před ukončením řádku byla závorka uzavřena), celý blok textu přeloží a zpracuje a na následujícím řádku (u delšího výsledku na následujících řádcích) vypíše případný výsledek.

Všimněte si, že výsledek vypisuje od začátku řádku, kdežto všechny řádky příkazů jsou uvozené počáteční nebo pokračovací výzvou.

Výzvy budu ve výpisech programů podbarvovat jinou barvou než zbytek programu, abyste co nejsnadněji odlišili zadávaný kód od výzev programu.

1.5Zdrojové kódy

V této kapitole jsme spustili pouze jednoduchý demonstrační skript uložený v souboru m01a_script.py. Obsah jediného výpisu je v souborech s názvem m01__Programy.

Kapitola 2

Vývojová prostředí

Co se v kapitole naučíte

Kapitola vysvětlí, co to jsou vývojová prostředí a jakou pozici mezi nimi zaujímá prostředí IDLE, které je součástí standardní instalace. Zbytek kapitoly je věnován stručnému seznámení s prostředím IDLE a popisu základních odchylek v jeho ovládání v porovnání s prostředím příkazového řádku.

2.1Vývojové prostředí

Pro psaní skriptů můžete teoreticky využít jakýkoliv textový editor a následně komunikovat s interpretem spuštěným z příkazového řádku. Většina programátorů však dává přednost speciálním vývojovým prostředím označovaným IDE, což je zkratka z anglického Integrated Development Environment – integrované vývojové prostředí.

IDE tvoří sada programů, která nabízí řadu funkcí, jež vám pomohou vývoj programů výrazně zefektivnit. Především vám nabídne přiměřeně komfortní editor, v němž program napíšete, zprostředkuje překlad programu do interního mezijazyka i jeho následné spuštění a zobrazení případných výsledků. Užitečnou součástí jsou i programy, které vám usnadní hledání případných chyb.

Součástí základní instalace Pythonu je vývojové prostředí označované zkratkou IDLE, což je jméno jednoho z členů skupiny Monty Python, po níž se jazyk jmenuje. Nicméně později byl název vyložen jako zkratka z anglického Integrated Development and Learning Environment – integrované vývojové a vzdělávací prostředí.

Toto prostředí budu používat v následujícím výkladu, protože je předinstalované a protože se s ním velice jednoduše pracuje. Díky své jednoduchosti neodvádí pozornost čtenáře od probírané látky k vlastnostem použitého vývojového prostředí.

Ti z vás, kteří překonají počáteční nástrahy jazyka a budou chtít začít používat nějaký komfortnější nástroj, se mohou podívat do přílohy DVývojová prostředí pro psaní programů v Pythonu, kde najdou základní představení tří nejpoužívanějších IDE a odkaz na wikipedii se seznamem dalších. (Připomínám informace z pasáže Přílohy.)

2.2Prostředí IDLE

Jak už jsem ale řekl: my budeme v této učebnici používat prostředí IDLE, protože je součástí standardní instalace a navíc je ze všech nejjednodušší. Pojďme si je představit. Začneme jeho spuštěním.

Spuštění

Spouštěcí skript prostředí IDLE je v souboru #/Lib/idlelib/IDLE.pyw, kde symbol # zastupuje složku, kam jste instalovali Python. Přípona pyw znamená, že skript nepotřebuje spouštět okno konzole, protože komunikuje s uživatelem prostřednictvím grafického uživatelského rozhraní (GUI) využívajícího (mimo jiné) okna a myš. Standardní systémové vstupy a výstupy budou proto od programu odpojeny a vše, co by na ně program poslal, se ztratí.

Při práci se soubory se otevírací, resp. ukládací okno otevře ve složce, z níž byl skript spuštěn. Spusťte jej proto ze složky, v níž budete mít uloženy svoje programy, protože jinak se přístup prostředí k těmto programům zkomplikuje.

Optimální je definovat zástupce, kterého umístíte do složky se svými skripty a který IDLE spustí. Používáte-li Linux, budete si nejspíš umět nastavit potřebného zástupce otevírajícího IDLE a nastavujícího složku 70_INP se zdrojovými soubory jako aktuální. Používáte-li Windows, můžete využít mého zástupce v souboru !IDLE_Python_39.lnk. Tento zástupce je ale nastaven pro můj počítač, takže si jej budete muset otevřít a upravit podle uspořádání na vašem počítači. Případný návod najdete v příloze A.2Nastavování zástupce spouštějícího IDLE. (Opět připomínám informace z pasáže Přílohy.)

Základní popis

Prostředí IDLE je multiokenní prostředí, jehož okna mohou pracovat v jednom ze dvou režimů:

•Jedno z oken může pracovat v příkazovém režimu, který budu označovat jako interaktivní režim. V něm uživatel komunikuje přímo se systémem, tj. s interpretem jazyka Python. Uživatel v něm zadává příkazy a systém na každý zadaný příkaz ihned zareaguje a provede jej.

V dalším textu budu toto okno označovat jako příkazové okno. Příkazové okno může mít IDLE otevřené pouze jedno. Budete-li však chtít provádět několik věcí paralelně, můžete spustit několik instancí programu IDLE a v každé z nich pracovat nezávisle na ostatních.

•Ostatní okna mohou pracovat pouze v editačním režimu, v němž uživatel edituje zdrojové či datové soubory, které pak uloží a v interaktivním režimu použije. Budu je proto označovat jako editační okna.

Režim aktuálního okna poznáte podle titulkové lišty. Příkazové okno v ní má uvedenu verzi programu následovanou slovem Shell (viz obrázek 2.1). Editační okno v ní uvádí název otevřeného souboru následovaný pomlčkou, úplnou cestou k danému souboru a v kulatých závorkách uvedenou verzi Pythonu (viz obrázek 2.2).

Obrázek 2.1:

Okno vývojového prostředí IDLE se zadáním z výpisu 1.1

Režim otevřeného okna ovlivňuje i hlavní nabídku (nabídkovou lištu). Oba typy oken mají vlevo nabídku File a Edit. Příkazové okno pokračuje nabídkami Shell a Debug, zatímco editační okno má místo nich nabídky Format a Run. Poslední tři nabídky jsou opět shodné.

Mezi okny se přepínáte buď jejich aktivací na příkazovém panelu operačního systému (jednotlivá okna se zde vydávají za samostatné aplikace), anebo výběrem požadovaného cílového okna v nabídce Window (viz obrázek 2.2).

Obrázek 2.2:

Okno vývojového prostředí IDLE

Při prvním otevření bude mít okno takovou velikost, aby se v něm zobrazilo 40 řádků po 80 znacích. Zadáním příkazu Zoom Height nebo stiskem klávesové zkratky ALT+2 zvětšíte výšku okna na velikost displeje, opětovným zadáním tohoto příkazu je vrátíte do výchozí velikosti, a to i v případě, kdy mělo před zvětšením jinou velikost.

Dáváte-li přednost jiné výchozí velikosti okna, můžete ji nastavit v dialogovém okně Settings vyvolaném zadáním příkazu Option O Configure IDLE. Podrobněji již možnosti nastavení tohoto programu prozatím vysvětlovat nebudu; zájemci si jistě poradí sami, i když třeba s trochou experimentování. Jenom bych upozornil, že některá nastavení (mezi nimi právě velikost okna) se uplatní až po zavření a následném spuštění programu.

Příkazové okno

Nenastavíte-li ve výše zmíněném okně Settings něco jiného, tak se po spuštění aplikace otevře příkazové okno (viz obrázek 2.1), v němž se zobrazí úvodní řádek následovaný řádkem s výzvou k zadání příkazů, jejichž prostřednictvím získáte další informace, a řádkem s výzvou k zadání příkazu tvořenou trojící znaků >>>.

Na obrázku 2.1 to sice vypadá, že se příkazové okno otevře se čtyřmi řádky úvodního textu, ale to je jenom proto, že se první řádek do okna nevešel, a tak jej program zalomil a pokračoval na druhém řádku. Pokud byste uchopili svislý okraj okna a okno roztáhli, přetékající konec prvního řádku by se vrátil na své místo.

Opětné zadání dříve zadaných příkazů

IDLE umožňuje jednoduše zadat dříve zadaný příkaz, aniž bychom jej museli opisovat. Nabízí k tomu dvě cesty:

Prorolujeme-li se v příkazovém okně do historie, klepneme myší na příkaz, který bychom chtěli znovu zadat, a stiskneme ENTER, příkaz se zkopíruje k poslední výzvě. Zabírá-li více řádků, zkopíruje se celý, tj. všechny jeho řádky.

My jej pak můžeme editovat (např. opravit nějakou chybu) a zadat znovu. Vyzkoušejte si to.

Druhou cestu nabízejí klávesové zkratky ALT+P a ALT+N. První umožňuje zadat předchozí příkaz (při opakovaném stisku postupně procházíte seznamem příkazů), druhá příkaz, který v seznamu následuje za právě vybraným.

Restart interaktivního systému

V interaktivním režimu je občas výhodné smazat všechny výsledky pokusů a začít znovu. Používáme-li interpret z příkazového řádku, nezbyde nám, než jej vypnout a opět zapnout.

IDLE je vůči uživateli vstřícnější a nabízí příkaz Restart Shell v nabídce Shell, anebo stisk klávesové zkratky CTRL+F6.

Po zadání tohoto příkazu se za text vloží řádek s čárou z rovnítek přerušenou uprostřed textem RESTART: Shell. Od tohoto okamžiku se interpret chová stejně, jako kdybyste jej právě spustili.

Tento příkaz sice restartuje virtuální stroj, ale IDLE si nadále pamatuje příkazy zadávané před restartem a umožňuje nám je jednoduše zadávat prostřednictvím klávesových zkratek ALT+P a ALT+N.

Ukázky ve výpisech jsou většinou koncipovány tak, že žádný restart nevyžadují, a mnohé na sebe dokonce navazují. Pokud by někdy byl potřeba restart, vždy na to výslovně upozorním.

Uložení záznamu seance

IDLE umožňuje uložit záznam aktuální seance do souboru. To se může hodit v případech, kdy se dostanete do potíží a potřebujete se s někým poradit, kde děláte chybu, nebo když naopak chcete někomu ukázat, jak má postupovat: co má zadávat a co může po svých zadáních od systému očekávat.

Záznam seance uložíte příkazem Save nebo Save As… v nabídce File. IDLE otevře dialogové okno a nabídne vám uložit soubor s příponou souboru py. Pro záznam seance bych ale tuto příponu určitě nepoužíval, protože je to přípona vyhrazená pro zdrojové soubory Pythonu. Záznam seance ale zdrojovým souborem není, protože vedle vašich příkazů obsahuje i odpovědi systému a jeho následné výzvy (>>>) k zadání dalšího příkazu. Zvolte proto raději příponu txt nebo nějakou jinou vhodnou příponu, která nebude uživatele ani systém mást (já používám příponu pyrec).

Po uložení obsahu se příkazové okno s daným souborem sdruží a název souboru se zobrazí v titulkové liště okna. Při příštím zadání příkazu Save se soubor aktualizuje. Příkazem Save As… uložíte soubor pod novým jménem a ihned s ním okno sdružíte. Chcete-li průběžně ukládat mezistavy do jiných souborů, aniž byste měnili aktuální sdružení okna se souborem, použijte příkaz Save Copy As….

Editační okno

Editační okno je sice primárně určeno k tvorbě zdrojových souborů modulů (o modulech začneme hovořit v kapitole 5Moduly a práce s nimi), ale můžete v něm zobrazovat a/nebo upravovat libovolný textový soubor.

V nabídce Options můžete příkazem Hide Line Numbers vypnout číslování řádků. Příkaz se tím automaticky změní na Show Line Numbers, jehož zadáním číslování řádků opět zapnete.

Teď trochu předběhnu, protože bych zde chtěl uvést pohromadě všechny důležité příkazy, které by se vám mohly hodit. Prozradím vám proto, že v téže nabídce je také příkaz Show Code Context, po jehož zadání se nahoře objeví podšeděný řádek, v němž se budou zobrazovat hlavičky otevřených složených příkazů, které mají příkaz svého těla zobrazen v horním řádku editačního okna. Bude-li daný příkaz uvnitř vnořeného složeného příkazu, tak se počet řádků tohoto pole zvětší, aby se v něm mohly zobrazit hlavičky všech otevřených složených příkazů.

S prvním složeným příkazem se sice seznámíte až v podkapitole 6.2Definice funkce, ale příkaz Show Code Context začne být poprvé užitečný, až budeme ve výpisu 5.4 analyzovat první vlastní modul. Pak vám jej připomenu.

Umístění editovaných souborů

Jak už jsem naznačil v pasáži Spuštění, chcete-li otevřít zdrojový soubor, IDLE jej implicitně hledá v aktuální složce (adresáři), tj. ve složce, z níž jste prostředí spustili. Doporučuji vám proto zařídit (například vhodným nastavením zástupce), aby se prostředí spouštělo ve složce, v níž máte umístěné zdrojové soubory.

Já se nakonec rozhodl umístit všechny doprovodné programy do složky 70_PGM a tu substituovat jako disk P.[06] Zde jsou zdrojové soubory doprovodných programů umístěny ve složce 70_INP, soubory se záznamy seancí ve složce 70_REC a soubory s kopiemi výpisů z knihy včetně čísel řádků ve složce 70_WRD.

Barevné zvýraznění textu

Jednou z výhod IDLE oproti používání příkazového řádku je i to, že barevně zvýrazňuje zadávaný i vypisovaný text, aby byl pro uživatele přehlednější a srozumitelnější. Způsob tohoto zvýraznění, tj. přiřazení barev popředí a pozadí jednotlivým druhům textu, si můžete nastavit. O toto zvýraznění vás v následujících výpisech doprovodných programů bohužel ochudím. Zadáte-li ale tyto texty do okna IDLE, budou barevně zvýrazněny.

Použité písmo

Při psaní kódu je nesmírně důležité zapisovat přesně to, co chcete počítači sdělit. Mnohá písma ale neumožňují zkontrolovat, zda jsem napsal přesně to, co jsem chtěl, protože zobrazují některé znaky stejně. Při programování je důležité používat písmo, které jednoznačně odliší nulu a velké O. Stejně tak je důležité odlišit znak velké I od malého L a jedničky.

Velmi často používané písmo Courier dobré rozlišení těchto znaků nenabízí – snadno se v něm zamění nejenom nula s O, ale také jednička s malým L (O0 – Il1 # MOJE×M0JE; 321×32l).

O něco lépe je na tom písmo Consolas definované v Microsoftu. To již nulu od O výrazně odlišuje, ale s odlišením jedničky od malého L máme stále problém (O0 – Il1 # MOJE×M0JE; 321×32l).

Z písem, která jsem měl možnost poznat, dopadlo zatím nejlépe písmo Source Code Pro (O0 – Il1 # MOJE×M0JE; 321×32l). To je navíc volně k dispozici, takže nemáte-li na svém počítači písmo s vhodnými vlastnostmi, můžete si je stáhnout a instalovat. Toto písmo je použito i v této knize (tedy pokud nepoužíváte e-knihu ve formátu EPUB, který s tím má občas problémy).

Doporučuji vám proto, abyste si ve svých editorech, které používáte k psaní kódu, nastavili právě toto písmo. V programu IDLE toho dosáhnete zadáním příkazu Options O Configure IDLE. V následně otevřeném dialogovém okně pak na kartě Fonts/Tabs vyberete v seznamu Font Face požadované písmo a stiskem OK své zadání potvrdíte.

2.3 IDLE versus příkazový řádek

Chování interpretu spouštěného z konzoly a interpretu v příkazovém panelu IDLE se poněkud liší:

•Interpret spouštěný z konzoly zpracovává zadávané příkazy řádek za řádkem, takže když nějaký řádek zadáte špatně, již se nemůžete vrátit, abyste jej opravili. Na druhou stranu ale umožňuje zadat ze schránky celou sérii řádků, které postupně řádek za řádkem zpracuje.

•Příkazové okno IDLE vám sice u víceřádkových příkazů umožňuje vracet se k předchozím řádkům a upravovat je, ale na druhou stranu zpracovává vždy jen jeden příkaz. Vložíte-li proto ze schránky několik po sobě jdoucích příkazů, vnímá je jako jeden nekorektně zadaný příkaz a ohlásí syntaktickou chybu.

Zobrazování výpisů programů

Ve výpisu 2.1 je zopakován výpis 1.1 ze strany 37 zobrazující reakci interpretu spuštěného v příkazovém řádku. Ve výpisu 2.2 je pak zobrazeno stejné zadání v podobě, v jaké jej zobrazuje IDLE. Nevím jak vám, ale mně připadá výpis 2.1 přehlednější, protože je v něm lépe odlišeno zadání uživatele od odpovědi interpretu. Při dalším výkladu proto budu sice používat IDLE, ale v zájmu co nejvyšší přehlednosti budu výpisy zobrazovat ve formátu interpretu z příkazového řádku.

Výpis 2.1: Komunikace s interpretem spuštěným v konzolovém okně

1>>>12+34

246

3>>>0

4File"<stdin>",line1

50

6IndentationError:unexpectedindent

7>>>(56

8...+78

9...)-100

1034

11>>>

Výpis 2.2: Komunikace s interpretem v příkazovém okně IDLE

1>>>12+34

246

3>>>0

4...

5SyntaxError:unexpectedindent

6>>>(56

7...+78

8...)-100

934

10>>>

2.4Zdrojové kódy

Zadávané příkazy i obsah výpisů se záznamem komunikace s interpretem probíhající v této kapitole najdete v souborech nazvaných m02__Vývojová_prostředí.

Kapitola 3

Zadávání hodnot a proměnné

Co se v kapitole naučíte

Kapitola vám předvede, jak zadávat čísla a texty. Naučí vás vytvářet proměnné, do nichž můžete zadané hodnoty uložit. Vysvětlí vám, jak je to v Pythonu s hodnotami a odkazy na ně, a objasní, co je to literál. Na závěr vás seznámí s jednou z nejdůležitějších programátorských zásad – zásadou DRY.

3.1Počáteční mezery

V jazyku Python mají mezery na počátku řádku speciální význam. Když proto zadáváte jakýkoliv příkaz, hlídejte si, aby nezačínal zbytečnou mezerou. Vloudí-li se vám do kódu taková nepatřičná mezera, jak tomu je ve výpisu 3.1 na řádku 3, systém vás na to ihned upozorní a neočekávanou mezeru označí.

Výpis 3.1: Počáteční mezery a komentáře

1>>>123+456#Nazačátkupříkazunesmíbýtzbytečnámezera

2579

3>>>432-10#Tadyjednabyla

4File"<stdin>",line1

5432-10#Tadyjednabyla

6IndentationError:unexpectedindent

7>>>

Komentáře

I při maximální snaze o srozumitelnost zapsaného kódu se občas stane, že si u některé části nemůžete vzpomenout, proč jste ji do kódu zahrnuli, k čemu slouží a jak přesně se má používat. Jednou z cest, jak program učinit pochopitelnější i po letech, je doplnit jej vysvětlujícími komentáři, což jsou texty sloužící jako informace uživateli. Překladač i interpret je zcela ignorují – pro ně je komentář ekvivalentem mezery: kam se smí vložit mezera, tam se smí vložit komentář.

V Pythonu jsou komentáře uvozeny znakem # (mříž) a ukončeny koncem řádku. Chceme-li zadat komentář zabírající několik řádků, musíme na začátek každého řádku vložit znak #.

V interaktivním režimu, v němž nyní pracujeme, se komentáře většinou nepoužívají. Já je však budu občas vkládat, abych upozornil na to, čeho si máte na daném kódu všimnout, jak tomu bylo např. ve výpisu 3.1.

Výpis 3.1 současně ukazuje, jak budou formátovány výpisy naší komunikace v interaktivním režimu. Výpisy budou podbarveny. Výzvy budou mít své vlastní podbarvení. Naše zadání bude vysazeno tučně, odpovědi počítače obyčejně. Ohlásí-li však počítač chyby, bude toto hlášení vysazeno červeně a bez podbarvení. Bude-li v textu komentář, bude vysazen kurzivou a podbarven zeleně.

3.2Celá čísla

Ve výpisu 3.1 jsme použili celá čísla. Ta nám spolu s texty, které probereme za chvíli, pro první etapu naší výuky postačí. Celé číslo můžeme zadat jako libovolnou posloupnost desítkových číslic nezačínající nulou. Celé číslo začínající nulou je v Pythonu syntaktická chyba[07] – viz reakce na příkaz na řádku 1 ve výpisu 3.2. Jediné číslo, které smí začínat nulou, je nula sama.

Výpis 3.2: Možnosti zápisu celých čísel

1>>>012

2File"<stdin>",line1

3012

4^

5SyntaxError:leadingzerosindecimalintegerliteralsarenotpermitted;usean0oprefixforoctalintegers

6>>>123_456_789

7123456789

8>>>1_23_456_7890_12345

9123456789012345

10>>>

Celá čísla můžete zadávat libovolně veliká. Potřebujete-li napsat nějaké delší číslo, můžete zápis zpřehlednit tím, že na vhodná místa vložíte znak podtržení (_), jak je tomu na řádku 6. Velikost jednotlivých skupin není definována (viz řádek 8). Podtržení ale nesmíte vložit na začátek ani na konec čísla, smí být pouze někde uprostřed.

Je-li číslo záporné, vložíte před něj znak – (minus). Chcete-li výrazně odlišit kladná a záporná čísla, můžete před kladná čísla vložit znaménko +, ale to slouží opravdu jen k zpřehlednění zápisu. Teoreticky může být mezi znaménkem a příslušným číslem libovolný počet mezer (nebo komentářů), ale doporučoval bych vám této možnosti nevyužívat.

3.3Reálná čísla

Po zvládnutí celých čísel nás v matematice učili používat čísla desetinná, o nichž nám posléze prozradili, že jsou podmnožinou čísel reálných. Termín reálná čísla se pro tato čísla používá i v programování.

Výpis 3.3: Zadávání a zobrazování reálných čísel

9>>>

3.4Další možné zápisy čísel

3.5Textové řetězce – stringy

Znak # ve stringu

Víceřádkové stringy

Escape sekvence

Bílé znaky

3.6Proměnné a přiřazovací příkaz

Identifikátor

Konvence pro podobu identifikátorů

Jazyk identifikátorů

Definice a použití proměnné, přiřazovací příkaz

Zadání skupiny hodnot

N-tice hodnot

3.7Hodnota versus odkaz na hodnotu

Halda a správa paměti

Terminologie

Nebezpečné změny hodnot

3.8Literály

3.9DRY – bez kopií

3.10Zdrojové kódy

Kapitola 4

Používání funkcí a objektů

4.1Volání funkcí

Příklady funkcí

Parametr versus argument

4.2Hodnota None

Podrobnosti o volání funkcí

4.3Objekt výpustka –...

4.4Základní aritmetické operace

4.5Formátovací stringy – f-stringy

4.6Výrazy, příkazy, výrazové příkazy

Proměnná _

Přiřazovací výraz

Více příkazů na řádku versus více výrazů na řádku

4.7Složený přiřazovací příkaz

4.8Zadání údajů z klávesnice

4.9Základy práce s objekty

Vše je objekt

Třída – instance – typ

Vytváření objektů

Tovární funkce

Atributy objektů a jejich kvalifikace

4.10Zdrojové kódy

Kapitola 5

Moduly a práce s nimi

5.1Moduly – základní informace

Vše je součástí nějakého modulu

Dva názvy objektů

Zdrojový soubor

Přeložený soubor

5.2Příkaz import

Import je jen jiný druh přiřazení

Čistý import jiného modulu

5.3Import modulu pod jiným názvem

Přímý import vyjmenovaných objektů

5.4Vytvoření vlastního modulu

Název modulu

Kódová stránka

Dokumentační komentář

Import ladicího modulu a kontrolní tisky

Zadané příkazy

5.5Práce s vytvořeným modulem

Proměnná s odkazem na objekt modulu

5.6Oprava načteného modulu

5.7Opětovné načtení opraveného modulu

5.8Zdrojové kódy

Table of Contents

Poděkování

Úvod

Komu je kniha určena

Koncepce výkladu a jeho uspořádání

První část

Druhá část

Třetí část

Čtvrtá část

Přílohy

Potřebné vybavení

Doprovodné programy

Použité typografické konvence

Zpětná vazba

Část A Superzáklady

Kapitola 1 Počítače a jejich programy

1.1 Hardware a software

První počítače

Co je to program

Syntaxe – sémantika – paradigma

Změny přístupu k tvorbě programů

Důležitost čitelnosti programu

1.2 Překladače, interprety, platformy

Operační systém

Platforma

Programovací jazyky

Překládaný program

Interpretovaný program

Porovnání

Hybridně zpracovávaný program

Jazyk versus způsob zpracování

1.3 Platforma Python

Skripty

Dokumentace

1.4 Interpret spuštěný z příkazového řádku

Odsazování

1.5 Zdrojové kódy

Kapitola 2 Vývojová prostředí

2.1 Vývojové prostředí

2.2 Prostředí IDLE

Spuštění

Základní popis

Příkazové okno

Opětné zadání dříve zadaných příkazů

Restart interaktivního systému

Uložení záznamu seance

Editační okno

Umístění editovaných souborů

Barevné zvýraznění textu

Použité písmo

2.3 IDLE versus příkazový řádek

Zobrazování výpisů programů

2.4 Zdrojové kódy

Kapitola 3 Zadávání hodnot a proměnné

3.1 Počáteční mezery

Komentáře

3.2 Celá čísla

3.3 Reálná čísla

3.4 Další možné zápisy čísel

3.5 Textové řetězce – stringy

Znak # ve stringu

Víceřádkové stringy

Escape sekvence

Bílé znaky

3.6 Proměnné a přiřazovací příkaz

Identifikátor

Konvence pro podobu identifikátorů

Jazyk identifikátorů

Definice a použití proměnné, přiřazovací příkaz

Zadání skupiny hodnot

N-tice hodnot

3.7 Hodnota versus odkaz na hodnotu

Halda a správa paměti

Terminologie

Nebezpečné změny hodnot

3.8 Literály

3.9 DRY – bez kopií

3.10 Zdrojové kódy

Kapitola 4 Používání funkcí a objektů

4.1 Volání funkcí

Příklady funkcí

Parametr versus argument

4.2 Hodnota None

Podrobnosti o volání funkcí

4.3 Objekt výpustka – ...

4.4 Základní aritmetické operace

4.5 Formátovací stringy – f-stringy

4.6 Výrazy, příkazy, výrazové příkazy

Proměnná _

Přiřazovací výraz

Více příkazů na řádku versus více výrazů na řádku

4.7 Složený přiřazovací příkaz

4.8 Zadání údajů z klávesnice

4.9 Základy práce s objekty

Vše je objekt

Třída – instance – typ

Vytváření objektů

Tovární funkce

Atributy objektů a jejich kvalifikace

4.10 Zdrojové kódy

Kapitola 5 Moduly a práce s nimi

5.1 Moduly – základní informace

Vše je součástí nějakého modulu

Dva názvy objektů

Zdrojový soubor

Přeložený soubor

5.2 Příkaz import

Import je jen jiný druh přiřazení

Čistý import jiného modulu

5.3 Import modulu pod jiným názvem

Přímý import vyjmenovaných objektů

5.4 Vytvoření vlastního modulu

Název modulu

Kódová stránka

Dokumentační komentář

Import ladicího modulu a kontrolní tisky

Zadané příkazy

5.5 Práce s vytvořeným modulem

Proměnná s odkazem na objekt modulu

5.6 Oprava načteného modulu

5.7 Opětovné načtení opraveného modulu

5.8 Zdrojové kódy