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ý

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

Vydala Grada Publishing, a.s.
U Průhonu 22, Praha 7
obchod@grada.cz, www.grada.cz
tel.: +420 234 264 401
jako svou 8162. publikaci

Odpovědný redaktor Petr Somogyi
Fotografie na obálce Depositphotos/mario7
Grafická úprava a sazba Rudolf Pecinovský
Počet stran 600
První vydání, Praha 2023
Tisk: Iva Vodáková – Durabo

© Grada Publishing, a.s., 2023
Cover Design © Grada Publishing, a. s., 2023
Cover Photo © Depositphotos/mario7

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-6741-8 (ePub)
ISBN 978-80-271-6740-1 (pdf)
ISBN 978-80-271-3891-3 (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 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. Stále marně přemýšlím, kde má schovanou tu svatozář.

Původně jsem se domníval, že s dalším vydáním nebude moc práce. Šeredně jsem se zmýlil, protože veškeré úpravy, jež jsem do knihy zanesl, jsou vykoupeny hodinami studia a experimentování, které rodina s neuvěřitelnou trpělivostí snášela.

Na vylepšování textu nového vydání se podílela řada dalších lidí. Mezi nimi musím poděkovat především těm, kteří si dali práci s odhalováním případných chyb ve vznikajícím rukopisu. 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, jež by si zasloužily vylepšit. Neméně velkou zásluhu na současné podobě má i Jirka Kofránek, který mne průběžně upozorňoval na některé problémy s výukou podle běžně používaných postupů. Řadou podnětných myšlenek přispěl Michal Palas, jenž pracuje v oblasti analýzy a zpracování dat a přispěl tak řadou poznatků z praxe.

V neposlední řadě patří můj dík redakci, především redaktoru Petru Somogyimu, který trpělivě snášel mé neustálé modifikace již zkorigovaného textu, a 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í 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, 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ů.

Popularita jazyka Python nepřetržitě roste. Postupně se stává klíčovým jazykem v řadě oblastí, především v těch, které souvisejí s výukou a výzkumem. Je to nejčastěji vyučovaný první jazyk na univerzitách, je nejpoužívanějším jazykem ve statistice, programování umělé inteligence, skriptování a psaní systémových testů. Má důležitou roli i v oblasti webového programování a různých vědeckých výpočtů. Často se k němu obracejí odborníci, kteří potřebují na počítači vyřešit nějaký problém a jiné jazyky jim připadají buď příliš těžkopádné, anebo pro ně neexistují potřebné knihovny.

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.

Python je vynikajícím nástrojem i pro ty, kteří vyvíjejí rozsáhlejší programy a ocení jeho obrovské možnosti, které běžné jazyky neposkytují. Musí ale současně být dost ukáznění, aby nepotřebovali pracovat v jazyku plném pravidel zabraňujících častým chybám začínajících programátorů a poskytujícím nepřetržitý dozor přísného překladače kontrolujícího jejich dodržování.

Pro takový druh potenciálních uživatelů je určena i tato učebnice. Určitě ji však přivítají i čtenáři, kteří řeší složitější problémy a potřebují proto znát jazyk do větší hloubky. Najdou zde výklad leckterých konstrukcí, na něž v běžných učebnicích nezbylo místo.

Komu je kniha určena

Dopředu musím upozornit, že tato kniha není koncipována pro naprosté začátečníky, kteří se s programováním teprve seznamují. Ti potřebují poněkud jiný postup výkladu a jiný výběr příkladů. Pro ně je určena kniha Začínáme programovat v jazyku Python ([7]), která vedle používání základních konstrukcí učí své čtenáře také řadu zásad moderního programování, jejichž zvládnutí je nutnou podmínkou pro všechny, kteří 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 nepovede uživatele k chrlení nepublikovatelných výroků na adresu autora.

Kniha, kterou právě čtete, předpokládá alespoň minimální programátorské znalosti a zkušenosti, což jí umožní soustředit se na výklad konstrukcí a rysů jazyka včetně těch, na které v učebnicích pro začátečníky již nezbývá místo. Je určena pro tři typy uživatelů:

•Autory, jejichž programátorské zkušenosti nejsou příliš hluboké, protože je využívají pro tvorbu jednoduchých programů řešících jejich každodenní problémy. Pro ty jsem výklad konstrukcí jazyka občas proložil výklady základů programování, které mohou ti pokročilejší přeskočit.

U těchto čtenářů bych byl rád, kdyby jim kniha pomohla v postupném prohlubování jejich znalostí a dovedností. Narazí-li někde na obtížnější pasáž, jejíž znalost právě nepotřebují, mohou ji klidně přeskočit a vrátit se k ní, až se jejich zkušenosti prohloubí a budou potřebovat probíranou vlastnost použít.

•Programátory, kteří doposud vyvíjeli v jiném programovacím jazyce a chtějí rozšířit své dovednosti o programování v jazyce Python. Pro ty jsou určena různá upozornění na rysy, jimiž se Python může odlišovat od toho, na co jsou ze své dosavadní praxe zvyklí.

Z ohlasů na předchozí verze publikace odhaduji, že těchto čtenářů je 60 až 80 %, takže se jim budu snažit vyjít vstříc a vždy včas upozornit na potřebu odlišného přístupu k probírané konstrukci při návrhu programu.

Předpokládám navíc, že tito čtenáři budou chtít tuto knihu používat spíše jako referenční příručku pro situace, kdy si nebudou zcela jisti, jak se některá konstrukce používá nebo jak přesně funguje.

•Uživatele, kteří již v Pythonu programují, ale potřebují znát jazyk do větší hloubky, než jim poskytly absolvované kurzy a prostudované učebnice, nebo se potřebují seznámit s novými konstrukcemi a rysy, které se mezi tím v Pythonu objevily.

K dokonalému využití platformy Python je však potřeba i znalost základních knihoven. V této knize vám představím pouze ty nejzákladnější funkce a třídy. Těm, kteří touží po podrobnějším seznámení s knihovnou a jejími možnostmi, poslouží publikace [8].

Dopředu se omlouvám, že se tato kniha částečně překrývá se začátečnickou učebnicí [7], ale cítil jsem potřebu některé věci vysvětlit jak začátečníkům, pro něž je určena kniha [7], tak pokročilejším čtenářům, pro něž jsem psal tuto publikaci). Nepočítal jsem to, ale odhaduji, že obě knihy mají asi 30 stránek společných.

Struktura příručky

S nakladatelem jsme se dohodli, že není rozumné následovat hlavní proud a vydat jednu velkou učebnici pokoušející se probrat všechny vlastnosti jazyka včetně jeho knihoven, z nichž mnohé řada čtenářů nevyužije. Rozhodli jsme se, že bude výhodnější vydat paralelně příručku snažící se probrat co nejlépe jazyk Python a jeho konstrukce, čímž pokryje základy, které využijí prakticky všichni. Na ni by navázaly další, které by se věnovaly nejpoužívanějším knihovnám, přičemž spektrum těchto navazujících učebnic by mohli ovlivňovat sami čtenáři.

Tato učebnice se proto soustřeďuje na výklad jazyka. Doprovodné knihovny až na pár výjimek neprobírá. Umožňuje to probrat jazyk do větší hloubky, takže se dostane i na oblasti, které běžné učebnice opomíjejí a očekávají, že si některá témata čtenáři osvojí metodou pokus-omyl.

Kniha je rozdělená do pěti částí doprovázených samostatně distribuovanými přílohami:

•První část seznamuje s platformou Python a s vývojovým prostředím, které budu používat pro definici ukázkových příkladů a demonstraci jejich funkce. Poté vám ukáže, jak zadávat hodnoty jednoduchých datových typů, seznámí vás s jejich použitím ve výrazech a s jednoduchými příkazy, které s takovýmito daty pracují. Její zvládnutí je podmínkou pro studium dalších částí.

•Druhá část probírá složené příkazy. Postupně probereme definice modulů a řady složených příkazů. Po jejím zvládnutí budete schopni vytvářet jednoduché prográmky, i když se bude jednat spíše o prográmky na hraní.

•Třetí část rozšiřuje množinu používaných dat o kontejnery, což jsou objekty určené k uchování jiných objektů. Snažil jsem se v ní uvést i pár příkladů, které by již nebyly pouze demonstrační a měly by i praktické využití. Po jejím zvládnutí byste měli být schopni vytvářet v Pythonu užitečné programy, které budou moci používat jiní.

•Čtvrtá část se zaměřuje na výklad konstrukcí umožňujících a podporujících objektově orientované programování. Po jejím zvládnutí budete schopni vytvářet v Pythonu středně složité programy.

•Pátá část probírá pokročilejší objektové konstrukce, jejichž znalost umožňuje navrhovat efektivnější architekturu vytvářených programů.

•A jak už bylo řečeno, samostatnou část knihy tvoří přílohy. Ty ale nejsou pro ušetření prostoru její součástí, ale najdete je na webových stránkách příručky.

Koncepce výkladu

Snažil jsem se, aby tato kniha mohla sloužit současně jako učebnice jazyka Python i jako referenční příručka. Tyto dva druhy publikací si ve svých požadavcích poněkud odporují.

•Dobrá učebnice vyžaduje, aby se výklad obešel bez dopředných odkazů. Musí proto maximálně omezit (nejlépe zcela zrušit) používání čehokoliv, co ještě nebylo vysvětleno, a to i za cenu toho, že výklad mnoha témat bude třeba rozdělit do několika částí, aby v něm mohly být vždy použity jenom doposud probrané rysy jazyka.

V opačném případě čtenáři vnímají danou konstrukci jako obrázek, který okopírují a používají, aniž by znali význam jednotlivých jeho součástí. (To je ostatně nectnost řady učebnic začínajících oblíbeným příkladem „Hello World“.) Při takovémto přístupu totiž čtenáři občas nechápou důsledky některých obratů a akcí a příčiny ohlášených chyb, jejichž odstranění je pak stojí nemalé úsilí.

•Naproti tomu referenční příručky by měly umožňovat co nejsnazší a nejrychlejší dohledání potřebných informací. Mohou být proto koncipovány tak, že každé téma je v nich cele probráno na jednom místě se všemi detaily, a to i za cenu dopředných odkazů, protože při výkladu často potřebují použít konstrukci, která teprve bude vysvětlena. Mohou si to dovolit, protože jsou určeny především zkušenějším čtenářům, u nichž se předpokládají základní znalosti a danou referenční příručku používají většinou k tomu, aby si ozřejmili některé detaily.

Jak jsem řekl, chtěl jsem, aby kniha mohla sloužit k oběma účelům, tedy jak jako základní příručka, podle které se dá učit, tak jako referenční příručka, kde lze rychle nalézt pasáž zabývající se diskutovaným tématem. Její struktura je proto navržena tak, aby jednotlivé kapitoly probraly dané téma pokud možno komplexně a bez potřeby se k němu vracet, ale aby se v nich na druhou stranu pokud možno neobjevovaly dopředné odkazy i za cenu toho, že bude třeba výklad některých pasáží rozdělit.

Veškerý výklad je prostoupen hojnými AHA-příklady, tedy příklady, jejichž hlavním účelem není vytvoření nějakého zdánlivě užitečného programu, ale kódu, jehož cílem je co nejjednodušeji a co nejsrozumitelněji demonstrovat probíranou konstrukci, aby čtenář pochopil její princip – aby u něj nastal kýžený AHA-efekt.

Vedle nich se občas objeví i nějaký příklad, který by byl v praxi užitečný. Protože se ale nejedná o učebnici programování, ale především o učebnici jazyka, bude těchto praktických příkladů poskrovnu.

Jazyk identifikátorů

Jak jsem řekl, doprovodné programy v první části jsou převážně AHA-příklady vysvětlující probíranou konstrukci. V nich budu pro větší názornost používat české identifikátory. V příkladech, které zavánějí praktickou aplikovatelností (ale těch v této učebnici není mnoho), dám – jak bývá v programování zvykem – přednost identifikátorům anglickým.

Potřebné vybavení

Pro úspěšné studium této knihy je vhodné mít instalovanou platformu Python. Tu lze stáhnout na adrese https://www.python.org/downloads/.

Kniha je psána pro verzi 3.11, ale drtivá většina příkladů poběží i na verzi 3.10. Protože ale vím, že řada čtenářů pracuje se staršími verzemi (např. proto, že to jejich zaměstnavatel požaduje z důvodu kompatibility), snažím se upozorňovat na všechna vylepšení, která se objevila v novějších verzích počínaje verzí 3.5, abyste byli včas upozorněni na to, co by vám nemuselo na počítači chodit bez vašeho zavinění.

Operační systém

Při práci v Pythonu vám může být většinou zcela jedno, nad jakým operačním systémem je instalovaný. V některých výjimečných situacích na tom ale záleží. Protože 80 % mých studentů i účastníků mých kurů používá operační systém Windows, jsou mé knihy primárně zaměřeny na ně. Pokusím se ale nezapomínat ani na ten zbytek.

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 adrese1 http://knihy.pecinovsky.cz/71_Python311.

Názvy zdrojových souborů s doprovodnými programy (v Pythonu jsou označovány jako moduly) začínají vždy písmenem m následovaným dvojmístným číslem kapitoly. Následují-li dvě podtržítka a text (např. m01__prolog), jedná se o soubor příkazů zadaných v průběhu kapitoly. Je-li za číslem malé písmeno následované jedním podtržítkem (např. m01a_script), jedná se o samostatný modul.

