Další posloupnosti a jiné věci

O čem si budeme povídat?

Takže… Nyní už víme, jak v jazyce Python zapisujeme jednotlivé příkazy. Začali jsme také brát v úvahu data a to, co s nimi můžeme dělat. Napsali jsme při tom pár delších posloupností s rozsahem, dejme tomu, 5 až 10 řádků. Přibližujeme se k tomu, abychom začali psát opravdu užitečné programy. Je tu ale jeden háček. Naše programy se ztrácejí, kdykoliv skončíme práci s Pythonem. Pokud jste zkoušeli příklady v jazycích VBScript a JavaScript, museli jste si je uložit do souboru. Proto jste je mohli spouštět opakovaně. Totéž bychom potřebovali u programů v jazyce Python. Už jsem se zmínil o tom, že k tomu můžete použít libovolný textový editor, jako je například Notepad nebo pico, a výsledek uložit do souboru s příponou .py. Poté můžete výsledek spustit z příkazového řádku — viz kapitola Začínáme. Ale existuje jednodušší způsob.

The joy of being IDLE[1]

Když jste si instalovali Python, nainstalovala se vám současně užitečná aplikace, která je sama napsána v jazyce Python. Nazývá se IDLE a je tím, čemu se říká integrované vývojové prostředí. To znamená, že jde o jednu aplikaci, která v sobě zahrnuje několik programátorských nástrojů. Co se týká IDLE, nemíním zde zabíhat do hloubky. Chci vyzvednout jen dvě z jeho vlastností. Najdete v něm zdokonalenou verzi toho, čemu jsme říkali pythonovský příkazový řádek (>>>), s podporou zvýrazňování syntaxe (anglicky syntax highlighting [syntax hailaiting] — různé prvky jazyka zobrazuje různými barvami) a s dalšími šikovnými vlastnostmi. A naleznete zde také dobrý textový editor (specializovaný na pythonovské zdrojové texty), který vám zprostředkuje spouštění vašich programů přímo z IDLE.

Pokud jste tak již neučinili, pak vám vřele doporučuji, abyste si IDLE vyzkoušeli. Jakmile zjistíte, jak se ve vašem operačním systému IDLE spouští, pak za nejlepší považuji shlédnout vynikající příručku Dannyho Yoo (anglicky).

Na domovských stránkách systému Python naleznete pod heslem IDLE úplnou učebnici. (Je ale v angličtině a místy může být poněkud zastaralá. Odpovídá verzi IDLE 0.5, přičemž s instalací Python 2.3.4 byla k dispozici již verze IDLE 1.0.3.)

Pokud používáte MS Windows je tu ještě další možnost v podobě aplikace Pythonwin, kterou lze stáhnout samostatně nebo jako součást balíku pywin32. Tento balík vám zpřístupní všechny nízkoúrovňové funkce architektury MFC pro MS Windows (Microsoft Foundation Classes) a — což je důležité — představuje velmi dobrou alternativu k IDLE. PythonWin lze použít pouze pod MS Windows, ale podle mého názoru je o něco lepší, než IDLE. Na druhou stranu, IDLE je standardní součástí instalace systému Python, takže jej používá více lidí. Navíc funguje na většině platforem. Ať už je to jakkoliv, vždy je lepší mít možnost volby.

Pokud dáváte přednost jednoduššímu přístupu, můžete použít některý z textových editorů, které různým způsobem programování v Pythonu podporují. Editor vim podporuje zvýrazňování syntaxe (barevné zobrazování klíčových slov, atd.), editor emacs definuje pro Python plnohodnotný editační režim, malý editor SciTE podporuje zvýrazňování syntaxe a má další pěkné rysy. Poznámka překladatele: Za vyzkoušení určitě stojí i v Javě napsaný editor jEdit.

Pokud půjdete cestou používání textového editoru, pak pravděpodobně zjistíte, že nejšikovnější bude používat tři najednou otevřená okna:

  1. Editor, kde píšete zdrojový text a ukládáte jej do souboru,
  2. okno s interaktivně spuštěným Pythonem, ve kterém si na příkazovém řádku (>>>) zkoušíte věci, které poté přidáváte do zdrojového textu, a
  3. okno s příkazovým řádkem operačního systému, ve kterém spouštěním testujete vytvářený program.

Autor této učebnice dává přednost výše popsanému způsobu používání tří oken, ale zdá se, že většina začátečníků dává přednost stylu vše v jednom v podobě IDLE nebo Pythonwin. Výběr je pouze na vás.

