IT rekvalifikace s garancí práce. Seniorní programátoři vydělávají až 160 000 Kč/měsíc a rekvalifikace je prvním krokem. Zjisti, jak na to!
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 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.


 

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í:
341 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