Soubory s příkazy zadávanými v průběhu kapitoly se vyskytují ve třech podobách se stejným názvem, ale odlišnou příponou. Soubory s příponou py jsou zdrojové soubory Pythonu, soubory s příponou pyrec obsahují záznam konverzace se systémem a soubory s příponou pydoc obsahují 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 při něm nemuseli neustále listovat mezi rozborem a rozebíraným výpisem.

Vy si je umístěte, kam uznáte za vhodné. Jak napovídají adresy souborů v jejich úvodních komentářích, já je mám rozbalené do složek nazvaných 71_INP a 71_IWD, které jsou na substituovaném disku R:. Ve složce 71_INP najdete skripty v podobě, v jaké jsem je zadával interpretu či zapisoval do kódu, ve složce 71_IWD najdete tytéž skripty doplněné o odpovědi interpretu a sloužící tedy jako záznam komunikace s interpretem. Jejich kopie jsou proto uvedeny ve výpisech kódu. Abyste se v nich lépe orientovali, najdete je zde i s čísly řádků výpisu.

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ínyPrvní výskyt nějakého termínu a další texty, které chci zvýraznit, vysazuji tučně.

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

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

OdkazCelá 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, a použitý čtecí program by je měl na odkazovaný objekt ihned přenést.

AdresaInternetové adresy vysazuji obyčejným bezpatkovým písmem.

ProgramIdentifiká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íVe výpisech konverzace s počítačem budou zadání uživatele vysazena tučně (v elektronických verzích pro zvýraznění modře).

KeywordKlíčová slova jazyka (anglicky keywords) budou vysezena také tučně i v běžných výpisech programu (v elektronických verzích pro zvýraznění tmavě červeně).

ChybaObdobně budou zvýrazněna chybová hlášení. Nebudou podbarvena a v elektronických verzích budou vysazena červeně.
      Na několika místech v knize je ukázka komunikace v příkazovém panelu operačního systému. V těchto výpisech zobrazuji pro přehlednost zprávy systému stejně jako chybová hlášení, aby byly jasně odlišeny od následné komunikace s Pythonem.

KomentářSvůj styl budou mít ve výpisech programů i komentáře, které budou vysazeny kurzivou a v elektronických verzích zeleně podbarveny.

Výzva Výzvy operačního příkazu k zadání příkazu či jeho části budou podbarvené tak, aby byly snadno odlišitelné od zadávaného kódu.

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, který 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.

Symbol znamení raka označuje poznámky upozorňující na odchylky od mainstreamových jazyků, tj. od jazyků Java, C/C++, C#, Delphi, Visual Basic apod. V této poznámce občas opakuji informace, které jsou v hlavním textu, ale bojím se, že by mohly být přehlédnuty.

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í.

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 něž 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 některé nepříjemnosti a bude vám radit, jak se těmto nástrahám vyhnout (či jak to zařídit, aby vám alespoň pokud možno nevadily).

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, které však 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 výkladu. Nadpis podšeděného bloku pak najdete i v podrobném obsahu mezi nečíslovanými nadpisy.

Při prvním čtení můžete tyto bloky přeskakovat a vracet se k nim až ve chvíli, kdy v textu narazíte na téma probírané v bloku a budete si chtít osvěžit či doplnit svoje znalosti.

Zpětná vazba

Předem přiznávám, že tato kniha je sice mou šedesátou publikovanou učebnicí, ale současně je to moje první učebnice Pythonu. 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 nebo budete mít návrh na nějaké její vylepšení, neostýchejte se poslat svůj dotaz či připomínku na adresu rudolf@pecinovsky.cz jako e-mail s předmětem 71_Python_310_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/71_Python311 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 se netroufnou sami zeptat.

Jenom se musím dopředu omluvit, že na dotazy neodpovídám okamžitě, protože při svém pracovním vytížení zapínám poštu jen jednou za čas.

Část A
Superzáklady

Tato část seznamuje s naprostými základy jazyka Python a s možnostmi práce s jednoduchými daty. Nejprve prozradí, jak instalovat a spustit vestavěné vývojové a výukové prostředí, poté vás naučí zadávat hodnoty různých typů, probere jednoduché aritmetické a logické výrazy včetně základní sady jednoduchých funkcí. Po této předehře se pustí do výkladu proměnných a základních jednoduchých příkazů.

Kapitola 1
Startujeme

Co se v kapitole naučíte

Kapitola vás nejprve seznámí se základními instalovanými součástmi platformy a poté vám představí vývojová prostředí, jež jsou součástí instalace a umožní vám komunikovat s interpretem jazyka Python.

1.1  Hlavní součást instalace

V dalším textu budu předpokládat, že máte staženou a instalovanou platformu Python podle návodu v pasáži Potřebné vybavení. Projděme si nyní, co jste instalovali, a ukažme si, co z toho budeme využívat.

Platforma

Nejprve bych vám měl vysvětlit, proč říkám, že jste si stáhli platformu Python, když všichni hovoří o jazyku. Jde o to, že samotný jazyk vám není k ničemu do té doby, než získáte nástroje k tomu, abyste jej mohli používat.

Především potřebujete překladač nebo interpret, abyste svůj program převedli do podoby, s níž je počítač schopen pracovat. Poté potřebujete nějaké vývojové prostředí, ve kterém budete své programy s rozumným úsilím navrhovat. V neposlední řadě pak potřebujete knihovny, v nichž jsou připravené podprogramy realizující nejčastější operace, abyste je nemuseli všechny vytvářet sami. Sadu programů potřebných k tomu, aby se váš program plnohodnotně rozběhl, označujeme termínem platforma.

Výchozí standardní implementace, kterou si můžete jako platformu stáhnout na stránkách www.python.org, bývá označována jako CPython, protože je implementována v jazyku C. Implementace jazyka Python vznikla i na jiných platformách. Jython přináší implementaci nad platformou Java, IronPython přináší implementaci nad platformou .NET. Na obou zmíněných platformách však v době psaní této učebnice běžela verze 2, která od počátku roku 2020 již není podporována.

Jednou z poměrně rozšířených platforem je v současné době interaktivní platforma Jupyter Notebook,2 na níž běží odnož jazyka označovaná IPython. Tato platforma je používaná zejména při analýze dat a v nejrůznějších vědeckých projektech. Musíte se ale smířit s tím, že nebývá kompatibilní s poslední verzí jazyka, ale s některou z těch předchozích.

V této učebnici se soustředím na nativní platformu jazyka Python, tedy na platformu, kterou jste podle výše uvedeného návodu instalovali, a to konkrétně na verzi 3.11, jež vyšla v říjnu roku 2022 (dobrá, příručka musela být připravována o trochu dříve, takže je vše zkoušeno na beta verzi, ale to by na výsledek nemělo mít vliv).

Python se od ostatních platforem liší mimo jiné tím, že kromě základního interpretu, překladače, knihoven a frameworků obsahuje i jednoduché, ale pro začátečníka vcelku použitelné vývojové prostředí, v němž můžete zadávat své příkazy a vyvíjet programy, a mimo jiné také relativně rozsáhlou dokumentaci.

Dokumentace

Přítomnost dokumentace je nesmírně důležitá, 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í.

Pokud jste si v rámci instalace Pythonu instalovali i jeho dokumentaci (což vřele doporučuji), tak byste měli soubory s doprovodnou dokumentací najít v podsložce Doc/html složky, do níž jste instalovali Python. Z toho jste si jistě odvodili, že dokumentace je ve formátu HTML a můžete ji otevřít v libovolném prohlížeči.

Jak se můžete přesvědčit na obrázku 1.1, hlavní stránka slouží jako taková křižovatka s přehledem oblastí, o nichž se můžete informovat. Kromě toho je nad nadpisem vstupní pole, do nějž můžete zadat svůj požadavek, a zabudované skripty se vám pokusí najít vhodnou odpověď.

PEP

Dokumentace se velmi často odvolává na nejrůznější dokumenty, které jsou označované vždy zkratkou PEP a číslem. PEP je zkratka z anglického Python Enhancement Proposal (doporučení pro vylepšení Pythonu). Jsou to dokumenty poskytující informace komunitě Pythonu nebo navrhující nové funkce, procesy nebo prostředí. Jejich přehled najdete na https://www.python.org/dev/peps/.

Obrázek 1.1:
Okno s dokumentací platformy

Pracovní režimy

Při vývoji programů v Pythonu pracujete v jednom ze dvou režimů:

•V interaktivním režimu zadáváte příkazy, na něž systém okamžitě zareaguje, zadaný příkaz provede a na následujících řádcích zobrazí svoji odpověď.

•V editačním režimu vytváříte v nějakém textovém editoru zdrojový kód programu, který následně buď přímo, anebo v interaktivním režimu spustíte.

Při práci v Pythonu s uživatelem vždy komunikuje interpret. Ten však zadané příkazy hned neprovádí, ale nechá si je od překladače nejprve převést do interního kódu, který je pak možné interpretovat mnohem efektivněji než původní zdrojový text.

Při intepretaci interního kódu se navíc interpret může rozhodnout, že se některé části budou provádět opakovaně a že bude proto výhodné si je nechat přeložit stranou přímo do strojového kódu příslušného procesoru, a ten pak nechat provést maximální rychlostí.

Překladač a interpret spolu těsně spolupracují. Kdykoliv budu v dalším textu hovořit o zpracování zadaného textu a jeho převodu do spustitelné podoby, použiju termín překladač, a když budu hovořit o komunikaci s uživatelem a o tom, co se kdy zobrazí a jak se to zobrazí, použiju termín interpret.

1.2  Vývojová prostředí

Když se rozhodneme vyvíjet programy, měli bychom si nejprve rozmyslet, jaké budeme používat vývojové prostředí, tj. sadu nástrojů usnadňujících vývoj. Teoreticky je sice možné používat běžný textový editor a komunikovat se systémem prostřednictvím příkazového řádku, ale naprostá většina programátorů dává přednost komfortu vývojového prostředí.

Pro Python existuje řada integrovaných vývojových prostředí (Integrated Development Environment – IDE), která výrazně usnadňují práci, a to zejména na rozsáhlých projektech. Pojďme si představit nejpoužívanější vývojová prostředí používaná při vývoji programů v jazyce Python. Pokud byste chtěli vyzkoušet i některá další, zajímavý přehled najdete v anglické wikipedii pod heslem Comparison of integrated development environments.

PyCharm a IntelliJ IDEA

Pravděpodobně nejrozšířenějším prostředím mezi profesionálními programátory je prostředí PyCharm, které vyvíjí pražská firma JetBrains. Standardní verze je placená, ale firma nabízí i Community Edition, která je zdarma a pro středně složité aplikace dostačuje.

Toto prostředí je postaveno nad platformou IntelliJ IDEA, která je základem stejnojmenného nejrozšířenějšího prostředí pro tvorbu programů v Javě, ale hojně se používá pro vývoj programů v řadě dalších programovacích jazyků. Rozšíření o podporu Pythonu lze do prostředí IntelliJ IDEA nahrát i jako plugin. Proto mu zřejmě dají přednost programátoři, kteří již toto prostředí využívají pro tvorbu programů v jiném programovacím jazyce.

Prostředí PyCharm můžete stáhnout na https://www.jetbrains.com/pycharm/download, plugin do IntelliJ IDEA na adrese https://www.jetbrains.com/idea/download.

Visual Studio Code

Prostředí Visual Studio Code vyvíjí Microsoft jako open-source. Toto IDE zřejmě upřednostní programátoři, kteří v něm již programují v jazyku JavaScript nebo v některém programovacím jazyku pro platformu .NET. Prostředí má nepřeberné množství pluginů pro nejrůznější jazyky včetně Pythonu.

Prostředí můžete stáhnout na adrese https://code.visualstudio.com/.

Jupyter Notebook a JupyterLab

Project Jupyter je nezisková organizace zabývající se vývojem open-source softwaru, otevřených standardů a služeb pro interaktivní výpočetní techniku. Její název vznikl jako akronym složený z názvů tří primárně podporovaných jazyků: Julia, Python a R.

Jupyter Notebook je webové prostředí pro vytváření dokumentů – poznámkových bloků (notebooků) Jupyter. JupyterLab je uživatelské rozhraní nové generace. Seznámit se s nimi můžete na adrese https://jupyter.org/try.

Jak už jsem řekl, toto prostředí je oblíbené při analýze dat a práci na různých vědeckých projektech, kdy uživatel ocení jeho interaktivitu a možnost prokládat programy běžným textem. Musíte se ale smířit s tím, že jím podporovaná verze Pythonu nebývá ta poslední (a často ani předposlední).

Základní interpret a IDLE

Při používání nejrůznějších propracovaných vývojových prostředí bychom se však zejména na počátku zbytečně rozptylovali vstřebáváním základních pravidel jejich ovládání. Zvládnout dobře nějaké dokonalé vývojové prostředí totiž bývá složitější než zvládnout základy programovacího jazyka. Má proto smysl si mezi prostředími začít vybírat až v okamžiku, kdy zvládnete základy jazyka a nejdůležitějších součástí standardní knihovny.

V učebnici se oněmi propracovanými vývojovými prostředími zabývat nebudeme, protože využijeme toho, že dvě základní vývojová prostředí nabízí i standardní instalace:

•Základní interpret můžete spustit buď přímo, anebo z příkazového řádku v konzolovém okně zadáním příkazu python. Jako vývojové prostředí je však konzolové okno příliš těžkopádné – je vhodné tak maximálně pro spouštění jednotlivých skriptů.

•Prostředí IDLE je interaktivní vývojové prostředí s jednoduchým editorem, které je celé napsané v Pythonu a najdete jej v podsložce Lib\idlelib\ složky, do které jste Python instalovali.

Prostředí IDLE nabízí rozumný kompromis mezi jednoduchostí ovládání (a s ní spojenou rychlostí osvojení) a sadou nabízených funkcí. Jeho nejdůležitější výhodou je však to, že je součástí standardní instalace a nenutí vás proto instalovat cokoliv dalšího.

Výběr vývojového prostředí, které budete používat, je však zcela na vás, protože zdrojový kód bude nezávisle na použitém vývojovém prostředí shodný a shodné by měly být i odpovědi v interaktivním režimu. Jak si ukážeme ve výpisech 1.1 a 1.2, bude se lišit nejvýše jejich umístění.

1.3  Komunikace s interpretem

Všechna vývojová prostředí včetně tak jednoduchého, jakým je IDLE, poskytují okna či panely pro komunikaci s interpretem v interaktivním režimu. Představím vám proto základy komunikace s interpretem v okně příkazového řádku, kterou všechna zmíněná okna či panely nějakým způsobem přebírají.

Interpret spustíte ve Windows zadáním příkazu py (viz obrázek 1.2), v prostředích založených na Linuxu (včetně MacOS) zadáním příkazu python3.

Po spuštění Pythonu 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.

Obrázek 1.2:
Okno příkazového řádku Windows se spuštěným interpretem Pythonu

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.

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

1>>> 12+34

246

3>>>  0

4  File "<stdin>", line 1

5    0

6IndentationError: unexpected indent

7>>> (56

8...  + 78

9...  ) - 100

1034

11>>> 

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ů. Ve výpisu 1.1 je na řádku 1 zadán 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.

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), tak 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.

V následující podkapitole vás budu seznamovat s IDLE. Rozhodnete-li se používat okno či panel editoru nabízený vaším vývojovým prostředím, můžete tuto podkapitolu přeskočit, ale určitě si přečtěte navazující podkapitolu 1.5  Používání vývojových prostředí.

1.4  IDLE – seznamte se

Jak už jsem naznačil, prostředí IDLE je pro úvodní kroky asi nejvhodnější, protože je za prvé součástí základní instalace, takže už je nemusíte instalovat, a za druhé je ze všech nejjednodušší. Pojďme si je představit.

Prostředí bylo pojmenováno podle Erika Idlea, jednoho ze zakládajících členů skupiny Monty Python, podle níž byl pojmenován celý jazyk. Později ale bylo rozhodnuto, že mu bude přidělen profesionálnější název. Nepřejmenovali jej, jen název jinak interpretují – nyní je oficiálně zkratkou z anglického Integrated Development and Learning Environment (Integrované vývojové a učební prostředí).

Spuštění

Spouštěcí skript prostředí IDLE je ve složce #/Lib/idlelib/, kde symbol # zastupuje složku, kam jste instalovali Python, v souboru idle.py, resp. idle.pyw. Doporučuji spustit skript v souboru s příponou pyw, protože tento skript nepotřebuje spouštět okno konzole, jelikož komunikuje s uživatelem prostřednictvím grafického uživatelského rozhraní (GUI) využívajícího (mimo jiné) okna a myš.

Důležité je, abyste IDLE otevírali ve složce, v níž jsou umístěné vaše skripty. 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 71_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_310.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 v podkapitole A.2  Nastavování zástupce spouštějícího IDLE na webové stránce knihy.

Základní popis

Prostředí IDLE (viz obrázek 1.3) je multiokenní prostředí, jehož okna mohou pracovat v jednom ze dvou režimů:

Obrázek 1.3:
Okno vývojového prostředí IDLE

•Jedno z oken může pracovat v příkazovém, interaktivním režimu, v němž uživatel komunikuje přímo se systémem, tj. s interpretem jazyka Python. V dalším textu jej budu označovat jako příkazové okno.

•Ostatní okna mohou pracovat pouze v editačním režimu, v němž editujete zdrojové či datové soubory, které pak v příkazovém okně použijete. 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. 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.

Režim otevřeného okna ovlivňuje i hlavní nabídku (nabídkovou lištu). Příkazové okno má jako třetí položku nabídku Shell a jako čtvrtou položku nabídku Debug (viz obrázek 1.4), zatímco editační ono má místo nich nabídky Format a Run.

Mezi okny se přepínáte buď 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 1.4).

Obrázek 1.4:
Výběr požadovaného cílového okna v nabídce Windows

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 → 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.

Protože vím, že většina programátorů dává přednost tmavé barvě pozadí a světlému písmu, protože mnohem méně oslňuje, tak bych zájemce navedl v nastavovacím okně na kartu Highlights, kde si v pravé části mohou nastavit tmavé téma a v případě potřeby je i upravit na téma vlastní.

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 1.3), v němž se zobrazí úvodní řádek definující verzi Pythonu a použitý procesor následovaný řádkem s nápovědou a řádkem s výzvou k zadání příkazů, jejichž prostřednictvím získáte další informace nebo spustíte zadanou akci.

Až do verze 3.9 byla výzva standardní součástí zobrazovaného textu, stejně jako je tomu v příkazovém panelu (viz obrázek 1.2). Na rozdíl od příkazového panelu se v příkazovém okně nevypisovala pokračovací výzva, což občas způsobovalo problémy, o nichž jsem hovořil v předchozích verzích této příručky.

Od verze 3.10 je však pro výzvy vyhrazen vlevo speciální panel. Vedle standardní výzvy se tak zobrazuje i pokračovací výzva. Od zobrazení v konzolovém okně se zobrazení v příkazovém okně liší tím, že odsazené jsou nyní i odpovědi systému na vaše příkazy, protože veškerá komunikace s uživatelem probíhá v jiném panelu. Panel s výzvami je pouze informační.

Ve výpisu 1.2 si můžete prohlédnout zopakovanou sadu příkazů z výpisu 1.1 a můžete tak porovnat, jak se tyto dva způsoby záznamu komunikace v interaktivním režimu liší.

Výpis 1.2: Reakce na odsazení příkazu

1>>> 12+34

2    46

3>>>  0

4... 

5    SyntaxError: unexpected indent

6>>> (56

7...  + 78

8...  ) - 100

9    34

10>>> 

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. K tomu slouží 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.

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.

Návrat k dříve zadaným příkazům

IDLE si zadané příkazy pamatuje. Naposledy zadaný příkaz zkopírujete za aktuální výzvu zadáním Alt+P (P = Previous). Postupným zadáváním této zkratky místo něj kopírujete dříve zadávané příkazy. Aby to však fungovalo, nesmíte mít za výzvou nic zadáno.

Pokud náhodou přeběhnete, tak zadáním zkratky Alt+N (N = Next) procházíte seznam zadaných příkazů zase vpřed.

Někdy je nejjednodušší se za pomoci posuvníku (nebo kurzorových šipek) prostě na příslušný příkaz přesunout, umístit na něj kurzor a stisknout Enter. Příkaz se pak zkopíruje za aktuální výzvu a kurzor se umístí na jeho konec.

Použití klávesy Enter funguje, i když už máte něco zadáno – kopírovaný příkaz se prostě umístí za tento text.

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. To vám vřele nedoporučuji, protože je to přípona vyhrazená pro zdrojové soubory Pythonu, a tím záznam seance není, protože vedle vašich příkazů obsahuje i odpovědi systému a jeho následné výzvy (>>> – tři většítka následovaná mezerou) 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 jako zkratku z python record).

Po uložení svého 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 9  Moduly), 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. Číslování se však vztahuje pouze na editační okna. V interaktivním oknu řádky číslovat nelze.

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 složených příkazů (např. definic funkcí), 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 seznámíte až v kapitole 11  Definice funkcí. Příkaz Show Code Context vám připomenu, až se v kapitole 13  Pokročilé rysy funkcí začneme bavit o vnitřních funkcích a definice se tak začnou zesložiťovat.

Při práci se soubory se otevírací, resp. ukládací okno otevřené z příkazového okna otevře ve složce, z níž byl skript spuštěn. Zadáte-li však týž příkaz z editačního okna, tak se primárně otevře ve složce daného souboru. Při práci se soubory umístěnými v podsložkách si vhodnou volbou okna, v němž požádáte o otevření dalšího souboru, můžete ušetřit trochu toho následného klikání.

Umístění editovaných souborů

Chcete-li otevřít zdrojový soubor, IDLE jej implicitně hledá v aktuálním adresáři, v němž jste je 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 text knihy i všechny její doprovodné programy na substituovaný disk R: (viz přílohu A  Konfigurace ve Windows na webové stránce knihy). Jak si můžete přečíst v úvodních komentářích stažených souborů, u mě je na něm pro doprovodné programy vyhrazena složka 71_INP. V té je umístěn i zástupce spouštějící IDLE, které pak tuto složku nastaví jako svoji pracovní složku.

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 textu částečně ochudím – zvýrazněna budou pouze klíčová slova a komentáře. Zadáte-li ale texty doprovodných programů učebnice do okna IDLE, budou barevně zvýrazněny.

1.5  Používání vývojových prostředí

V této podkapitole proberu několik informací, které byste měli znát nezávisle na tom, budete-li při studiu této příručky využívat vývojové prostředí IDLE, nebo dáte přednost nějakému propracovanějšímu prostředí.

Odchylky zobrazení konverzace v IDLE

U minulých knih mi několik čtenářů psalo, že se v mých výpisech programů chová Python trochu jinak, než když si dané programy zkoušejí sami. Posléze se ukázalo, že příčinou je nepatrně odlišné chování interpretu, z nějž záznamy komunikace přebírám, a panelu interpretu, který používají oni.

Hlavní příčinou rozdílu je to, že vývojová prostředí zobrazují ve svých panelech či oknech interpretu celou komunikaci stejně, jak by se zobrazovala při přímém spuštění Pythonu z příkazového řádku.

Toto zobrazení se liší především tím, že na řádcích se zadávanými příkazy se před tyto příkazy zapisuje výzva, kdežto odpovědi systému se zapisují přímo od kraje. Jak jsme si ale řekli, IDLE má pro výzvy vyhrazen speciální boční panel, který je však aktivní i u odpovědí, takže při používání IDLE jsou odpovědi zdánlivě posunuté o 4 znaky od levého kraje. Nenechte se tím zmást.

