Ačkoliv většina následujícího materiálu je už různě roztroušena po několika dalších přednáškách, chtěl jsem ho združit na jedno místo, aby se na něj za prvé snáze odkazovalo a za druhé aby byly (snad) lépe vidět souvislosti.
Podmíněný příkaz větvení je v Python'u celkem standardní:
Přitom:
elif
a else
nejsou povinné;
Narozdíl od mnoha jiných věcí bylo volání po podmíněném výrazu vyslyšeno a od Python'u 2.5 je k dispozici v následující podobě:
Pořadí zápisu je tedy mezi programovacími jazyky velmi nezvyklé (typicky bývá pomínka první, viz např. PODMÍNKA ? VÝRAZ1 : VÝRAZ2
), ale z hlediska Python'u nakonec zcela přirozené.
Python 3.10 s sebou přinesl obdobu klasických „switch/case“ konstrukcí z jiných programovacích jazyků:
Jako vždy je to ale všechno s pythoní omáčkou – jednotlivé větve totiž kromě dodatečných podmínek if a přiřazení zásahů pomocí as především umožňují klasické pythoní rozbalování pomocí n-tic a hvězdiček. Pro podrobnosti viz oficiální tutoriál.
Narozdíl od snad naprosté většiny programovacích jazyků se v Python'u cyklí průchodem po prvcích nějakého objektu, ve většině případů sekvence:
Navíc narozdíl od většiny ostatních jazyků je proměnná cyklu (zde i
) definována na stejné úrovni kódu jako sama smyčka, takže 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 poslední prvek procházené sekvence).
Přímou obdobou klasického for-cyklu je průchod po prvcích odpovídajícího rozsahu:
Naopak zcela neklasickou je varianta s větví 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.
Cyklus while je na první pohled obdobný jako všude jinde:
Od verze Python'u 3.8 pak už můžeme v rámci podmínky provést i přiřazení pomocí speciálního operátoru :=
(tzv. walrus), takže i iterace přes struktury, které nepodporují for-in, je už celkem „normální“.
==
za =
, nepřekvapivě – když nakonec BDFL (a polovina ostatních) povolil – byl pro tento a jiné specifické případy vybrán právě „mrož“.
Podobně jako u příkazu for-in i pro while existuje velmi neklasická varianta s větví else:
Větev s else
se provede pouze tehdy, je-li smyčka BLOKu 1 ukončena normálně na PODMÍNKu, a je vynechána při jejím násilném ukončení (příkazem break
).
Další z klasických řídicích konstrukcí, která se do Python'u nedostala – cyklus repeat. Nahrazuje se použitím následující konstrukce:
Jak už jsme viděli na předchozím slajdu, Python umožňuje cyklus předčasně ukončit. Slouží k tomu dva klasické příkazy:
Pro odchycení a zpracování „havarijních“ situací za běhu programu máme k dispozici výjimky:
K bloku try existuje několik dalších užitečných variant:
Kdybyste potřebovali výjimkou přeposlat dál, slouží k tomu příkaz raise
.
Kromě toho můžete minimálně pro lepší čitelnost (v neoptimalizovaném*) kódu použít příkaz assert
.
-o
) jsou totiž příkazy assert ignorovány.
Kromě výše uvedených nabízí výjimky ještě další možnosti, zde je použití větve else:
BLOK-3 bude proveden pouze tehdy, nevyvolal-li kód v BLOKu-1 výjimku (jinak tedy že byl přeskočen BLOK-2).
A zde použití větve finally:
Kód v BLOKu-3 bude proveden vždy, naprosto nezávisle na nastalých výjimkách a jejich odchycení.
A samozřejmě to jde všechno spojit dohromady, jak názorně ukazuje následující krásný příklad:
Python poskytuje velkou podporu pro definici a používání funkcí.
Novou funkci (v nejjednodušším možném tvaru) zavedeme pomocí klíčového slova def
takto:
Funkce (samozřejmě) mohou mít vstupní parametry a vracet nějaké objekty, jak ukazuje třebas následující příklad:
Přitom:
*
a **
působí občas jako magie.