Poznámka překladatele: Důvodem k používání přístupu se třemi okny bývá skutečnost, že pokročilejší uživatelé jsou již zvyklí na svůj oblíbený textový editor, ve kterém dokáží pracovat efektivněji, než v jiných editorech. Při jeho výběru se uplatňuje tolik vlivů, že prakticky o žádném editoru nelze tvrdit, že je nejlepší či horší. Je to jako s auty. Někdo má rád pohodlnější limuzíny s automatickou převodovkou a s posilovačem řízení, někomu vyhovují standardní přibližovadla s ne příliš výraznými rysy v žádném směru, někdo vyznává rychlé sportovní modely, ze kterých vymačká maximální akceleraci a výkon, i za cenu toho, že se mu od řadicí páky dělají mozoly.

Osobně jsem prošel používáním editorů vi/vim, emacs, JED (v režimu emacs) až k momentálně používanému jEdit. Kromě toho jsem používal několik editorů z integrovaných prostředí různých jazyků, pár editorů integrovaných do nástrojů typu Norton Commander a další malé editory typu Notepad a podobné. Ačkoliv bych se asi nechal přesvědčit k vyzkoušení nějakého nového editoru, nechtějte po mě, abych se vracel k vim. Nesedí mi, tak jako vi-kingům nebude sedět emacs nebo jEdit. Nepřemlouvejte mě. Já taky nebudu nikoho přemlouvat.

Pokud ve věci editoru dosud nemáte jasno, vyzkoušejte výše zmíněny SciTE. Zdá se, že má v režimu pro Python docela pěkné vlastnosti. Kromě toho se v kapitole o používání grafického uživatelského rozhraní zmíníme o balíku wxPython, který mimo jiné obsahuje modul stc. Nemám s nimi velké zkušenosti, ale jak SciTe, tak modul stc využívají stejnou editační komponentu, která se vyvíjí v rámci projektu Scintilla. To jinými slovy znamená, že do svých pythonovských programů můžete zakomponovat okno fungující podobně, jako jinak samostatná aplikace SciTE. Když si spustíte demo k wxPython, pak v pravém okně pod záložkou Demo Code uvidíte modul stc v akci.

Za zmínku stojí další nástroj, nazývaný PyCrust. Svého času se jednalo o samostatný projekt, který měl být ve vztahu k wxPython tím samým, čím je IDLE ve vztahu Tkinter. Z původně samostatného projektu se stala součást wxPython. V době psaní tohoto textu existoval ve verzi 0.9.4 a na první pohled se jevil velice slibně. Konečným cílem projektu je kvalitnější náhrada IDLE: Python shell, editor (využívající modul stc) a další nástroje, které usnadňují vývoj.

Pokud zkoušíte příklady v JavaScript nebo VBScript, doporučuji využít některý z výše zmíněných editorů a nějaký vhodný prohlížeč, dejme tomu Internet Explorer, ve kterém si soubor otevřete. Když budete chtít vyzkoušet v editoru provedené úpravy, jednoduše stiskněte tlačítko prohlížeče Aktualizovat (Reload). Poznámka překladatele: Nezapomeňte nejdříve soubor po úpravách v editoru uložit.

Krátce o komentářích

K jednomu z nejdůležitějších programátorských nástrojů patří jeden, který začátečníci často při prvním seznámení vnímají jako zbytečný — komentáře. Komentáře jsou prostě jen řádky v programu, které popisují, o co jde. Nemají žádný vliv na funkčnost programu, jsou v něm na ozdobu. Komentáře ovšem hrají velmi důležitou roli. Říkají programátorovi, o co v daném místě jde. A co je ještě důležitější, říkají proč to tak má být. Zvlášť důležité je to v případě, kdy programátor, který zdrojový text studuje, není tím, kdo jej napsal. Případně může jít o jeho dílo, ale od jeho vzniku už uplynula dlouhá doba. Význam dobrých komentářů po určitých programátorských zkušenostech jistě sami doceníte. Komentáře byly použity již u některých dříve uvedených úryvků kódu. Jsou to ony jinou barvou zvýrazněné části řádků, které začínají symbolem # pro Python nebo symbolem ' pro VBScript. Od tohoto okamžiku budu části programu komentovat pečlivěji. Množství okolního vysvětlujícího textu se bude postupně zmenšovat, protože vysvětlení budou uvedena právě v komentářích.

Každý jazyk definuje svůj způsob zápisu komentářů. V jazyce VBScript komentář začíná slovem REM (zkratka slova remark [rimák] = komentář) nebo, což je běžnější, apostrofem '. Ignoruje se vše, co se nachází za uvedenou značkou (do konce řádku):

REM print "Tento text se nikdy nevytiskne."
' Toto je také komentářový řádek.
print "Tento text se vytiskne."

Pokud jste někdy psali dávkové soubory v systému MS-DOS (ty s příponou .bat), může vám být slovo REM povědomé, protože v dávkových souborech se používá stejný způsob označování komentářů.