V tištěné knize i v její PDF verzi jsou výzvy jasně označeny. Nevím ale, jak si s tím poradí čtečky knih ve formátu EPUB. Mnohé z nich totiž nejsou schopné zachytit všechny nuance složitějšího zlomu. Používáte-li knihu ve formátu EPUB, tak se vám za tyto nedokonalosti dopředu omlouvám.

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 snadné rozlišení těchto znaků nenabízí – jednoduše se v něm zamění nejenom nula s O, ale také jednička s malým L (viz např. 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 občas u menšího písma 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). 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 textu této knihy (tedy nepoužíváte-li 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 toto písmo nebo nějaké písmo s podobnými vlastnostmi. V programu IDLE toho dosáhnete zadáním příkazu Options → 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.

1.6  Objekty a objektové programování

Python je postaven nad základní myšlenkou objektově orientovaného programování (v dalším textu budu často používat zkratku OOP), že všechno je objekt. A když říkám všechno, tak myslím opravdu všechno. Tím se liší od většiny rozšířených jazyků, které o sobě také tvrdí, že jsou objektově orientované, ale onu základní myšlenku akceptují jen částečně.

Pravdou je, že značná část uživatelů Pythonu píše jednoduché programy obsahující desítky až stovky řádků kódu. Při psaní takovýchto programů se většinou objektová povaha jazyka a zpracovávaných dat příliš nevyužije. Na druhou stranu bylo ale na přelomu 80. a 90. let ukázáno, že rozrostou-li se programy na desítky až stovky tisíc řádků kódu, přestává být v lidských silách vytvořit rozumně spolehlivý program v rozumném čase a za rozumnou cenu bez použití OOP.

Když učím jazyky používané převážně pro vývoj oněch obludných programů (např. Javu), začínám výklad právě vysvětlením základů objektově orientovaného paradigmatu. V této učebnici jsem se ale rozhodl respektovat skutečnost, že řada programátorů používá Python pro psaní kratších programů, kde výhody OOP nevyužije, a ve svých programech proto OOP explicitně nepoužívá. Výklad objektově orientovaného programování a jeho podpory v jazyku Python jsem proto přesunul až do čtvrté části, za výklad základních konstrukcí a datových struktur jazyka.

Explicitně

V předchozím odstavci je důležité slovíčko explicitně. V Pythonu, v němž je vše definováno jako objekt, totiž nelze nepoužívat objekty. Můžete se sice tvářit, že je nepoužíváte, ale to na skutečnosti nic nemění. Proto je mnohem výhodnější objektovou podstatu Pythonu akceptovat a naučit se ji využívat. V řadě situací vám pak výrazně stoupne produktivita práce.

Před tím, než spolu dojdeme do části, kde se budeme objektové podstatě jazyka věnovat podrobně, se nebudu moci vyhnout použití některých objektových rysů jazyka. Vždy však před to zařadím výklad následně použitých konstrukcí a základních principů, na nichž jsou postaveny.

A začneme s tím hned teď, kdy vám v kostce představím alespoň základy objektově orientovaného programování.

Objekt, třída, instance, kontejner

Vzhledem k objektové podstatě jazyka Python se ale neubráním tomu, abych o objektech hovořil už nyní. Předběhnu proto trochu výklad OOP ve čtvrté části učebnice a seznámím vás s nejdůležitějšími termíny, které budeme v následujícím výkladu používat.

Objekt

OOP staví na základní myšlence, že všechno je objekt. Kdykoliv se proto tento termín v textu objeví, dosaďte si za něj „cokoliv, s čím můžeme v programu pracovat“, anebo „cokoliv, co můžeme nazvat podstatným jménem“.

Třída

Mezi objekty, s nimiž váš program pracuje, se vždy najdou skupiny objektů, které mají nějaké společné vlastnosti a schopnosti. Python umožňuje definovat speciální objekty, které označujeme jako třídy. Třída (anglicky class) sdružuje na jednom místě souhrn informací o oněch společných vlastnostech a schopnostech dané skupiny objektů. Sama pak pracuje jako továrna na objekty s danými charakteristikami.

Instance

Třída je jediný objekt, který je schopen vyrábět jiné objekty. Objekty vytvořené třídou označujeme jako instance dané třídy. Třída jim při jejich „porodu“ dá do vínku ony uchovávané vlastnosti a schopnosti objektů dané skupiny.

Každý objekt ví, která třída jej porodila (čí je instancí) a kde má v případě potřeby hledat ony informace společné pro instance dané třídy.

Kontejnery

Speciálním druhem objektů jsou tzv. kontejnery, což jsou objekty určené primárně k uchovávání jiných objektů. Protože celé programování je o tom, že si někde musíme něco zapamatovat, abychom to mohli někde jinde použít, jsou kontejnery nejčastějším druhem používaných objektů.

Zvláštní postavení mezi kontejnery mají tzv. posloupnosti, což jsou kontejnery, u nichž je definováno pořadí uložených prvků.

Druhou důležitou skupinou kontejnerů jsou tzv. asociativní paměti označované často jako slovníky, mapy nebo mapovací objekty. Ty slouží k tomu, aby si program po zadání objektu „vybavil“ jiný, který s tím zadaným definovaným způsobem souvisí.

O kontejnerech se několikrát zmíním již v prvních dvou částech, ale plně se jejich výkladu začnu věnovat až v části C  Kontejnery.

1.7  Datový typ

S termínem datový typ se budete setkávat prakticky od začátku výkladu. Navíc jej při práci budete muset brát v úvahu prakticky na každém kroku. Pojďme si jej pro jistotu nejprve představit, i když pro očekávané čtenáře by to mělo být spíš jen opakování. Alespoň si sjednotíme terminologii.

V Pythonu (a dalších plně objektových jazycích) definuje datový typ objektu třída, jejíž instancí je daný objekt. Z obecnějšího pohledu bychom mohli říci, že datový typ (nebo zkráceně jen typ) je označení pro trojici charakteristik specifikujících vlastnosti hodnot, které označujeme jako data daného typu. Svůj typ mají veškerá data, s nimiž program pracuje. Datový typ specifikuje:

symbol množinu přípustných hodnot, resp. stavů,

symbolzpůsob uložení těchto hodnot (stavů) v paměti (o ten se zatím nebudeme zajímat a zpracování této informace přenecháme virtuálnímu stroji),

symbolmnožinu operací, které lze s instancemi daného typu provádět.

Jinými slovy: datový typ prozrazuje, co můžeme od hodnot daného typu očekávat a co s nimi můžeme dělat.

V dalším textu budu často upozorňovat na odchylky Pythonu od nejpoužívanějších jazyků, mezi něž řadíme jazyky Java, C/C++, C#, Visual Basic, Delphi, Pascal a jazyky jim podobné. Tyto jazyky budu hromadně označovat termínem mainstreamové jazyky.

Mezi mainstreamové jazyky nezařazuji jazyk JavaScript, přestože je velmi rozšířený. Jeho koncepce je však zcela osobitá a v řadě ohledů je blíže Pythonu než výše zmíněným jazykům označeným jako mainstreamové a jinde zase naopak. Musel bych se proto o něm vyjadřovat samostatně a na to tu není prostor.

1.8  Nejdůležitější zvláštnosti Pythonu

Než se pustíme do výkladu vlastního jazyka, chtěl bych upozornit čtenáře, kteří již pracovali v jiných jazycích, že při práci v Pythonu bude možná třeba některé návyky změnit a naučit se přemýšlet v trochu jiném paradigmatu. Pojďme si ve stručnosti projít nejdůležitější odchylky Pythonu, abyste se na ně mohli připravit.

Přísné a benevolentní programovací jazyky

Než se rozhovořím o přísnosti jazyků, představím vám základní typy chyb (podrobněji je probereme v podkapitole 16.1  Tři druhy chyb):

•Mezi syntaktické chyby řadíme prohřešky proti pravidlům jazyka, na které vás mnohá IDE upozorní hned v okamžiku, kdy daný program píšete, ale nejpozději je označí interpret, kterému je sdělí překladač při prvním pokusu o překlad daného kódu. Programátoři je proto většinou ani nepovažují za chyby. Sem patří například chyba na řádku 13 ve výpisu 2.5.

•Běhové chyby jsou chyby, které počítač ohlásí za běhu programu. Program se při nich často zhroutí, ale alespoň už víme, že v něm je chyba, a můžeme ji začít hledat.

•Logické chyby jsou takové, že program běží a tváří se, že je vše v pořádku. Když se chyba projeví, bývá už často řada věcí nevratně poškozena.

Podle přístupu k odhalování potenciálních chyb bychom mohli rozdělit programovací jazyky do dvou skupin:

•Jako přísné jazyky budu označovat takové, jejichž autoři se snažili navrhnout svůj jazyk tak, aby se při vývoji programu co největší procento případných běhových a logických chyb stalo chybami syntaktickými. Aby toho dosáhli, zavedou do jazyka řadu pravidel, která programátor musí dodržovat a která pak ono zrychlené odhalení chyb umožní. Jedním z nich je i přísné typování, při němž je pro každou proměnnou přesně určeno, jaký druh hodnot se do ní smí uložit.

•Jako benevolentní jazyky budu označovat takové, jejichž autoři se naopak domnívají, že programátoři se ohlídají sami a ocení spíše to, že jim jazyk poskytne co největší svobodu a nabídne co nejlepší vyjadřovací možnosti, takže jsou s vývojem programu dříve hotovi a program je navíc kratší.

Python patří spíše do skupiny benevolentních jazyků. Nabízí širokou škálu efektivních vyjadřovacích možností (postupně se s nimi seznámíte), i když na druhou stranu nabízí některé konstrukce, které jeho uživatelům umožní používat „přísná“ pravidla, na něž jsou z přísných jazyků zvyklí.

•První změnou, které si všimnete, je to, že Python zrušil závorky označující hranice bloků kódu – bloky kódu označuje pomocí odsazení jejich příkazů (viz podkapitolu 8.7  Složené příkazy a odsazování).

•Druhou změnou, která některým programátorům činí potíže, je to, že Python důsledně dodržuje zásadu, že vše je objekt, který můžeme uložit do proměnné. V Pythonu proto můžete uložit do proměnné nejen číslo nebo text, ale i funkci, třídu, modul, balíček a další objekty, které programátoři v jiných jazycích vnímají spíše jako abstrakce.

•Třetí změnou, na níž si budou muset zvyknout především programátoři pracující v mainstreamových jazycích, je skutečnost, že Python patří mezi benevolentní jazyky (viz podšeděný blok Přísné a benevolentní programovací jazyky), které předpokládají, že programátora nemusí hlídat překladač, ale že se ohlídá sám. Při psaní je proto potřeba větší sebekázeň a důkladnější testování.

S tím souvisí i to, že Python patří mezi dynamicky typované jazyky, v nichž se datový typ vyhodnocuje až za chodu. Typ zde není vlastnost proměnné, do které se odkaz na objekt ukládá, ale je to pouze vlastnost objektu. K této otázce se ještě vrátíme v kapitole 6  Proměnné.

Kapitola 2
Zadávání jednoduchých hodnot

Co se v kapitole naučíte

Kapitola vám postupně vysvětlí, jak správně zapisovat číselné hodnoty včetně komplexních čísel. V průběhu výkladu ukáže nejčastější místa různých chyb. Poté vám představí některé speciální hodnoty, vysvětlí, co to jsou literály. Vynechá jen zadávání textů, kterým bude věnována celá příští kapitola. Na závěr zdůrazní význam přehlednosti programů.

Než se pustíme do něčeho složitějšího, naučíme se nejprve zadávat jednoduché hodnoty. Pojďme si to zkusit. Otevřete si IDLE (případně vámi preferované vývojové prostředí) nebo spusťte Python z příkazového řádku a experimentujte se mnou.

2.1  Zápis celých a desetinných (reálných) čísel

Zadáte-li nějakou hodnotu, na dalším řádku se tato hodnota vypíše. Python rozlišuje (jako ostatně většina programovacích jazyků) čísla celá a čísla desetinná, která bývají v učebnicích označována také jako reálná čísla nebo jako čísla s plovoucí desetinnou čárkou (anglicky floating point numbers). Občas budu tyto názvy používat i já.

Celá čísla můžete zadávat libovolně veliká, ale u desetinných čísel musíte mít na paměti, že nepožádáte-li o nestandardní zpracování, bude si je program pamatovat s přesností na přibližně 17 platných cifer nezávisle na tom, bude-li se jejich hodnota pohybovat v miliónech nebo milióntinách. Navíc musíte respektovat, že v programování se nepoužívá desetinná čárka, ale desetinná tečka. Reakci Pythonu na zadání velkého celého čísla a na zadání desetinného čísla s mnoha platnými číslicemi ukazuje výpis 2.1.

Výpis 2.1: Reakce na zadání velkého čísla

1>>> 12345678901234567890123456789

212345678901234567890123456789

3>>> 0.1234567890123456789

40.12345678901234568

5>>> 

Zpřehlednění dlouhých čísel pomocí znaku podtržení

Jak je z předchozí ukázky patrné, velká čísla jsou nepřehledná a při jejich zápisu se snadno udělá chyba, která se pak špatně hledá. Abychom zápis čísel zpřehlednili, povoluje Python vkládat doprostřed čísel znaky podtržení, které ale při výpisu hodnot ignoruje. Nenutí nás přitom k jejich vkládání na speciální pozice (např. mezi trojice číslic), protože v různých zemích platí různé zvyky. Jenom nesmíme vkládat podtržení na první a/nebo poslední pozici.

Zpřehlednění čísel z předchozího výpisu si můžete prohlédnout ve výpisu 2.2. Jak ukazuje řádek 2, u celých čísel se pamatují všechny zadané číslice, kdežto u desetinných čísel (přesněji u čísel typu float) se pamatuje jenom 16 až 17 platných cifer.

Výpis 2.2: Zpřehlednění čísel vložením podtržítek

1>>> 123_456_789_0_123_456_789_0_123_456_789

212345678901234567890123456789

3>>> 0.123_456_789_012_345_678_9

40.12345678901234568

5>>> 

Reálné číslo se v programu pozná podle toho, že v jeho zápisu použijeme desetinnou tečku, anebo v něm použijeme písmeno e nebo E, za něž zapíšeme číslo oznamující, kolikátou mocninou deseti se má vynásobit číslo zadané vlevo od znaku e, resp. E.3 O tom, zda při výpisu bude použit tvar s exponentem či bez něj, rozhodne Python podle toho, který je podle něj přehlednější.

Například číslo zadané ve výpisu 2.3 na řádku 1 vypsal na řádku 2 v exponentovém tvaru, i když bylo zadané klasicky, ale číslo zadané na řádku 3 vypsal na řádku 4 naopak klasicky, i když bylo zadané v exponentovém tvaru. (O tom, jak lze vypisovanou podobu ovlivnit, si povíme v kapitole 22  Formátování stringů.)

Jakmile je v zápisu čísla použita desetinná tečka nebo exponentový tvar, považuje je Python za desetinné, i kdyby se podle jeho hodnoty jednalo o číslo celé, tj. i kdyby mělo prázdnou desetinnou část. Python je vypíše s neprázdnou desetinnou částí, jak ve výpisu 2.3 ukazuje zobrazení čísel na řádcích 6 a 8.

Výpis 2.3: Zadávání a zobrazování desetinných čísel

1>>> 123_456_789_0_123_456_789_0_123_456_789.

21.2345678901234568e+28

3>>> 123e-3

40.123

5>>> 123.

6123.0

7>>> 123e3

8123000.0

9>>> 

2.2  Komplexní čísla

Python má vestavěnou podporu práce s komplexními čísly. Komplexní čísla se pak zapisují jako součet reálné a imaginární části, přičemž imaginární část se neoznačuje písmenem i, jak nás to učili v matematice, ale písmenem j, které se používá v elektrotechnice a řídicí technice, protože písmeno i je vyhrazené pro označení elektrického proudu. V Pythonu je přitom jedno, jestli použijete malé j nebo velké J – viz výpis 2.4.

Výpis 2.4: Zadávání a zobrazování komplexních čísel

1>>> 3+5j

2 (3+5j)

3>>> 7j+5

4 (5+7j)

5>>> 1 + 1J

6 (1+1j)

7>>> 1+j

8Traceback (most recent call last):

9  File "<pyshell#31>", line 1, in <module>

10    1+j

11NameError: name 'j' is not defined

12>>> 2j

132j

14>>> 0+3j

153j

16>>> 

Jak ve výpisu 2.4 ukazuje chybová zpráva vyvolaná v reakci na příkaz na řádku 7, na rozdíl od matematiky nemůžeme napsat písmeno j samotné, ale vždy u něj musíme uvést číslo. Jak ale naznačuje ukázka na řádku 12, nemá-li dané číslo reálnou část, nemusíme ji uvádět. Na řádcích 13 a 15 se můžete přesvědčit, že při zobrazování čísla s nulovou reálnou částí Python nezdůrazňuje jeho „komplexnost“ uzavřením do závorek, jak to dělal u čísel, které měly obě části nenulové.

Chybové zprávy mají přesně definovanou strukturu, kterou se budeme učit analyzovat v podkapitole 16.2  Chybové zprávy.

2.3  Počáteční nula

Vraťme se ale k celým číslům. Pro ně platí jedno důležité upozornění: v Pythonu nesmíte zapsat celé číslo s počáteční nulou! U desetinných čísel to nevadí, ale u celých čísel je to zakázané a způsobí to syntaktickou chybu.

Důvodem pro tento zákaz je to, že v jazyce C a v jazycích přebírajících jeho syntaxi (Java, C++, Groovy, C#, …) se počáteční nula používá k označení toho, že číslo je zapsané v osmičkové soustavě. To je ale potenciálním zdrojem chyb, který je o to větší, že jazyk Python nebyl primárně vyvíjen pro programátory, ale pro odborníky z jiných profesí, kteří si občas potřebují něco naprogramovat.

Autor jazyka Python se proto rozhodl tento způsob označení osmičkových čísel zakázat a zapisovat čísla ve všech alternativních číselných soustavách (za chvíli o nich bude řeč) shodně. Ve výpisu 2.5 je na řádku 1 zadáno číslo začínající nulou a na následujícím řádku je pak reakce systému, který tento zápis označí za syntaktickou chybu.

Výpis 2.5: Zápis čísel v alternativních číselných soustavách

1>>> 0123

2SyntaxError: leading zeros in decimal integer literals are not permitted; use an 0o 
prefix for octal integers

3>>> 0b1111_1111

4255

5>>> 0o377

6255

7>>> 0xFF

8255

9>>> 0o0123_4567

10342391

11>>> 0x0123_4567_89AB_BCDEF

121311768467463720431

13>>> -0b0010

14-2

15>>> 

2.4  Zadávání čísel v jiných číselných soustavách

V některých programech je výhodné, můžeme-li zadávat čísla i v jiných číselných soustavách, především ve dvojkové, osmičkové a šestnáctkové. Možnost zadávat čísla v těchto soustavách oceníte například tehdy, chcete-li pracovat s jednotlivými bity zadaných hodnot. (Budeme se tomu podrobněji věnovat v podkapitole 7.5  Operace s jednotlivými bity.)

Chcete-li zadat číslo v některé z těchto soustav, napíšete nulu následovanou písmenem označujícím soustavu a číslem zapsaným v zadané soustavě. Pro označení číselné soustavy se používají následující předpony:

0b  0B Dvojková (binární) soustava.

0o  0O Osmičková (oktalová) soustava.

0x  0X Šestnáctková (hexadecimální) soustava.

Na tom, zda k označení číselné soustavy použijete malé či velké písmeno, nezáleží. Obdobně nezáleží na tom, použijete-li jako šestnáctkové číslice malá či velká písmena.

Před chvílí jsem vysvětloval, že v Pythonu je zakázáno začínat zápis celých čísel nulou. Při zápisu čísel ve výše uvedených soustavách to již neplatí a úvodní nuly se naopak často používají k zpřehlednění zápisu.

Ve výpisu 2.5 si můžete prohlédnout zápis čísla 255 v jednotlivých soustavách a pak v osmičkové a šestnáctkové soustavě zapsaná čísla, která obsahují všechny číslice své číselné soustavy. Na řádku 13 je pak demonstrována možnost zadání záporného čísla.

2.5  Platí – neplatí

Jednou za čas potřebujeme zadat, zda něco platí, nebo neplatí. Python pro označení toho, že něco platí, používá konstantu True, pro označení toho, že to neplatí, pak konstantu False. Programátory se zkušenostmi z jiných jazyků upozorňuji, že v Pythonu se tyto konstanty píší s velkým počátečním písmenem.

2.6  Nic – None

Jednou za čas potřebujeme oznámit, že v danou chvíli nemáme žádná data k dispozici. V takovém případě nás nula nebo prázdný string nezachrání, protože jak nula, tak prázdný řetězec jsou platná data. Pro označení toho, že v daném okamžiku nemám k dispozici žádná data, slouží v Pythonu konstanta None, což je řádný objekt reprezentující ono NIC.

Když v interaktivním režimu zadáte hodnotu None, interpret se tváří, jako kdybyste nic nezadali, tj. nic nevytiskne a zobrazí nový řádek s výzvou >>>  (viz výpis 2.6).

2.7  Výpustka – Ellipsis, ...

Při psaní programů se co chvíli vyskytne situace, kdy víme, že na daném místě musíme něco zadat, ale v danou chvíli ještě nevíme, co tam právě patří. Předpokládáme přitom, že to zanedlouho vědět budeme, ale teď potřebujeme nějakou náhražku, jejímž vložením uspokojíme požadavky syntaxe. V roli této náhražky se občas používá právě objekt Ellipsis, jenž má „přezdívku“ ... (tři tečky – v běžném textu tento symbol označuje výpustku). Tato přezdívka sice odporuje pravidlům pro tvorbu identifikátorů, ale překladač ji akceptuje – viz výpis 2.6.

Výpis 2.6: Reakce na použití objektů None a ... (Ellipsis)

1>>> None

2>>> ...

3Ellipsis

4>>> 

2.8  Objekt NotImplemented

Třetím nestandardním objektem je objekt s názvem NotImplemented, který se používá v situacích, kde někdo chce po daném objektu něco, co programátor ještě nedefinoval, anebo definoval, ale nezabezpečil, aby o tom daný objekt věděl. S použitím se setkáte ve výpisu 7.1 nebo ve výpisu 34.1.

2.9  Literály

Přímá zadání hodnoty, která jsme probírali v této kapitole, se označují jako literály. Obecně bychom mohli říci, že literál je konstanta nazvaná svojí hodnotou. Napíšete-li v programu např. 7 nebo None, zapsali jste literál.

Každý jazyk definuje, které druhy dat je možné zapsat prostřednictvím literálů. Všechny jazyky, které znám, umožňují zapsat prostřednictvím literálů celá čísla, reálná čísla (pokud je podporují) a krátké texty, které lze zadat na jeden řádek kódu. Některé jazyky podporují zadávání víceřádkových textů a dalších druhů dat. Z pohledu na to, co vše lze zadat jako literál, patří Python mezi ty bohatší.

My jsme zatím probrali zadávání jednoduchých hodnot. V další kapitole vám ukážu, jak se v Pythonu zadávají texty a pak si předvedeme, že Python umožňuje zadat prostřednictvím literálů i některé kontejnery a časem k nim přidáme i další druhy dat.

2.10  Důležitost přehlednosti

Jednou z nejdůležitějších zásad správného programování je povinnost psát své programy maximálně přehledné. Martin Fowler, známý počítačový guru, napsal ve své knize Refactoring:

Napsat program, kterému rozumí počítač, umí každý trouba.
Dobří programátoři píší programy, kterým rozumějí lidé.

Řada programátorů se snaží vytvářet programy, které budou maximálně rychlé a spotřebují minimum paměti. Zkušenost však ukazuje, že ve většině případů dokáže počítač optimalizovat program rychleji a efektivněji. Ve srozumitelně napsaných programech se většinou vyzná lépe i optimalizační program, a proto bývají optimalizovány lépe, než by to dokázal člověk.

Kdykoliv budu v následujícím textu uvádět více možností zápisu programu, tak mějte na paměti důležitou programátorskou zásadu:

Pří výběrů z několika možných verzí návrhu programu platí,
že lepší verze je téměř vždy ta,
která je pro vás přehlednější a pochopitelnější,
protože při jejím používán uděláte méně chyb,
a budete proto se svojí prací dříve hotovi a odevzdáte kvalitnější program.

Začínající programátoři se většinou lépe vyznají v podrobněji rozepsaném kódu, ti zkušení již většinou myslí ve zkratkách, a dávají proto přednost hutnějším verzím.

Nesnažte se dokazovat si, že jste zkušení programátoři tím, že budete preferovat hutnější podobu zápisu. Snažte se program psát tak, abyste mu bez problémů porozuměli nejenom zítra, ale po roční odmlce, kdy už si jeho podobu nebudete pamatovat a při pokusech o jeho úpravu či zdokonalení zjistíte, že je pro vás stejně cizí jako program nějakého jiného člověka.

Kapitola 3
Zadávání textů – stringů

Co se v kapitole naučíte

Kapitola vám vysvětlí, jaké možnosti Python nabízí pro zadávání textů. Ukáže, jak se v Pythonu zapisují komentáře a jak zadávat kód, který se při dodržování konvencí nevejde na jeden řádek. Poté vám předvede, jak vhodnou předponou modifikovat význam zadávaného stringu. Představí vám f-stringy a ukáže, k čemu je můžete využít.

3.1  Zadávání textů

V programu často potřebujeme zadávat nejrůznější texty. Krátké texty, které zadáváme přímo v kódu, se oficiálně nazývají textové řetězce, ale programátoři je slangově označují jako stringy. Protože tento termín je mezi programátory hluboce zakořeněný, budu jej v dalším textu používat.

Pro text, který můžeme zadat na jednom řádku, poskytuje Python dva možné způsoby zápisu: zadávaný text musí být vždy uzavřen mezi apostrofy nebo mezi uvozovky (viz výpis 3.1). Jejich význam se nijak neliší, jenom musíte dbát na to, abyste hraniční znak použitý na počátku použili i na konci.

Volba hraničního znaku může být ovlivněna tím, zda potřebujete některý z nich použít uprostřed textu – viz příkazy na řádcích 5 a 7 ve výpisu 3.1.

Výpis 3.1: Zápis jednořádkového textu

1>>> "Text v uvozovkách"

2'Text v uvozovkách'

3>>> 'Text v apostrofech'

4'Text v apostrofech'

5>>> "Potřebuji 'apostrof'"

6"Potřebuji 'apostrof'"

7>>> 'Potřebuji "uvozovky"'

8'Potřebuji "uvozovky"'

9>>> 

Jak jste si jistě všimli, Python dává při zobrazení stringů přednost apostrofům. Uvozovky použije k ohraničení textu pouze tehdy, je-li ve vypisovaném textu použit apostrof, jak učinil na řádku 6.

Jak už bylo řečeno, takto označený text se musí vejít na jeden řádek. Chcete-li zadat několikařádkový text a rozhodnete se pokračovat na následujícím řádku před ukončením zadávaného textu uvozujícím znakem, systém ohlásí chybu (viz reakce na řádku 2 ve výpisu 3.2).

Výpis 3.2: Zápis víceřádkového textu

1>>> "Neukončený text

2SyntaxError: unterminated string literal (detected at line 1)

3>>> """několikařádkový

4... text"""

5'několikařádkový\ntext'

6>>> '''Jiný způsob

7... zápisu'

8... '''

9"Jiný způsob\nzápisu'\n"

10>>> '''Musí být 'odděleny''''

11SyntaxError: unterminated string literal (detected at line 1)

12>>> ''''Apostrof'.'''

13"'Apostrof'."

14>>> ""

15'' 

16>>> 

Jak ale výpis 3.2 naznačuje, ohraničíte-li zadávaný text trojicemi apostrofů či uvozovek, Python bude konec řádku považovat za součást zadávaného textu, dokud nezadáte uzavírající trojici. Jak se můžete přesvědčit na řádcích 5 a 9, při výpisu zadaných textů pak interpret na místech, kde končí jednotlivé řádky zadaného textu, vypíše dvojici znaků \n označující právě konec řádku. Tento znak můžete použít k označení konce řádku i vy, ale to si předvedeme v příští kapitole, až budete umět zobrazit, že jste opravdu zadali několikařádkový text.

Jak demonstruje text zadávaný na řádcích 6–8, použijete-li k ohraničení textu trojici znaků, můžete uvnitř textu použít i stejný znak, jaký se vyskytuje v ohraničujících trojicích (například uvnitř textu ohraničeného trojicemi uvozovek se smějí vyskytovat jednoduché či zdvojené uvozovky). Tyto znaky se jenom nesmějí nacházet v bezprostředním sousedství uzavírací trojice.

Apostrof na konci řádku 7 je od uzavírající trojice oddělen koncem řádku. Text zadávaný na řádku 10 však vyvolá chybu, protože je závěrečný apostrof nalepen na uzavírající trojici apostrofů. Jak ale ukazuje text na řádku 12, přilepení na otevírající trojici nevadí. Důležité je, aby mezi případným apostrofem a uzavírající trojicí apostrofů byl nějaký jiný znak. Jak si jistě domyslíte, totéž platí i pro uvozovky.

Reakce na příkaz na řádku 14 ukazuje, že Python je schopen pracovat i s prázdným stringem, tj. se stringem, který neobsahuje žádný znak.

Programátoři v jiných jazycích budou možná překvapeni, že Python nezavádí samostatný datový typ pro znaky. Znaky se v něm zadávají jako jednoznakové stringy. Druhou možností je převést znak na číslo s jeho kódem, a pracovat dále s tímto číslem.

3.2  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ší jiným programátorům (a po čase i sobě), je doplnit jej vysvětlujícími komentáři.

V Pythonu jsou komentáře uvozeny znakem # (mříž) a ukončeny koncem řádku. Komentáře, které mohou zabírat více řádků, známé z některých jiných jazyků, Python nezavádí. Potřebujete-li zapsat několikařádkový komentář, musíte každý řádek komentáře začít znakem #.

Alternativní možností zápisu víceřádkových komentářů (a možností hojně využívanou) je zapsat na daném místě místo komentáře textový řetězec. Pokud se totiž v programu objeví text, který se nikam nepřiřazuje, překladač jej ignoruje. Pouze v interaktivním režimu se hodnoty, jež jsou výsledkem zadaného výrazu (například textového řetězce), následně zobrazují.

Jak si ve vhodnou chvíli vysvětlíme a ukážeme,4 textový řetězec umístěný na počátku definice je Pythonem chápán jako dokumentační komentář označovaný často jako docstring a Python vám jej na požádání zobrazí jako součást nápovědy. To platí nejenom pro kód, jenž je součástí standardní knihovny, kterou jste si spolu s Pythonem instalovali, ale i pro kód vámi definovaný.

Klasický komentář začínající znakem # můžete zadat na konec téměř libovolného řádku. Jedinou výjimkou jsou víceřádkové texty, protože zadáte-li do nich znak #, bude se překladač domnívat, že tento znak je součást zadávaného textu. Jinými slovy: komentář musíte zadat až za stringem. Vše jsem se snažil předvést ve výpisu 3.3.

Řada programátorů komentáře ignoruje a nastavuje svá vývojová prostředí tak, aby byly komentáře co nejméně nápadné a při pročítání kódu je neobtěžovaly. Protože většinou vytvářím výukové programy, jejichž čtenáři dodatečné informace v komentářích často ocení, mám ve svých prostředích naopak nastaveno, že komentáře jsou podbarveny. Bude tomu tak i ve výpisech komunikace s prostředím a v definicích částí programů v této knize.

Výpis 3.3: Komentáře

1>>> # Řádek obsahující jen komentář

11>>> 0123   # Špatně zapsané číslo - počáteční nula je zakázaná

12SyntaxError: leading zeros in decimal integer literals are not permitted; use 
an 0o prefix for octal integers

13>>> "Jednořádkový text"    # Tento text lze okomentovat

14'Jednořádkový text'

15>>> ''' Víceřádkový    # Toto není komentář, ale součást textu

16... text'''

17' Víceřádkový    # Toto není komentář, ale součást textu\ntext'

18>>> # Potřebujete-li vysvětlit něco složitějšího,

19>>> # musíte místo víceřádkového komentáře zadat sérii

20>>> # jednořádkových komentářů

21>>> 

Escape sekvence

Zadávaný text občas obsahuje znak, který neumíte zadat z klávesnice, nebo se to jenom v daném okamžiku nehodí. Ve výpisu 3.2 byl takovým znakem znak konce řádku. Pro takovéto znaky jsou definovány tzv. únikové posloupnosti, které však programátoři nenazvou jinak než slangovým escape sekvence. Jsou to skupiny znaků začínající znakem \ (zpětné lomítko, anglicky back slash). Python definuje následující escape sekvence:

\\Zpětné lomítko. Vzhledem k tomu, že se používá jako metaznak uvozující tyto posloupnosti, měli byste je zadávat zdvojené. Vložíte-li je však před znak, který není uveden v následujícím přehledu escape sekvencí, zastupuje samo sebe – viz výpis 3.4. Doporučuji to však nevyužívat.

\'Apostrof (kód \x27).

\"Uvozovky (kód \x22).

\aZvukové znamení (BEL – kód \x07).

\bBackspace (BS – smazání předchozího znaku – kód \x08).

\fKonec stránky (Form Feed – FF – kód \x0c).

\nNový řádek (New Line – NL – kód \x0a).

\rNávrat vozíku (Carriage Return – CR – kód \x0d).

\tVodorovný tabulátor (TAB nebo HT – kód \x09).

\vSvislý tabulátor (Vertical Tab – VT – kód \x0b).

\OOOZnak s 8bitovým kódem zadaným v osmičkové soustavě;
O představuje osmičkovou číslici – např. '\101' == 'A'.

\xhhZnak s 8bitovým kódem zadaným v šestnáctkové soustavě;
h představuje šestnáctkovou číslici – např. '\x42' == 'B'.

\uhhhhZnak s 16bitovým kódem zadaným v šestnáctkové soustavě;
h představuje šestnáctkovou číslici – např. '\u263A' == '☺').

\UhhhhhhhhZnak s 32bitovým kódem zadaným v šestnáctkové soustavě;
h představuje šestnáctkovou číslici – např. '\U0000266b' == '♫'.

\N{název}Znak, který má v sadě Unicode zadaný název – například
'\N{DEGREE CELSIUS}' == '\u2103' == '℃'
nebo
'\N{WHITE SMILING FACE}' == '\u263a' == '☺'

Ukázku možností zadání znaků najdete ve výpisu 3.4.

Při čtení předchozího textu se možná někteří divili, proč ekvivalentnost několika druhů zápisu označuji dvojicí rovnítek. Je to proto, abyste mohli zápis zadat interpretu Pythonu (čtenáři elektronické verze knihy jej mohou zkopírovat do schránky a pak zkopírovat do příkazového řádku za výzvu >>>). Python vám pak odpovědí True oznámí, že podle něj jsou porovnávané výrazy ekvivalentní (viz řádky 9 a 10 ve výpisu 3.4), takže je jedno, jakým z uvedených způsobů je zadáte.

Výpis 3.4: Zadání znaků pomocí escape sekvencí

1>>> '\007\x09\x0a\x0d\x22\x27'

2'\x07\t\n\r"\''

3>>> '\u263a'

4'☺'

5>>> '\N{ZOMBIE}\N{DEGREE CELSIUS}\N{WHITE SMILING FACE}\N{SPACE}'

6'\U0001f9df\u2103\u263a '

7>>> '\N{DEGREE CELSIUS}\N{WHITE SMILING FACE}'

8'℃☺'

9>>> '\N{WHITE SMILING FACE}' == '\u263a' == '☺'

10True 

11>>> '\P\ř\í\k\l\a\d'    # Jako escape sekvence se vezme jen \a

12'\\P\\ř\\í\\k\\l\x07\\d'

13>>> 

Na řádku 1 je zadáno několik znaků ze sady ASCII (znaky s kódem menším než 0x80=128). První znak se převede z dnes již téměř nepoužívaného osmičkového zápisu do zápisu v šestnáctkové soustavě, ty další pak převede do alternativní, srozumitelnější podoby.

Řádek 3 demonstruje zadání znaků, které sice jsou v používané znakové sadě (fontu), avšak z klávesnice je zadat nelze.

Řádek 5 se pak snaží ukázat možnost zadání znaku názvem. Jak ale vidíte, není-li zadaný znak v použité znakové sadě, vypisuje jej Python kódem. Protože kód zadaného znaku je větší než 65 535 (největší číslo zapsatelné pomocí čtyř šestnáctkových číslic), musel pro první z uvedených znaků použít způsob určený pro zápis 32bitového kódu. Další dva zobrazil zadáním 16bitového kódu a závěrečnou mezeru zobrazil jako mezeru.

Zajímavé je, že prostřednictvím kódu zobrazil první tři znaky, přestože druhé dva v tabulce má. Následující mezeru však již zobrazil jako mezeru. Když byl ale na řádku 7 požádán o zobrazení obou zobrazitelných znaků, bez problému je na řádku 8 zobrazil.

Na řádku 9 už pouze demonstruji možnost ověření ekvivalence několika způsobů zápisu, o němž jsem hovořil v poslední poznámce.

Příkaz na řádku 11 demonstruje skutečnost, že jako escape sekvence se akceptuje pouze zpětné lomítko následované jedním z výše vyjmenovaných znaků. Před ostatními znaky je interpretováno jako zpětné lomítko. Vytištěno je však vždy zdvojené.

Zadáte-li výrazy na řádku 3 nebo 7 na svém počítači, nemusí se vám příslušné znaky zobrazit. Záleží na tom, jaký používáte font.

Bílé znaky

V souvislosti se zadáváním textů bych měl připomenout rozšířený termín bílý znak (whitespace character), kterým označujeme znaky reprezentující prázdná místa, například mezeru, tabulátor, svislý tabulátor, konec řádku, konec stránky atd. Zájemci najdou jejich přehled na https://en.wikipedia.org/wiki/Whitespace_character.

3.3  Slučování sousedních textových literálů

Následuje-li v kódu za sebou několik textových literálů, Python z nich udělá jediný souvislý string. Když chcete v jiných jazycích sloučit několik textových literálů, musíte je většinou sčítat (pokud to daný jazyk dovoluje). V Pythonu je stačí prostě umísit za sebe. Je přitom jedno, jaké ohraničení je u jednotlivých sousedících stringových literálů použito (uvozovky × apostrofy, jednoduché × trojité).

Na první pohled to vypadá jako hloupost – proč je nesloučit hned a nechávat jejich sloučení až na překladači? Důvod je jednoduchý: občas potřebujete zapsat do programu delší několikařádkový text a uspořádat jej tak, aby bylo hned zřejmé, jak bude vypadat vytištěný.

Použití víceřádkových stringů se v takových případech často nehodí, protože nabourávají vzhled programu (ukážu vám to ve výpisu 11.3). Použitím vhodně poskládaných jednořádkových stringů tak můžete požadované uspořádání vhodně naznačit. Ukázku si můžete prohlédnout ve výpisu 3.5 na řádcích 4–5 a 12–13.

Výpis 3.5: Zadání na více řádcích

1>>> "Dobrý \

2... den"

3'Dobrý den'

4>>> ("První řádek\n"

5...  "Druhý řádek ")

6'První řádek\nDruhý řádek '

7>>> "První" +

8SyntaxError: invalid syntax

9>>> "První" + # Před předčasným ukončením řádku není komentář povolen\

10SyntaxError: invalid syntax

11>>> # Samostatný komentář končící zpětným lomítkem \

12>>> "První " + \

13... "druhý"  # Komentář lze umístit až na poslední řádek víceřádkového zadání

14'První druhý'

15>>> 

3.4  Zadání na více řádcích

Doposud se nám všechna zadání s výjimkou víceřádkových stringů vešla na jeden řádek. Někdy je však zadání delší a nechceme-li s ním utíkat někam za kraj obrazovky, potřebujeme je rozdělit do více řádků. Navíc konvence Pythonu doporučují, že by řádky programu neměly být delší než 79 znaků (viz přílohu C  Konvence pro psaní programů v Pythonu na webové stránce knihy). Python k tomu nabízí několik možností, které jsou postupně předvedeny ve výpisu 3.5.

•Ukončíme-li řádek zpětným lomítkem a pokračujeme na dalším řádku, překladač řádky sloučí a pracuje s nimi jako s jediným dlouhým řádkem. Jak ukazuje zadání textu na řádcích 1–2, můžeme to provést dokonce i uprostřed zadávaného textu.

Teoreticky by za zpětným lomítkem měl bezprostředně následovat konec řádku, ale pokud se mezi lomítko a konec řádku vloudí nějaké mezery, překladač je bude ignorovat.

•Zadáme-li text do závorek a řádek ukončíme před uzavřením příslušné závorky, překladač očekává na dalším řádku pokračování. Už jsem vám to předvedl ve výpisech 1.1 a 1.2, a vyzkoušeli jsme si to i při zadávání několikařádkových textů uzavřených mezi trojité apostrofy či uvozovky, které v dané situaci zastávají roli závorek.

Ukončíte-li řádek předčasně před uzavřením závorky, můžete na jeho konec dokonce vložit komentář, což lze občas s výhodou využít.

Zadání na řádku 7 demonstruje, že na rozdíl od řady jiných jazyků není možné řádek ukončit binárním operátorem, který by očekával na dalším řádku druhý argument.

Jak ukazuje zadání na řádku 9 a reakce na řádku 10, stejně tak není možné ukončit zpětným lomítkem řádek, v němž za neukončený příkaz vložíte nějaký komentář. Python totiž všechny znaky komentářů ignoruje a s nimi i zpětné lomítko, kterým bychom chtěli naznačit pokračování zadání na dalším řádku. Ukazuje to i samostatně stojící komentář na řádku 11.

U víceřádkových zadání je nutné umístit případné komentáře buď na poslední řádek tohoto zadání (to demonstruje zadání na řádcích 12–13), anebo pak na samostatný řádek před či za toto zadání. Můžete si to představit tak, že u příkazů rozdělných do více řádků můžete komentář umístit pouze tam, kam byste jej mohli umístit, kdyby byl daný příkaz na jediném (byť velmi dlouhém) řádku.

3.5  Prefixy stringových literálů

Vedle základních literálů zmíněných na počátku kapitoly zavádí Python ještě několik speciálních literálů, v nichž se před uvozovky či apostrofy zadává prefix indikující zvláštní zacházení s daným stringem. Používají se následující prefixy:

B nebo bPři použití tohoto prefixu se nezadává string typu str, ale string typu bytes, který se odlišuje tím, že jeho znaky jsou kódovány jedním bajtem, přičemž je možné zadat použitou kódovou stránku použitého kódování. Tento typ se používá při práci s binárními daty.

F nebo fTento prefix byl zaveden ve verzi 3.6 a zadává tzv. formátovaný stringový literál (formatted string literal) označovaný často jako f-string. Může obsahovat tzv. nahrazovací pole (replacement fields) ohraničená složenými závorkami {} a obsahující výraz doplněný o formátovací instrukce. Každé nahrazovací pole bude za chodu nahrazeno hodnotou příslušného výrazu.

R nebo rSurový (ve smyslu nezpracovaný) literál (raw literal) nerespektuje escape sekvence, ale každý znak v něm představuje sám sebe. Výjimkou je pouze ohraničující znak (apostrof či uvozovky), který je třeba nadále zadávat se zpětným lomítkem. Surový stringový literál se s výhodou používá při zadávání cest k souborům nebo regulárních výrazů, jenom musíte dávat pozor, aby nekončily zpětným lomítkem.

U nebo uString kódovaný v Unicode. Ve znakové sadě Unicode jsou od verze 3 kódovány všechny stringy kromě těch zadaných s prefixem B/b. Prefix U/u byl přidán pro usnadnění převodu programů napsaných původně pro verzi 2. Při psaní svých programů jej nepoužijete.

brPrefixy b a r lze použít současně, přičemž na velikosti ani pořadí znaků nezáleží; kterákoliv z osmi možných kombinací (BR, Br, RB, Rb, bR, br, Rb, rb) je platná. V této učebnici se s tímto prefixem nesetkáte.

frPrefixy f a rlze použít současně, přičemž na velikosti ani pořadí znaků nezáleží; kterákoliv z osmi možných kombinací (FR, Fr, RF, Rf, fR, fr, rF, rf) je platná. Je však vhodné používat pokaždé stejnou (já preferuji fr, ale nijak vám to nevnucuji).

3.6  Stringová interpolace – f-stringy

Práce s f-stringy bývá často označována jako literálová stringová interpolace (anglicky Literal String Interpolation), protože při ní literál nedefinuje daný string přesně, ale obsahuje různé interpolace,5 jejichž vyhodnocením teprve získáme výsledný tvar.

Samodokumentující se výrazy

Python 3.8 zavedl velmi užitečnou novinku: napíšete-li v nahrazovacím poli za vyhodnocovaný výraz rovnítko, vytiskne se příslušný výraz následovaný rovnítkem a hodnotou tohoto výrazu. Výraz v závorkách se přitom opíše doslovně, tj. včetně uvedených mezer a dalších bílých znaků.

Shrnutí zásad pro práci s f-stringy

Pro práci s f-stringy platí některé zásady – pojďme si projít ty, které se nás mohou týkat již v této etapě výkladu (časem je ještě doplníme).

•Pro f-stringy platí stejná pravidla jako pro normální stringy. Mohou je ohraničovat apostrofy, uvozovky, trojice apostrofů či trojice uvozovek. Označují se tím, že se před úvodní ohraničení napíše předpona f nebo F.

•Vedle předpony f/F lze doplnit i předponu r/R, o níž jsem hovořil před chvílí.

•F-stringy mohou obsahovat nahrazovací pole, v nichž se mohou vyskytovat výrazy, jejichž hodnota se má zobrazit.

>>> f'16+2 = {16+2}'

'16+2 = 18'

•Při ladění můžeme využít toho, že bude-li výraz končit rovnítkem, bude do výsledku opsán celý výraz včetně případných mezer a závěrečného rovnítka, a za něj pak výsledek vyhodnocení.

>>> f"Kontrola: {16+2 = }"

'Kontrola: 16+2 = 18'

•Výrazy v nahrazovacích polích jsou vyhodnocovány zleva doprava, což má vliv na výsledek pouze tehdy, budou-li mít některé vyhodnocované výrazy vedlejší efekt.

•F-stringy můžeme vytvořit jako součet nebo složeninu několika stringů, avšak musíme dát pozor, aby všechny sčítance obsahující nahrazovací pole byly zadány jako f-stringy, protože jinak se v součtu uplatní pouze jako obyčejný string.

>>> f'{15+2 = }, ' '{16+2 = }, ' \

... f'{17+2 = }, ' f'{18+2 = }'

'15+2 = 17, {16+2 = }, 17+2 = 19, 18+2 = 20'

K f-stringům se ještě vrátíme v podkapitole 6.14  F-stringy – rozšiřující informace a pak ještě jednou v kapitole 22  Formátování stringů, kde vám vysvětlím, jak v nich lze zadat formátování nahrazovacích polí.

3.7  Bajtové objekty

Schopnost práce s texty je při zpracování dat velmi důležitá, ale v mnoha případech získáváme data v binární podobě, anebo je v této podobě potřebujeme ukládat. Proto je třeba znát i datové struktury určené pro ukládání binárních dat a práci s nimi.

Bajtové stringy a bajtové literály

Bajtové stringy mají hodně společného s běžnými stringy. Liší se především v tom, že běžné stringy jsou instancemi třídy str a reprezentují různé texty, kdežto bajtové stringy jsou instancemi třídy bytes a slouží především k reprezentaci binárních dat. Jako stringy jsou ty bajtové označovány hlavně proto, že mají s „textovými“ stringy společnou (vedle řady dalších vlastností) podobu svých literálů.

Bajtové literály se od literálů běžných stringů liší zdánlivě pouze předponou b nebo B. Lze tak zadávat literály ohraničené apostrofy, uvozovkami, trojitými apostrofy i trojitými uvozovkami. Spolu s předponou b nebo B lze navíc používat i předpony r či R a f či F (viz výpis 3.6).

Při zadávání bajtových literálů si musíme uvědomit, že bajtové stringy jsou opravdu pojímány jako posloupnosti čísel – bajtů. Zadávání hodnot prostřednictvím znaků tak představuje poměrně efektivní formu zápisu. Teoreticky bychom mohli využít libovolný znak s kódem menším nebo rovným 255 (0xFF), ale tady narazíme na syntaktické omezení.

Výpis 3.6: Vytvoření bajtových stringů za použití literálů

22>>> b'Jen ASCII znaky'      # Korektní zadání

23b'Jen ASCII znaky'

24>>> b'Znak s kódem > 0x7F'  # Znak s nepřípustným kódem

25  File "<stdin>", line 1

26    b'Znak s kódem > 0x7F'  # Znak s nepřípustným kódem

27                            ^^^^^^^^^^^^^^^^^^^^^^^^^^^

28SyntaxError: bytes can only contain ASCII literal characters

29>>> b'Znak s k' + b'\xF3'   b'dem > 0x7F'       # Kód se musí zadat explicitně

30b'Znak s k\xf3dem > 0x7F'

31>>> rb'Create C:\A\B\C'     # Zadání surového stringu

32b'Create C:\\A\\B\\C'

33>>> br'C:\A\B\C created'    # Na pořadí předpon nezáleží

34b'C:\\A\\B\\C created'

35>>> 

Podle syntaktických pravidel totiž můžeme do bajtového stringu zadávat přímo pouze ASCII znaky, tj. znaky, jejichž kód je v rozmezí 32–127 nebo hexadecimálně 0x20–0x7F. Porušení tohoto pravidla je syntaktická chyba. Hodnoty, které nelze zadat prostřednictvím běžných znaků, je třeba v literálu zadávat prostřednictvím escape sekvencí.

Příkaz na řádku 1 ve výpisu 3.6 demonstruje korektní zadání bajtového stringu.

Příkaz na řádku 3 je syntakticky špatně, protože obsahuje znak 'ó', který má kód 243 (0xF3), což je více než povolených 127.

Jak vidíme na úspěšném zadání na řádku 8, chceme-li použít literál, musíme všechna čísla s hodnotami mimo rozsah 32–127 (0x20–0x7F) zadávat explicitně jako escape sekvence, anebo zvolit nějaký alternativní způsob zadávání.

Požadovaný bajtový string jsem zde mohl samozřejmě zadat tak, jak jej vidíte na řádku 9, ale chtěl jsem ukázat, že i bajtové stringy se dají sčítat a slučovat prostým skládáním za sebe.

Na řádcích 10 a 12 jsem pak demonstroval, že i bajtové stringy je možné zadat jako surové a že přitom na pořadí zadání předpon nezáleží.

Pokud někomu chybějí příklady s použitím ohraničení ve tvaru trojitých apostrofů nebo uvozovek, tak ho požádám, ať si to vyzkouší. Žádná omezení v tomto směru nejsou.

Třída bytearray – zadávání bajtových polí

Bajtová pole se od bajtových stringů liší tím, že jejich obsah můžete v průběhu programu měnit.

Pro zadávání bajtových polí platí prakticky totéž co pro zadávání bajtových stringů. Jediný rozdíl spočívá v tom, že bajtová pole nemají žádný literál, takže chcete-li jej z nějakého důvodu použít, musíte zadat bajtový string a ten pak zadat jako argument konstruktoru třídy bytearray – např.

bytearray(b'String of bytes')

Jiný rozdíl mezi zadáváním hodnot těchto dvou datových typů není.

Další informace

Dále se už bajtovými datovými typy v této příručce zabývat nebudeme. Poněkud podrobnější informace můžete získat v příručce [8], kde se dozvíte i něco o tom, jak se ukládají do souborů, resp. čtou ze souborů, a některé další informace.

Kapitola 4
Volání funkcí

Co se v kapitole naučíte

Tato kapitola vám vysvětlí, jak se volají funkce, a představí vám vestavěné funkce pracující s jednoduchými čísly a stringy. Poté vás naučí využívat nápovědu a v závěru vám ukáže, jak rozdělit volání funkce do více řádků.

4.1Volání funkčního objektu

Jednou z nejčastějších operací je volání funkčního objektu. Funkční objekt je objekt definující kód, který můžeme spustit – programátoři říkají zavolat. Proto jsou tyto objekty občas označovány jako volatelné objekty (callable objects).

Zavolat jako funkci můžeme často i objekt, který není primárně definován jako funkce (například třídu). V průběhu dalšího výkladu se s nimi budeme často setkávat. O tom, jak se definují, si povíme v podkapitole 34.5Operátor () – volatelné objekty.

Dokumentace Pythonu rozlišuje dva druhy funkčních objektů: lambda-výrazy a funkce, mezi něž zařadíme i metody a obecné volatelné objekty. Oba druhy reprezentují nějaký kód, který se aktivuje prostřednictvím jejich volání.

Termín funkce jistě znáte z matematiky. Napíšete-li ve výrazu například sin(x), předpokládáte, že při výpočtu se tento text nahradí hodnotou funkce sin v bodě x. V programování je to podobné. Jediným rozdílem oproti tomu, co znáte z matematiky, je to, že funkce (a obecně všechny funkční objekty) definované v programu mohou mít různý počet parametrů a v případě potřeby mohou být i bez parametrů.

Jinými slovy: zavoláte-li v programu funkci (a obecně funkční objekt), nahradí se v daném místě toto volání příslušnou hodnotou.

Funkce × metoda × volatelný objekt

Při popisu OO programů se často setkáte s termínem metoda. Význam termínů funkce a metoda se liší jen nepatrně: metoda je funkce, která patří nějakému objektu. Podrobnější výklad najdete v podkapitole 25.8Metody v části o OOP.

V dalším textu budu často hovořit o volatelných objektech, což jsou objekty, u nichž má smysl přidat za odkaz na daný objekt kulaté závorky s případným seznamem argumentů, protože se tak vyvolá nějaký přidružený kód. O tom, jak zařídit, že se nějaký objekt stane volatelným, si povíme v podkapitole 34.5Operátor () – volatelné objekty.

Parametr versus argument

V matematice se prostě hovořilo o parametrech funkce, ale v programování je třeba rozlišovat při práci s funkcemi dva druhy objektů: termínem parametr označujeme proměnnou,6 tj. schránku na hodnotu, s níž má funkce pracovat. Termínem argument pak označujeme výraz, jehož vyhodnocením získáme hodnotu, kterou do této proměnné uložíme.

V praxi se často místo zdlouhavého „hodnota argumentu“ používá jenom prosté argument. K této zkratce se budu často uchylovat i já a budu předpokládat, že si sami odvodíte, že při zadání nějakého výrazu se nebude funkci předávat tento výraz, ale hodnota vzniklá jeho vyhodnocením.

Chcete-li analogii ze života, tak si představte, že jste funkce, jejímž úkolem je vyhodnotit kvalitu dodaného pití. Váš parametr je sklenička, v níž bude testovaný vzorek. Bude-li po vás někdo něco chtít, musí dodat argument – nalít do skleničky obsah, který budete testovat.

V dřívějších dobách se pro označení parametru používal termín formální parametr a pro označení argumentu termín skutečný parametr. Některé učebnice programování (mezi nimi i některé moje starší učebnice) toto označení stále používají. Problém je však v tom, že pak při použití slova parametr není občas jasné, zda se hovoří o proměnné, nebo o hodnotě. Před několika lety jsem proto převzal označování parametr × argument, které považuji za mnohem výhodnější.

Syntaxe volání a návratová hodnota

Funkční objekt se volá v programu tak, že získáte odkaz na daný objekt (například napíšete název proměnné, v níž je uložen odkaz na tento objekt), za něj pak do závorek zapíšete seznam čárkami oddělených argumentů a on vám na jejich základě dodá (programátoři říkají: vrátí) požadovaný výsledek, tzv. návratovou hodnotu.

Některé funkční objekty mají za úkol pouze provedení nějaké činnosti a nežádáme po nich, aby vrátily nějakou hodnotu. Protože však podle pravidel jazyka musí každý funkční objekt něco vracet (jinak by jeho volání nemohlo představovat výraz, v němž se v kódu nahradí volání obdrženou návratovou hodnotou), vracejí takovéto funkční objekty hodnotu None.

Jak už jsme si řekli v podkapitole 2.6Nic – None, zadáme-li v interaktivním režimu hodnotu None nebo objeví-li se tato hodnota jako výsledek funkce, systém (na rozdíl od ostatních hodnot) nic nevytiskne a tuto hodnotu ignoruje.

Pořadí vyhodnocování a předávání argumentů

Některé programovací jazyky (např. C++) jsou koncipovány tak, že u funkcí s více parametry se překladač může operativně rozhodnout, v jakém pořadí bude v zájmu optimalizace jednotlivé argumenty vyhodnocovat a ukládat jejich hodnoty do parametrů. Když si to ale programátor neuvědomí a zadá argumenty tak, že na pořadí jejich vyhodnocení záleží (je to nemravnost, ale občas se s tím setkáte), může se dočkat lecjakých překvapení.

Většina moderních jazyků (a Python mezi nimi) proto považuje za mnohem výhodnější zaručit programátorovi pořadí vyhodnocování a předávání argumentů. Python vyhodnocuje a předává argumenty vždy zleva doprava. Do vyhodnocení následujícího argumentu se proto vždy pustí až poté, co je předchozí argument vyhodnocen a uložen do příslušného parametru.

Předpokládám, že je vám zřejmé, že se funkce spustí teprve poté, co jsou všechny argumenty vyhodnoceny a jejich hodnoty uloženy do příslušných parametrů.

Datové × funkční objekty

V dalším textu budu občas označovat některé objekty jako datové, nebo jako funkční.

•Datový objekt primárně neodkazuje na kód, který je možné spustit. Jeho hlavním účelem je uchování dat a manipulace s nimi. Může se ale stát, že těmi ukládanými daty jsou právě odkazy na funkce.

•Funkční objekt sice také uchovává data (například ví, jak se jmenuje, komu patří a řadu dalších věcí), ale hlavním důvodem jeho existence je to, že odkazuje na kód, který je možné spustit tak, že za odkaz na objekt vložíme kulaté závorky se seznamem argumentů, tj. se seznamem výrazů, jejichž hodnoty provádění volaného kódu ovlivní.

4.2Vestavěné funkce s jednoduchými argumenty

Python 3.11 definuje 71 vestavěných funkcí. Pro řádné použití řady z nich nemáte doposud potřebné znalosti jazyka – ty získáte až v dalších částech, v nichž vás seznámím s dalšími datovými strukturami (kontejnery, třídy, …) a s prací s nimi. Přestavím vám nyní ty, které pracují s jednoduchými hodnotami a vracejí jednoduché hodnoty (tj. ne skupiny hodnot), a které proto můžete smysluplně použít již v první části této učebnice. Jednotlivé funkce jsou seřazeny podle abecedy.

Zápis syntaxe

U některých funkcí z následujícího výčtu je uveden některý z jejich parametrů následovaný rovnítkem a hodnotou. To naznačuje, že zadání příslušného argumentu je nepovinné. Nezadáte-li jej, bude za něj dosazena implicitní hodnota uvedená za rovnítkem.

Pamatujte ale na to, že vynechání nepovinného argumentu nijak neosvobozuje od psaní kulatých závorek. Voláte-li funkci, které nechcete předat žádný argument, musíte za názvem volané funkce zapsat prázdné kulaté závorky (). Ty totiž říkají, že chcete volat kód spravovaný osloveným objektem – funkcí.

Druhé syntaktické pravidlo, na něž je třeba upozornit, je fiktivní závěrečný parametr /, který najdete v deklaraci řady následně uvedených funkcí. Jeho význam si podrobně vysvětlíme v podkapitole Povinně pojmenované argumenty. Prozatím bude stačit vědět následující:

•Jedná se o fiktivní parametr, do nějž se nic nedosazuje.

•Je-li vlevo od parametru / více parametrů s přiřazenou implicitní hodnotou, tak rozhodnete-li se nezadat některý z nich, nesmíte zadat ani žádný z následujících argumentů až k fiktivnímu parametru /.

O tomto fiktivním parametru se zmiňuji mimo jiné proto, že jej při dotazu na zadané funkce uvádí i funkce help() (bude jí věnována podkapitola 4.3Získání nápovědy), tak aby vás to nezaskočilo.

Přehled vestavěných funkcí s argumenty jednoduchých typů

V následujícím abecedním přehledu jsou uvedeny pouze vestavěné funkce s argumenty jednoduchých typů, s nimiž jsem vás již seznámil. Další sadu vestavěných funkcí vám představím v podkapitole 21.6Vestavěné funkce pracující s kontejnery, až probereme potřebné kontejnerové datové typy.

abs(x, /)

Vrátí absolutní hodnotu zadaného čísla (řádky 1–4).

>>>abs(-3.14)
3.14
>>>abs(1+1j)#Absolutníhodnotoukomplexníhočíslajejehovelikost
1.4142135623730951

ascii(objekt, /)

Vrátí string obsahující tisknutelnou reprezentaci zadaného objektu obdobně jako funkce repr (viz dále), ale na rozdíl od ní vloží místo znaků nepatřících do znakové sady ASCII (ne-ASCII znaky, tj. znaky s kódem větším než 0x7F=127) posloupnost znaků odpovídající escape sekvence typu \x, \u a \U. (Připomínám, že ve stringu se doporučuje zadávat zpětné lomítko jako dvojici zpětných lomítek – viz pasáž Escape sekvence.)

Součástí vráceného stringu jsou i ohraničující apostrofy nebo uvozovky.

>>>ascii('Příliš☺')
"'P\\u0159\\xedli\\u0161\\u263a'"

bin(number, /)

Očekává celé číslo a vrátí string se zápisem daného čísla ve dvojkové soustavě včetně úvodního 0b.

>>>bin(5)
'0b101'
>>>bin(-10)
'-0b1010'

bool(x=False, /)

Vrátí logickou hodnotu, na kterou se daná hodnota v případě potřeby převede (ukázky najdete spolu s výkladem ve výpisu 7.1).

complex(real=0, imag=0)

Jsou-li zadávané hodnoty parametrů číselné, vrátí komplexní číslo se zadanou reálnou a imaginární částí, přičemž se za případný nezadaný argument dosadí nula. Bezparametrická verze vrací 0j. V jednoparametrické verzi může být hodnotou argumentu i string, avšak nesmí obsahovat mezery. Je pak interpretován jako komplexní číslo.

>>>complex(),complex(0),complex(1),complex(1,2),complex(imag=3)
(0j,0j,(1+0j),(1+2j),3j)

divmod(x, y, /)

Očekává jako argumenty dvě (ne komplexní) čísla a vrátí dvojici hodnot obsahující jejich celočíselný podíl a zbytek po dělení. Pro celočíselné argumenty platí, že výsledek je (x//y, x%y). Pro reálné argumenty je to trochu složitější – podrobnosti najdete v dokumentaci.

eval(object, /)

Očekává, že argument je string, který vyhodnotí jako výraz a spočtenou hodnotu vrátí.

Deklarace této funkce je ve skutečnosti poněkud obecnější, takže až probereme potřebné partie, připomeneme si ji v podkapitole 21.6Vestavěné funkce pracující s kontejnery v plné kráse.

exec(object, /)

Očekává, že argument je buď kód (string), anebo spustitelný objekt (většinou funkce či lambda-výraz). V prvním případě zadaný kód interpretuje, ve druhém zadaný objekt spustí.

I tato funkce má poněkud obecnější deklaraci, takže si ji po probrání příslušných pasáží v podkapitole 21.6Vestavěné funkce pracující s kontejnery znovu připomeneme.

float(x=0, /)

Vrátí reálné číslo vytvořené ze zadaného čísla či stringu. Je-li argumentem string, požaduje, aby vyhovoval pravidlům pro zápis reálného čísla, na něž jej převede. Navíc jsou povoleny pouze úvodní a závěrečné bílé znaky. Není-li zadán argument, vrátí nulu.

>>>float()
0.0
>>>float("Číslo3.5")
Traceback(mostrecentcalllast):
File"<pyshell#5>",line1,in<module>
float("Číslo3.5")
ValueError:couldnotconvertstringtofloat:'Číslo3.5'
>>>float('-3.5\n')
-3.5

hash(obj, /)

Vrátí heš-hodnotu objektu (má-li ji), což je celé číslo, které daný objekt do jisté míry charakterizuje. Podrobněji si o heš-kódu povíme v podšeděném bloku Hešovatelné objekty.

help()
help(object, /)

Funkce slouží k získání nápovědy. Protože je ale výklad rozsáhlejší, je mu věnována samostatná podkapitola 4.3Získání nápovědy.

hex(number, /)

Očekává celé číslo a vrátí string se zápisem daného čísla v šestnáctkové soustavě včetně úvodního 0x.

>>>hex(8364)
'0x20ac'

chr(i, /)

Očekává celé číslo a vrátí string tvořený znakem s daným kódem. Je to vlastně inverzní funkce k funkci ord(), kterou zanedlouho probereme.

>>>chr(0x20ac)#Abyseznakzobrazil,musíbýtdefinovánvpoužitémfontu
'€'
>>>chr(0x1D120)#Houslovýklíčnenívpoužitémfontu=>zobrazilsejakokód
'\U0001d120'

id(object, /)

Vrátí celé číslo sloužící k identifikaci zadaného objektu. Toto číslo můžeme chápat jako virtuální adresu objektu. Objekty se stejným id považuje systém za totožné. Rozdílné objekty musí být na různých místech paměti, a proto musejí mít i rozdílná id. To si připomeneme v pasáži Porovnávání totožnosti objektů.

input(prompt=None, /)

Může být volána buď bez argumentů, anebo s argumentem představujícím text výzvy. Vypíše na standardní výstup zadanou výzvu (nebyla-li zadána, nevypíše nic) a čeká, až za ni uživatel zapíše to, k čemu byl vyzván, a stiskne Enter. Vrátí uživatelem zadaný text.

>>>input("Zadejčíslo:")
Zadejčíslo:123
'123'

int(x=0, base=10, /)

Prvním argumentem je objekt, který lze převést na celé číslo. Je-li argumentem reálné číslo, vrátí celé číslo představující jeho celou část. Je-li argumentem string, požaduje, aby vyhovoval pravidlům pro zápis celého čísla v desítkové soustavě, na něž jej převede. Přitom jsou povoleny pouze úvodní a závěrečné bílé znaky. Není-li zadán argument, vrátí nulu.

>>>int(3.9)#Připřevodusenezaokrouhluje,aleusekávásedesetinnáčást
3
>>>int(-3.9)#Stejnějetomuipřipřevoduzápornéhočísla
-3

Je-li zadán druhý argument, pak v prvním argumentu očekává string reprezentující celé číslo zadané v číselné soustavě definované druhým argumentem, který musí být rozsahu 2<=base<=36. V zadaném čísle jsou povolena zpřehledňovací podtržítka. Číselné soustavy se základem větším než 10 používají v roli dalších číslic písmena A–Z, resp. a–z. Velikost použitých písmen přitom nehraje roli.

Občas se proto můžete setkat s použitím soustavy o základu 36, která používá číslice a všechna písmena anglické abecedy. V zadávaných číslech–textech přitom můžete využívat toho, že Python pro zpřehlednění zadávaných hodnot umožňuje vkládat do čísel znaky podtržení (viz výpis 2.2), jež můžete použít místo mezery, která mezi povolené znaky nepatří.

>>>int('1010',2)
10
>>>int('1010',16)
4112
>>>int('No_nazdar',36)
1856027718675

len(obj, /)

>>>len("")
0
>>>len('12345')
5

list(x)

max(arg1, arg2 ...)
min(arg1, arg2 ...)

oct(number, /)

>>>oct(255)
'0o377'

ord(c, /)

>>>ord('€')
8364

pow(base, exp, mod=None)

print(argumenty)

range(stop)
range(start, stop, step=1, /)

repr(obj, /)

round(number, ndigits=None)

str(object='')

type(object)

4.3Získání nápovědy

Argument zadán

Nápověda k některým operátorům a konstrukcím jazyka

6

Bez argumentu

2

4.4Rozdělení volání na více řádků