Bez dlouhého úvodu se podívejme rovnou na ukázku pythoního kódu:
Možná už teď oceníte, jak elegantně je algoritmus pro QuickSort napsán.
V principu je programy v jazyce Python možné spustit dvěma různými způsoby:
K oběma módům pár poznámek:
print()
pro vypsání hodnoty proměnné na obrazovku – poslední příkaz je vždy vyhodnocen a automaticky vypsán (prázdné návratové hodnoty jsou na výstupu potlačeny)
quit()
či exit()
, nebo vynucením ukončení pomocí ^Z
(Windows) či ^D
(Unix)
PS: Pro vývoj pythonovských programů je dnes samozřejmě možné používat prakticky libovolné vývojové prostředí (např. Eclipse) či různě chytrý editor (např. Emacs). My si však vystačíme s tím úplně nejzákladnějším – obyčejný textový editor se zvýrazňováním syntaxe (např. PSPad, gEdit) a příkazovou řádku (cmd, bash), případně nějaké jednodušší IDE (např. PyScripter, SPE) a pokročilejší „interpretr“ (DreamPie).
Narozdíl od většiny Karlů v Python'u proměnné jsou a hrají docela ústřední roli.
Obecně je proměnná místo v paměti, které udržuje uloženou informaci (spolu s jejím typem a dalšími informacemi, viz dále) a umožňuje dostat se k ní pod nějakým jménem. Programovací jazyk (nebo vlastně virtuální počítač, který ho implementuje) zároveň „ví“, jaké operace je s daným typem možné provádět a jaké jsou jejich priority při zpracování (vzpomeňte si na sčítání a násobení čísel!).
Práce s čísly je zcela základní výbavou programátora. Python podporuje několik různých druhů čísel a operací s nimi, se kterými se postupně seznámíme. Následující příklady ukazují práci s čísly celými a reálnými v interaktivním prostředí Python'u:
Přepišme příklady z předchozího slajdu do externího skriptu, který pak můžeme pustit:
32+42=52
.Po číslech asi druhým nejpřirozenějším a nejpoužívanějším datovým typem jsou řetězce aneb skupiny znaků:
Přepišme příklady z předchozího slajdu do externího skriptu, který pak můžeme pustit:
PYTHONIOENCODING
na hodnotu utf_8
, ale je to děs.)
Pro práci s proměnnými v Python'u je k dispozici několik dalších „triků“, které vás na první pohled možná zmatou. Proto si je ale ukážeme už nyní, aby vás nemátly zbytečně dlouho:
PS: Pokročilejší testy rovnosti a shodnosti objektů daných proměnných:
[1]
je typ „složitý“ – může se rozšiřovat, měnit své prvky apod. Jako takovému je každému seznamu přiřazeno v paměti vlastní místo a test a is b
proto selže.
Podobně jako v Karlovi se dá podmínka použít různými způsoby:
Ukažme si pár konkrétnějších příkladů:
in
, který testuje, zda se operand vlevo nachází jako prvek v objektu vpravo.
Narozdíl od Karla však můžeme podmínky skládat pomocí pravdivostních operátorů and
, or
a not
do větších celků:
Nejdůležitější je při tom pamatovat na priority operátorů:
Pár ukázek:
False and False or True
, který z logických operátorů and a or má vyšší prioritu.0 and '' or "Ahoj!"
. Co zjistíte?
Karlovský cyklus DOKUD
má v Python'u přímou obdobu jako cyklus while
:
Aby vůbec mohlo dojít k opuštění cyklu na test podmínky, musí se prvky vyskytující se v podmínce v těle cyklu nějak měnit. Následující ukázka vypíše všechna přirozená čísla menší než 5:
Poznámka: Jelikož proměnná i
je definována na stejné úrovni kódu jako sama smyčka, nepřekvapivě po skončení cyklu bude stále existovat a mít právě tu hodnotu, jíž během provádění cyklu dosáhla (zde tedy 5
).
Zadáním trvalé podmínky (zde True) fakticky vyrobíme nekonečný cyklus. Pomocí příkazu break
je však možno ho (předčasně :-) opustit:
Existuje ještě jeden příkaz, který ovlivňuje vykonávání cyklu – příkaz continue
. Ten způsobí, že aktuální kolo cyklu bude přeskočeno (od místa výskytu příkazu continue) a bude se pokračovat další iterací:
Velmi specifickým je použití větve else
:
Podobně jako u rozhodovacího příkazu if-else
se provede ten blok, který určí podmínka – BLOK 1 pro podmínku splněnou, BLOK 2 pro nesplněnou.
Nesplnění podmínky tedy způsobí vykonání větve else a následné opuštění smyčky. Pokud ovšem v BLOKu 1 nezavoláme break
, který ze smyčky úplně vyskočí (aniž by se aplikovala větev else).
Jinak stejně jako jinde si můžeme vynutit přeskočení zbytku kódu (v BLOKu 1) pomocí příkazu continue
, který ihned vrátí řízení zpět na testování podmínky.
Cyklus for-in
v Python'u je velmi specifický – narozdíl od většiny jiných jazyků totiž necyklíme po nějakém celočíselném intervalu, nýbrž po prvcích uspořádané „množiny“:
Poznámka: Jelikož proměnná i
je definována na stejné úrovni kódu jako sama smyčka, nepřekvapivě po skončení cyklu bude stále existovat a mít právě tu hodnotu, jíž během provádění cyklu dosáhla.
Například následující kód postupně projde všechna tři slova v seznamu a vytiskne je na výstup:
word
bude po proběhnutí cyklu uložena hodnota "python".
Podobně následující kód postupně projde všechna jednotlivá písmena v řetězci a vytiskne je na výstup:
znak
bude po proběhnutí cyklu uložena hodnota "!".
Přímým ekvivalentem číslem řízeného cyklu je pak použití funkce range()
, která vyrobí uspořádaný objekt čísel v daném rozsahu. Následující příklad provede BLOK
celkem desetkrát postupně s hodnotami proměnné i 0 až 9:
Ilustrujme to názorně na příkladu – vypišme čísla 0 až 3:
Nyní sečtěmež např. čísla 0 až 9:
Typicky cyklus proběhne všechny dostupné prvky sekvence. Konkrétní chování je však možné upravit pomocí následujících dvou příkazů:
break
– zcela opustí vykonávání příkazu cyklu a předá řízení za jeho konec
continue
– přeskočí zbylý kus kódu v aktuální smyčce a skočí rovnou na začátek další smyčky
Ilustrujme to na příkladu:
i % 2 == 0
tedy zbytek po dělení dvěma je nulový) způsobí ukončení aktuálního cyklu a přeskočení na další (continue
). Dále tedy pokračují pouze čísla lichá. Druhý elif však pro sedmičku způsobí předčasné ukončení vykonávání celého příkazu for-in, takže k závěrečnému elsu se dostanou pouze 1, 3 a 5.
Podobně jako u cyklu while
je u cyklu for-in
velmi specifickým použití větve else
:
Větev s else
se provede pouze tehdy, je-li cyklus ukončen normálně, tedy dojde-li k proiterování všech prvků vstupní sekvence. Naopak je-li cyklus v BLOKu 1 ukončen násilně pomocí break
, kód v BLOKu 2 nebude vůbec vykonán.
Příklad: Ukažme si sice neoptimalizovaný, ale velmi neklasický způsob výpočtu prvočísel menších než 100:
break
vnitřní smyčku, čímž přeskočíme větev else
. Pouze tehdy, když proběhne vnitřní smyčka celá (nenajdeme tedy žádného dělitele), se aplikuje větev else
a nalezené číslo (zjevně prvočíslo) se vypíše na výstup.
Funkce range()
je důležitá, podívejme se jí proto na zoubek trochu podrobněji:
Rozsah je „počáteční index zahrnut, koncový index nikoli“:
Též je možné tvořit rozsahy s „krokem“:
A to i záporným:
Vytvořte následující rozsahy:
V následujících příkladech použijte záporný krok:
Jak už jsme si říkali, představují funkce v Python'u obdobu příkazů v Karlovi. A stejně jako v Karlovi je můžeme rozdělit do dvou základních tříd:
KROK
, VLEVO VBOK
, POLOŽ
a ZVEDNI
)
Funkce obecně plní dvě činnosti:
print()
(většinou) tiskne své argumenty na obrazovku, quit()
ukončí běh interpretru, exit()
vyskočí z běžícího programu, input()
si vyžádá a načte od uživatele řetězcový vstup.
len()
vrací počet členů objektu, který jí byl předán jako parametr, tedy číslo.
Jiným velkým a na první pohled viditelným rozdílem oproti Karlovi je to, že funkcím v Python'u můžeme předávat parametry. Je dobrým zvykem, aby funkce při vykonávání své činnosti tyto parametry také využily ^_~
Narozdíl od Karla, kde máme k dispozici pouhé čtyři předpřipravené funkce – KROK
, VLEVO VBOK
, POLOŽ
a ZVEDNI
, Python (i další programovací jazyky) doslova překypují funkcemi vestavěnými.
PS: Že má Karel vestavěných funkcí málo, nás ovšem na druhou stranu úmyslně nutí výstavbu prostředí Karla (tedy sadu příkazů pro jeho ovládání) důkladně promyslet. Většina jazyků v průběhu času knihovnu vestavěných funkcí postupně rozšiřuje a s trochou štěstí se do nich snaží i zanést pořádek (o což se mimo jiné pokusil Python ve verzi 3).
První skupinou jsou funkce na globální úrovni (nebo také v nulovém jmenném prostoru; význam si vysvětlíme za chvíli). Je jich celá řada, pár si ukažme v ukázkách:
\r
), takže délka řetězce se bude tvářit jako 6. V dedikovaném vývojovém prostředí a v novějších verzích už to bude správně 5.
Upozornění: Všimněte si důležitého faktu – funkci zavoláme (tedy „přinutíme se vykonat“) tím, že za její jméno přidáme závorky ()
! Bez závorek je jméno funkce prostě jenom odkazem na objekt funkce:
Zdaleka nejvíce funkcí se však „schovává“ pod jménem modulu, v němž jsou definovány. V obecném případě se k nim pomocí jména tohoto modulu přistupuje, proto se také hovoří o tom, že tyto funkce patří do jistého jmenného prostoru (namespace).
Abychom mohli funkce z konkrétního jmenného prostoru používat, musíme nejdříve odpovídající modul načíst pomocí příkazu import
. Následuje příklad použití modulu pro matematické operace math a volání jeho vlastností a funkcí v příslušném jmenném prostoru pomocí tečkové notace:
Modulů je ve standardní (a natožpak nějaké nestandardní) instalaci Python'u k dispozici neuvěřitelné množství – zkuste si v interaktivním interpretru napsat help()
a poté modules
! Obsahují nejrůznější věci, včetně práce s časem a datem, grafického výstupu, jednoduchého webového serveru, rozhraní pro přístup k SQLite3-databázi a podobně. Některé z nich se časem naučíme používat.
Ať je vestavěných funkcí sebevíc, zcela výjimečně postačují pro řešení obecných problémů. V takovém případě si musíme napsat vlastní program, který určitě bude obsahovat mnoho funkcí uživatelských.
Novou (uživatelskou) funkci zavádíme pomocí klíčového slovíčka def
následujícím způsobem:
Odsazená část kódu v BLOKu se stejně jako v Karlovi skládá z volání funkcí, které v tuto chvíli již známe, plus proměnných a řídících konstrukcí jazyka.
V nejjednodušším případě slouží funkce pouze k vykonání nějaké činnosti. I v takovém případě však z důvodů konzistence něco vrací – speciální hodnotu None
(aneb „nic“). Ve většině případů ji však můžeme vesele ignorovat:
print(X)
nám pak ukáže, že funkce po návratu ze své činnost vrací hodnotu None.
Jak už jsme si říkali, většina funkcí však něco vrací. K tomu slouží klíčové slovo return
:
vrať()
dvakrát – jednou „jen tak“ samotnou na řádku, což nezpůsobí nic, protože funkce sama kromě návratu hodnoty nic dalšího nedělá, a jednou v přiřazovacím příkazu, kde nám print(x)
ukáže, že funkce vrátila číslo 16.
Nejčastější použití pak nachází funkce, které vrací objekt, který nějakým způsobem odpovídá vstupním parametrům funkce. Příklad pro výpočet druhé mocniny zadaného čísla:
Všimněte si tří věcí:
return
.
print()
– úspěšné zavolání funkce bude totiž efektivně nahrazeno návratovým objektem, který se v tomto případě dá přímo vytisknout.
Konečně funkce mohou mít parametrů více a mohou (zdánlivě) vracet více než jeden objekt:
*
.
Popravdě funkce v Python'u mohou mít dokonce proměnlivý počet vstupních i výstupních objektů, ale s tím se seznámíme až časem.
Klasicky pomocí rekurze:
def
zde tedy definujeme novou uživatelskou funkci faktoriál()
, kterou následně z jejího těla na základě vyhodnocení podmínky rekurzivně voláme. Pomocí vestavěné funkce print()
pak její vstupní parametr (zde tedy výsledek volání funkce faktoriál(9)
) tiskneme na obrazovku.
Úplně stejně jako v Karlovi tady podmínka zaručuje ukončení rekurzivních volání – faktoriál čísla 0 totiž známe (je to 1). Požadavek na výpočet faktoriálu z nuly je tudíž posledním z rekurzivních volání, od něj se vše začne vracet zpátky na začátek.
Méně přehledně, ale také podstatně méně náročně pomocí cyklu:
print()
zde tiskne přímo číslo, které je po vykonání výpočtu uloženo v proměnné out.
Cyklus while
zařídí, že odsazená část kódu se bude provádět tak dlouho, dokud bude podmínka splněna. Jelikož podmínkou je přímo číslo n, podmínka bude pravdivá tak dlouho, dokud bude n různé od nuly – číslo 0 je totiž v podmínce vyhodnoceno jako false
.
""
. Je však dobrým zvykem podmínku v takovém případě stejně vypsat v její úplnosti, tj. zde n > 0
.
Líně pomocí knihovní metody:
factorial()
ve jmenném prostoru math
je (nepřekvapivě :) lepší implementací, než naše dvě výše uvedené – dokáže totiž (v podobě výjimky) zareagovat na nesmyslný vstup v podobě záporného nebo necelého čísla. Časem se naučíme takto správně reagující kódy psát také.
Pravděpodobně nejpoužívanější funkce Python'u má syntaxi..
..kde..
sys.stdout.flush()
)
Příklad:
Spousta běžných skriptů si přebírá parametry pro svůj běh z příkazové řádky. To se časem také naučíme, ale začneme s něčím o trošku jednodušším – zadáváním vstupu do běžícího programu z klávesnice. K tomu slouží vestavěná funkce input()
:
Základní použití spočívá v pouhém zavolání funkce input()
:
Uvedený kód čeká na zadání vstupního řetězce ukončeného klávesou ↵
. Zadaný řetězec (bez odřádkování, to jen potvrdilo vstup) je předán jako návratová hodnota funkce (v našem případě tedy do proměnné answer).
raw_input()
.
Má-li vstupem být kupříkladu celé číslo, je třeba vrácený řetězec na něj nejdříve převést, tj. provést např. answer = int(answer)
. Podobné převodní funkce existují i pro další typy a časem se s nimi seznámíme. Obecně však vstup uživatele je zdaleka nejnebezpečnější místo programu, pokud ho náležitě neošetříte! To teď pro jednoduchost nebudeme dělat – důkladné ošetření vstupů se v programech velmi snadno stane jejich zdaleka nejdelší a nejsložitější částí...
Metoda input([PROMPT])
má jeden velmi užitečný nepovinný řetězcový parametr, tzv. výzvu (prompt):
PS: Chcete-li chování této uživatelské výzvy vylepšit, můžete před jejím použitím naimportovat modul readline
(dostupný pouze na platformě Unix!). Vstupní řádka pak „získá“ mimo jiné historii a větší možnosti editace (některé klávesové zkratky apod.).
Nejlepší je samozřejmě používat nějakou externí nápovědu nebo alespoň nápovědu, kterou nám poskytuje nějaké vývojové prostředí přímo při psaní kódu. Občas se nám však může stát, že jsme omezeni na příkazovou řádku (např. při vzdáleném přístupu na server), a pak budeme rádi, že Python má k dispozici nápovědu i v takovém případě.
Jádrem této pythonovské nápovědy je funkce help()
. Je pochopitelně zamýšlena pro použití v rámci interaktivní konzole a je možno ji použít třemi rozdílnými způsoby:
Zavolání funkce help() bez parametrů přepne interaktivní konzoli – se standardní výzvou >>>
– do módu nápovědy, který se hlásí vlastní výzvou help>
a reaguje na příkazy nápovědy:
V tomto módu se můžete přímo ptát na konkrétní prvky jazyka (zkuste napsat např. for), zabudované moduly (zkuste třeba math) a podobně. Zpět do interpretru se vrátíte příkazem quit
(bez závorek!).
Na vlastnosti konkrétního objektu se můžete zeptat přímo v interpretru pomocí volání help(OBJEKT)
:
Podobně zavoláním help('dotaz')
se vám dostane stejného výstupu, jako kdybyste v módu nápovědy (tedy s výzvou help>
napsali přímo dotaz
)
Časem zjistíte, že jednou z nejužitečnějších funkcí v nulovém jmenném prostoru (tedy pravděpodobně až na funkci print :-) je funkce dir(OBJEKT)
, která vrací seznam všech atributů (nevytvořených dynamicky) příslušného objektu:
Jelikož vlastně všechno v Python'u je svým vnitřním uspořádáním poměrně složitá struktura, ušetří nám dir() často zdlouhavé lovení v nápovědě (zvlášť pokud už Python docela umíme a jen si potřebujeme rychle něco připomenout) nebo nám napoví, kde jsme udělali chybu (to když prozkoumávaný objekt má zcela zjevně úplně jiné atributy, než jsme čekali, že mít bude).
Python má – mezi jinými :) – jednu zajímavou vlastnost:
Tak zvané dokumentační řetězce (docstrings) představují validní část kódu.
Tudíž následující program je zcela validní a funkční, přestože vlastně vůbec nic nedělá:
Mimochodem tyto dokumentační řetězce jsou dokonce i programově přístupné:
Díky tomu, že dokumentační řetězce představují pythonovský kód, můžeme je také použít všude tam, kde je nějaký kód očekáván, třeba jako blok kódu ve smyčce nebo kdekoliv jinde:
Podobnou funkci, pouze bez komentářů a „obsazení“ argumentu __doc__
, zastává příkaz pass
:
Použití nachází všude tam, kde je očekáván kód, ale buď nemá nic dělat nebo ho teprve časem dopíšeme.
Jelikož je Python dynamicky typovaný jazyk, nehrají typy proměnných zas až takovou roli jako v jazycích typovaných staticky. Na druhou stranu je Python velmi objektový, zvláště pokud ho tak chcete používat, a pak vám nástroje pro určení typu objektu velmi usnadňují život.
Zcela základním nástrojem je funkce type(OBJEKT)
, která pro zadaný objekt vrátí jeho typ:
Shrňme si to – Python je:
Dále též:
joined_lower
- funkce & metody & atributy,
ALL_CAPS
- konstanty,
StudlyCaps
- třídy
NameException
)
Plus jsme ještě pořádně neviděli v akci následující, velmi důležitou vlastnost:
"Ahoj, světe!".split()
Řada 2.x tu bude ještě dlouho (externí knihovny), řada 3.x je ale v mnoha ohledech „hezčí“ jazyk (i když její dosti překotný vývoj se zarazil snad až s verzí 3.2).