NOVINKA: Získej 40 hodin praktických dovedností s AI – ZDARMA ke každému akreditovanému kurzu!
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á:

Klikni pro editaci
  • for a in range(0,10):
        pass
    
    print("Hotovo")
    • Zkontroluj, zda výstupy programu odpovídají předloze. S jinými texty testy neprojdou.

    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:

    Klikni pro editaci
    • 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]}")
      • Zkontroluj, zda výstupy programu odpovídají předloze. S jinými texty testy neprojdou.

      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ě:

      Klikni pro editaci
      • 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}")
        • Zkontroluj, zda výstupy programu odpovídají předloze. S jinými texty testy neprojdou.

        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:

        Klikni pro editaci
        • x = 0
          while True:
              x += 1
              if x >= 50:
                  print(f"hodnota x je {x}")
                  break
          
          print("Program úspěšně skončil.")
          • Zkontroluj, zda výstupy programu odpovídají předloze. S jinými texty testy neprojdou.

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

          Klikni pro editaci
          • 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í.")
            • Zkontroluj, zda výstupy programu odpovídají předloze. S jinými texty testy neprojdou.

            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.


             

            Jak se ti líbí článek?
            Před uložením hodnocení, popiš prosím autorovi, co je špatněZnaků 0 z 50-500
            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í:
            699 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