Lekce 17 - 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í, a 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 vidíme v ukázce, 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 čemuž 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 příkazu
break
Představme si, že máme seznam položek a chceme v nich nějakou najít.
Možná nás napadne, že můžeme použít metodu index()
, výraz
in
nebo magickou metodu __contains__()
. Půjde-li o
seznam, tak ano, ale některé kolekce tyto metody nemají nebo chceme hledat
pomocí nějaké vlastnosti, kterou tyto metody nezohledňují. Pak musíme
vyhledávání napsat ručně cyklem nebo použít výrazně pokročilejší
konstrukce, než nyní ovládáme.
Magickým metodám se podrobně věnujeme 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 štítky, 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. Avšak v téže chvíli cyklus pomocí break
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 s funkcemi
pracovat, měli bychom používání break
omezit. Správnější
variantou 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 pouze pro ukázku, co vše je možné potkat v cizích kódech, a není dobrý nápad 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-li
cyklus, který se opakuje donekonečna, bez nějaké řídicí 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 donekoneč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ě v případě, 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, jestliže
cyklus nebyl 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,
jestliže cyklus nebyl ukončen příkazem break
.
Uveďme si příklad. Představme si, že hledáme číslo v seznamu a chceme vypsat zprávu, jestliže se dané číslo v seznamu 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ě, jak jsme si to 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 použití else
.
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.