Lekce 16 - Cykly v Pythonu podruhé - Výraz pass, break a continue
V minulé lekci, Podmínky potřetí - Ternární výraz a propadávací match, jsme se věnovali další syntaxi podmínek.
V dnešním Python tutoriálu si rozšíříme znalosti o cyklech. Podíváme
se na příkazy pass
, break
a continue
.
Tutoriál obsahuje méně používané praktiky a slouží hlavně k tomu, aby
vás nepřekvapily v cizím kódu. Zatím není příliš důležité, abyste je
sami uměli používat.
Příkaz pass
Příkaz pass
slouží k označení prázdných bloků
podmínek, cyklů, funkcí, dokonce i tříd. Používáme ho
převážně v případech, kdy potřebujeme tyto části kódu z nějakého
důvodu doplnit později. Vyzkoušejme si následující
kód:
for a in range(0,10): print("Hotovo")
Tento program nám dle očekávání hlásí chybu:
Chybová hláška:
File"C:\Users\itnetwork\PycharmProjects\cykly\main.py", line 3
print("Hotovo")
^
IndentationError: expected an indented block after 'for' statement on line 1
Přidejme tedy zmíněný příkaz pass
, který programu
oznámí, že cyklus jen projede, ale nic nevykoná:
for a in range(0,10):
pass
print("Hotovo")
Jak v ukázce vidíme, program sice proiteruje celý cyklus, ale ve výsledku se nic nestane
Příkazy break
a
continue
Běh cyklu je potřeba někdy přerušit, k tomu máme následující dvě klíčová slova.
Příkaz break
Příkaz break
ukončuje aktuální cyklus.
Používá se nejčastěji v situaci, kdy pomocí cyklu nalezneme nějakou
položku v kolekci a dále již v jejím procházení nechceme pokračovat.
Nebudeme tak dále zbytečně prohledávat zbytek kolekce, když již
máme to, co jsme hledali.
Příklad s využitím
break
Představme si, že máme seznam položek a chceme v nich nějakou najít.
Že můžeme použít metodu index()
, výraz in
nebo
magickou metodu __contains__()
? Pokud půjde o seznam, tak ano, ale
některé kolekce tyto metody nemají a/nebo chceme hledat pomocí nějaké
jiné vlastnosti, než kterou tyto metody zohledňují. Pak vyhledávání
musíme napsat ručně cyklem, nebo použít výrazně pokročilejší
konstrukce, než nyní ovládáme.
Magickým metodám se věnujeme podrobně v navazujícím kurzu Objektově orientovaného programování v Pythonu.
Řekněme, že máme velké a malé štítky na sklenice a chceme použít na všechny sklenice buď jedny nebo druhé. Zajímá nás tedy, zda se text všech popisek vejde na malé štítky. Napíšeme program, který zjistí, zda je v seznamu slovo delší, než šest znaků. Pokud ano, musíme použít větší štítky.
Začneme tedy cyklem procházet jednotlivá slova a jakmile najdeme slovo
delší než šest znaků, uložíme si jeho index. Zatím stále nic nového
pod sluncem. V tu samou chvíli ovšem pomocí break
cyklus
ukončíme:
seznam_ovoce = ["Jablka", "Hrušky", "Švestky", "Meruňky", "Jahody", "Třešně"]
hledany_index = -1
for ovoce in seznam_ovoce:
if len(ovoce) > 6:
hledany_index = seznam_ovoce.index(ovoce)
break
if hledany_index >= 0:
print(f"První slovo delší než šest znaků: {seznam_ovoce[hledany_index]}")
Výstup programu:
Přerušení cyklu pomocí příkazu break:
První slovo delší než šest znaků: Švestky
Příkaz break
se v praxi často nahrazuje
příkazem return
za předpokladu, že je kód v naší vlastní
funkci. Vlastní funkce se naučíme deklarovat v lekci Funkce a výjimky v
Pythonu. Jakmile se v dalším průběhu kurzu naučíme pracovat s
funkcemi, měli bychom používání break
omezit. Správnější
varianta je kód pro práci s kolekcí vyčlenit do samostatné funkce.
Příkaz continue
Příkaz continue
je podobný příkazu break
.
Používá se však k ukončení pouze aktuální iterace
(průběhu) cyklu a nikoli celého cyklu. Cyklus poté rovnou
přechází na další iteraci. Příkaz continue
často použijeme
např. při validování položek při procházení nějaké
kolekce.
Příklad s využitím
continue
Představme si, že máme od uživatele zadaná čísla a tato čísla chceme
sečíst. Uživatel nám čísla zadá jako jeden řetězec, kde každé číslo
je oddělené čárkou. Bohužel musíme počítat i s tím, že uživatel zadá
místo čísla nějaký nesmysl. Aby nám program nekončil chybou,
protože parsování slova na číslo se nepovede, budeme v
ukázce jednotlivé řetězce testovat metodou isdigit()
. Metoda
zjistí, zda je text ve skutečnosti číslo. Výhodou této konstrukce je, že
nám program nespadne s chybovým hlášením. Řešení vypadá
následovně:
cisla_retezec = "10,50,abcd,30,9"
cisla_seznam = cisla_retezec.split(',')
soucet = 0
for cislo in cisla_seznam:
if not cislo.isdigit():
continue
else:
cele_cislo = int(cislo)
soucet += cele_cislo
print(f"Součet je: {soucet}")
Výstup programu:
Použití metody isdigit() a příkazu continue:
Součet je: 99
Program sečte všechny správně zadané hodnoty, tedy ty, u kterých metoda
isdigit()
vrátila hodnotu True
. U nesprávně
zadaných hodnot je aktuální iterace ukončena. Místo continue
bychom samozřejmě mohli použít jen příkaz if
, kód bychom
tím ovšem zbytečně zanořili.
Nekonečný cyklus while
Následující konstrukce jsou zde pro ukázku, co vše je možné potkat v cizích kódech a není dobrý důvod je používat!
Připomeňme si cyklus while
a jeho základní použití:
a = 0 while a < 10: a += 1 print(a)
Kód provede dle očekávání deset iterací, přičemž v každé z nich
vytiskne aktuální číslo do konzole. Co když však chceme mít cyklus, u
kterého předem nebudeme znát daný počet opakování? Tedy potřebujeme
cyklus, který se opakuje do nekonečna, bez nějaké řídící proměnné nebo
podmínky. K těmto účelům můžeme využít tzv. nekonečný cyklus
while
. Jeho podoba je následující:
while True: # nekonečný cyklus
Jako podmínku jsme dali rovnou hodnotu True
, tedy jakousi
vyhodnocenou hodnotu logického výrazu, který je vždy pravdivý. Tím jsme
vytvořili konstrukci, kdy se cyklus provádí stále do nekonečna. Díky již
známému příkazu break
pak můžeme z cyklu vyskočit.
Pro pořádek si uveďme orientační příklad ukončení nekonečného
cyklu, jakmile hodnota proměnné stoupne nad hodnotu 50
:
x = 0
while True:
x += 1
if x >= 50:
print(f"hodnota x je {x}")
break
print("Program úspěšně skončil.")
Jakmile podmínka není přímo v deklaraci cyklu, je poměrně nepřehledné zjistit, kdy cyklus vůbec skončí. Potom je velmi snadné nechtěně udělat z takového cyklu nekonečný. To platí zvláště když z cyklu vyskakujeme více podmínkami a nepokryjeme všechny možné případy. Proto se nekonečným cyklům budeme spíše vyhýbat.
Příkaz else
v cyklech
for
a while
Již jsme se důkladně seznámili s tím, jak v Pythonu používat cykly
for
a while
k opakování určité činnosti. Ale co
když chceme provést nějakou činnost po dokončení cyklu, pokud
nebyl cyklus předčasně ukončen pomocí break
? Zde
přichází na řadu příkaz else
.
Příkaz else
se spustí po dokončení cyklu,
pokud nebyl předčasně ukončen příkazem break
.
Uveďme si příklad. Představme si, že hledáme číslo v seznamu a chceme vypsat zprávu, pokud se v seznamu dané číslo nenachází:
cisla = [1, 2, 3, 4, 5]
for cislo in cisla:
if cislo == 6:
print("Číslo 6 bylo nalezeno!")
break
else:
print("Číslo 6 v seznamu není.")
Protože číslo 6
v našem seznamu není, spustí se příkaz
else
a vypíše se zpráva "Číslo 6 v seznamu není." Pokud
bychom však číslo 6
v seznamu měli a cyklus by byl předčasně
ukončen příkazem break
, příkaz else
by se
nevykonal. Pro cyklus while
se else
používá
naprosto stejně, jako jsme si ukázali v příkladu s cyklem
for
.
Je důležité si uvědomit, že použití else
v
cyklech není vhodné pro všechny situace a měli bychom jej zvážit na
základě konkrétního kontextu. V mnoha případech může být kód
srozumitelnější bez něj.
To je pro dnešek vše
V příští lekci, Funkce a výjimky v Pythonu, se podíváme na vytváření vlastních funkcí a ošetření chyb v programu.