Všimněte si, že možnost používání apostrofu pro označení komentářů zabraňuje tomu, aby se apostrof mohl ve VBScript používat pro vymezování řetězců. VBScript si prostě myslí, že jde o komentář.

Python používá pro označení komenářů znak #. Následující znaky, až do konce řádku, se ignorují:

v = 12  # přiřaď do v hodnotu 12
x = v*v # x je v na druhou

Uvedený příklad shodou okolností používá velmi špatný styl komentování. Vaše poznámka by neměla jenom znovu popisovat význam (sémantiku) příkazu. To přece vidíme na první pohled ze zápisu samotného příkazu! Komentář by měl vysvětlovat proč se to dělá:

v = 3600   # 3600 je počet sekund za jednu hodinu
s = t*3600 # t obsahuje čas v hodinách, s v sekundách

Takové komentáře jsou mnohem prospěšnější.

JavaScript používá v roli komentářové značky dvojici lomítek //. A jako v předchozích případech, vše za touto značkou se ignoruje.

Některé jazyky umožnují používání víceřádkových komentářů, které jsou uzavřeny párem komentářových značek. Pokud ovšem není korektně vložena značka pro ukončení komentáře, může to vést k podivným chybám. V jazyce JavaScript víceřádkové komentáře používat lze. Zahajují se komentářovou značkou /*. Následuje text komentáře a vše je uzavřeno značkou */:

<script type="text/javascript">
document.write("Tohle se vytiskne.<br>");

// Toto je jednořádkový komentář

/* Toto je víceřádkový komentář. Pokračuje od tohoto řádku 
dále přes tento řádek a dokonce
na tento, třetí řádek. Neobjeví se na výstupu skriptu.
Komentář je ukončen zrcadlovým obrazem otevírací značky. */

document.write("Tento text se také vytiskne.");
</script>

Poznámka překladatele: Pokud používáme editor se zvýrazňováním syntaxe, pak bývají komentáře zobrazovány jinou barvou nebo jiným typem písma. V takovém případě se pravděpodobnost toho, že si nevšimneme neuzavřeného víceřádkového komentáře, výrazně snižuje.

Na komentářích je důležité především to, aby vysvětlovaly význam částí programu komukoliv, kdo se program snaží číst. Měli byste na to vždy pamatovat a vysvětlovat všechny záhadné úseky, jako je například používání nějakých na první pohled podivných hodnot, složitých matematických výrazů a podobně. A myslete na to, že oním zmateným čtenářem můžete být za pár týdnů nebo měsíců právě vy.

Posloupnosti příkazů používajících proměnné

V kapitole Data, datové typy a proměnné jsme se seznámili s proměnnými. Zmiňovali jsme se o nich jako o nálepkách, kterými si označujeme naše data, abychom se na ně mohli později odkazovat. V různých příkladech se seznamy a v příkladu kódu pro ukládání adres jsme mohli pozorovat příklady použití proměnných. Nicméně, proměnné mají při programování tak podstatnou důležitost, že před probíráním dalších věcí raději používání proměnných znovu shrneme.

Nyní použijte IDLE nebo příkazový řádek Pythonu spuštěného v okně MS-DOS nebo v terminálovém okně systému Unix. Napište následující příkazy:

>>> v = 7
>>> w = 18
>>> x = v + w # využíváme naše proměnné při výpočtu
>>> print x

V této ukázce jsme vytvořili proměnné (v, w a x) a manipulovali jsme s jejich obsahem. Podobá se to použití tlačítka M na vaší kalkulačce. Výsledek uložíme do paměti s cílem použít tuto hodnotu někdy později.

Tisk výsledku můžeme vylepšit použitím formátovacího řetězce:

>>> print "Soucet cisel %d a %d je: %d" % (v, w, x)

Jednou z výhod formátovacího řetězce je to, že jeho obsah můžeme také uložit do proměnné:

>>> s = "Soucet cisel %d a %d je: %d"
>>> print s % (v, w, x) # užitečné pro stejný výstup různých hodnot

Příkaz print se tím velmi zkrátí, a to především v případech, kdy pracujeme s mnoha hodnotami najednou. Na druhou stranu se tím příkaz více zatemní. Rozhodnutí, zda jsou velmi dlouhé řádky lépe nebo hůře čitelné (ve srovnání s variantou uložení formátovacího řetězce do proměnné), musíte učinit sami. Pokud formátovací řetězec najdete poblíž příkazu print, jako v našem případě, pak to není tak špatné. Můžeme si pomoci ještě jedním způsobem. Proměnné pojmenováváme takovým způsobem, aby vysvětlovaly účel svého použití. Místo jména s bych například mohl přidělit naší proměnné pro uložení formátovacího řetězce jméno formatProSoucet. Potom by příklad vypadal takto:

>>> formatProSoucet = "Soucet cisel %d a %d je: %d"
>>> print formatProSoucet % (v, w, x) # užitečné pro stejný výstup různých hodnot

Pokud pak v programu používáme několik různých formátovacích řetězců, můžeme snadněji předepsat, který z formátů se má při tisku použít. Používání výstižných názvů proměnných je užitečné za všech okolností. V dalších příkladech se toho budeme držet. Prozatím naše proměnné neměly zrovna význam, který by určoval, jak by se proměnná měla jmenovat.

Na pořadí záleží

V tomto okamžiku byste si mohli myslet, že postup konstruování posloupnosti příkazů je zřejmý a že mu věnujeme zbytečně velkou pozornost. V této chvíli můžete mít pravdu, protože v našem případě je poměrně jasné, o co jde. Ale ne vždy je to tak jednoduché, jak to vypadá. Můžeme narazit na skrytou léčku. Uvažujme případ, kdy chceme posunout úroveň všech nadpisů v HTML dokumentu o jeden stupeň výše.

V HTML vytváříme nadpisy tím, že jejich text obalíme značkami:

Problém spočívá v tom, že jakmile se dostanete na pátou úroveň nadpisů, text v nadpisu je často menší, než text odstavců — což vypadá divně. Takže se můžete například rozhodnout, že posunete všechny úrovně nadpisů o jednu nahoru (tj. směrem k menšímu číslu ve značce). Můžete to poměrně snadno provést v textovém editoru při využití funkce náhrady jednoho řetězce jiným: všechny řetězce <h2 nahradíte řetězcem <h1, řetězce </h2 nahradíte řetězcem </h1 a tak dále.

Ale uvažte, co se stane, když začnete nahrazovat značky s nejvyššími čísly — řekněme h4 značkou h3, potom h3 značkou h2 a nakonec h2 značkou h1. Všechny nadpisy by se posunuly na první úroveň! Takže pořadí provedení posloupnosti akcí je důležité. Totéž by platilo, pokud bychom napsali program, který by zmíněné náhrady řetězců prováděl za nás (což bychom docela dobře mohli chtít udělat, protože posunování úrovní nadpisů může být úkol, který potřebujeme řešit velmi často).

V kapitole Data, datové typy a proměnné bylo uvedeno několik dalších příkladů používajících proměnné a uvádějících různé posloupnosti příkazů — a to zejména na příkladech s adresami lidí. A proč byste si vlastně nemohli vymyslet pár vlastních příkladů? Jakmile s tím budete hotovi, budeme pokračovat směrem k případové studii. Budeme ji budovat postupně a vylepšovat ji vždy, když se při probírání dalších témat naučíme nějakou novou techniku.

Tabulka násobků

Nyní uvedu příklad, který budeme rozvíjet v průběhu několika následujících kapitol. Tak jak se budeme učit novým programovacím technikám, řešení příkladu se bude postupně vylepšovat

Vzpomínáte si, že můžeme psát dlouhé řetězce uzavřené v trojitých uvozovkách? Využijeme toho k vytvoření tabulky násobků:

>>> s = """
1 x 12 = %d
2 x 12 = %d
3 x 12 = %d
4 x 12 = %d
"""
>>> # Pozor - komentáře nemůžeme psát dovnitř
>>> # řetězce. Staly by se jeho součástí!
>>> print s % (12, 2*12, 3*12, 4*12)

1 x 12 = 12
2 x 12 = 24
3 x 12 = 36
4 x 12 = 48

>>> 

Poznámka překladatele: Uvedený tvar vstupu a výstupu můžete pozorovat, pokud použijete IDLE. Ve skutečnosti by byl zobrazený obsah okna o něco barevnější, protože IDLE zvýrazňuje význam různých částí zdrojového textu různými barvami. Pokud pro stejný příklad použijete interaktivní režim překladače Python (Python spuštěný v okně s příkazovým řádkem operačního systému), bude se vzhled lišit tím, že Python vypisuje vyzývací řetězec neukončeného příkazu ve tvaru '... '. Teprve za tímto řetězcem se zobrazuje text, který vkládáte z klávesnice.

Rozšířením tohoto příkladu bychom mohli dosáhnout vytištění celé tabulky násobků čísla 12 od 1 do 12. Ale neexistuje nějaký lepší způsob? Odpověď zní ano. Podívejme se, jak na to.

Zapamatujte si

Pokud vás napadne, co by se dalo na překladu této kapitoly vylepšit, zašlete e-mail odklepnutím Tím budou do dopisu automaticky vloženy informace o tomto HTML dokumentu.

$Id: cztutseq2.html,v 1.7 2004/09/06 06:04:27 prikryl Exp $