NOVINKA - Online rekvalifikační kurz Python programátor. Oblíbená a studenty ověřená rekvalifikace - nyní i online.
Hledáme nové posily do ITnetwork týmu. Podívej se na volné pozice a přidej se do nejagilnější firmy na trhu - Více informací.

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.


 

Předchozí článek
Podmínky potřetí - Ternární výraz a propadávací match
Všechny články v sekci
Základní konstrukce jazyka Python
Přeskočit článek
(nedoporučujeme)
Funkce a výjimky v Pythonu
Článek pro vás napsal Vašek Doškář
Avatar
Uživatelské hodnocení:
636 hlasů
Autor pracuje jako pedagog v oblasti elektroniky, elektrotechniky a programování. Rád tvoří appky všeho druhu. Má přehled v jazycích C#, Java, Kotlin, Javascript, Python a Rust
Aktivity