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

12. diel - Cykly v Pythone druhýkrát - Výraz pass, break a continue

V minulej lekcii, Najčastejšie chyby Python začiatočníkov, robíš je tiež? , sme si ukázali najčastejšie chyby začiatočníkov v Pythone, napr. Ohľadom pomenovanie kolekcií, bool výrazov a DRY.

V tomto tutoriále základov programovania v Pythone si rozšírime znalosti o cykloch. Vysvetlíme si nové kľúčové slová pass, break a continue.

Na úvod by bolo dobré podotknúť, že dnešná lekcia obsahuje menej používané praktiky a slúži hlavne na to, aby nás neprekvapili v cudzom kóde. Nie je príliš dôležité ich vedieť používať.

Výraz pass

Povedzme, že chceme urobiť prázdny blok else alebo cyklus. V Pythone existuje tzv. no-op (no operation) výraz, ktorý sa používa práve na označenie prázdneho bloku kódu. Sám nemá absolútne žiadnu funkcionalitu. Tento výraz sa nazýva pass, a slúži práve na označenie prázdnych blokov podmienok, cyklov, funkcií, dokonca aj tried. Používame ho prevažne v prípadoch, keď potrebujeme tieto časti kódu z nejakého dôvodu doplniť neskôr. Vyskúšajme si nasledujúci kód:

for a in range(0,10):

print("Hotovo")

Tento program nám podľa očakávania hlási chybu:

Chybová hláška:
    File"C:\Users\váš účet\PycharmProjects\pythonProject2\main.py", line 3
    print("Hotovo")
    ^
IndentationError: expected an indented block after 'for' statement on line 1

Pridajme teda spomínaný príkaz pass, ktorý programu oznámi, že cyklus len prejde, ale nič zmysluplné pre nás nevykoná:

for a in range(0,10):
    pass

print("Hotovo")

Ako v ukážke vidíme, program síce proiteruje celý cyklus, ale vo výsledku sa nič nestane :)

break a continue

Beh cyklu je potrebné niekedy prerušiť. K tomu nám Python poskytuje dve kľúčové slová, konkrétne break a continue.

break

Príkaz break ukončuje aktuálny cyklus. Používa sa najčastejšie v situácii, keď pomocou cyklu nájdeme nejakú položku v kolekcii a ďalej už v jej prechádzaní nechceme pokračovať. Nebudeme tak ďalej zbytočne prehľadávať zvyšok kolekcie, keď už máme to, čo sme hľadali.

Príklad

Predstavme si, že máme pole položiek a chceme v nich nejakú nájsť. Že môžeme použiť metódu Index() alebo __contains()__ ? Pokiaľ pôjde o zoznam, tak áno, ale niektoré kolekcie tieto metódy nemajú a/alebo chceme hľadať pomocou nejakej inej vlastnosti, než ktorú tieto metódy zohľadňujú. Potom si vyhľadávanie musíme napísať pekne ručne cyklom, alebo použiť výrazne pokročilejšie konštrukcie, než teraz ovládame.

Povedzme, že máme veľké a malé štítky na poháre a chceme použiť na všetky poháre buď jedny alebo druhé. Zaujíma nás teda, či sa text všetkých popisov zmestí na malé štítky. Napíšeme program, ktorý zistí, či je v poli slovo dlhšie ako šesť znakov. Pokiaľ áno, musíme použiť väčšie štítky.

Začneme teda cyklom prechádzať jednotlivé slová a akonáhle nájdeme slovo dlhšie ako šesť znakov, uložíme si jeho index. Zatiaľ stále nič nové pod slnkom. V tej istej chvíli však pomocou break cyklus ukončíme:

seznamOvoce = ["Jablká", "Hrušky", "Slivky", "Marhule", "Jahody", "Čerešne"]
hledanyIndex = -1

for ovoce in seznamOvoce:
    if len(ovoce)>6:
        hledanyIndex = seznamOvoce.index(ovoce)
        break

if hledanyIndex >= 0:
    print("Prvé slovo dlhšie ako 6 znakov: " + seznamOvoce[hledanyIndex])

Výstup v konzole:

Přerušení cyklu pomocí příkazu break:
Prvé slovo dlhšie ako 6 znakov: Švestky

Príkaz break sa v praxi často nahrádza príkazom return za predpokladu, že je kód v našej vlastnej funkcii. Vlastnú funkciu sa ale naučíme deklarovať až lekciu Funkcie a výnimky v Pythone.

Akonáhle sa v ďalšom priebehu kurzu naučíme pracovať s funkciami, mali by sme používanie break obmedziť. Správnejší variant je kód pre prácu s kolekciou vyčleniť do samostatnej funkcie.

continue

Príkaz continue je podobný nám už známemu príkazu break. Používa sa však na ukončenie iba aktuálnej iterácie (priebehu) cyklu a nie celého cyklu. Cyklus potom rovno prechádza na ďalšiu iteráciu. Príkaz continue často použijeme napr. pri validovaní položiek pri prechádzaní nejakej kolekcie.

Príklad

Predstavme si, že máme od užívateľa zadané čísla. Tieto čísla chceme sčítať. Užívateľ nám čísla zadá ako jeden reťazec, kde každé číslo je oddelené čiarkou. Bohužiaľ musíme počítať aj s tým, že používateľ zadá namiesto čísla nejaký nezmysel. Aby nám program nekončil chybou, pretože parsovanie slova na číslo sa nepodarí, budeme v ukážke jednotlivé reťazce testovať metódou isdigit(). Metóda porovnáva, či je text v skutočnosti číslo. Výhodou tejto konštrukcie je, že nám program nespadne s chybovým hlásením. Riešenie vyzerá nasledovne:

cislaRetezec = "10,50,abcd,30,9"
cislaPole = cislaRetezec.split(',')
soucet = 0

for cislo in cislaPole:
    if not cislo.isdigit():
        continue

    else:
        celeCislo = int(cislo)
        soucet += celeCislo

print(f"Súčet je:{soucet}")

Výstup v konzole:

Použití metody isdigit() a příkazu continue:
Súčet je: 99

Program spočíta všetky správne zadané hodnoty, teda tie, pri ktorých metóda isdigit() vrátila hodnotu True. Pri nesprávne zadaných hodnotách je aktuálna iterácia ukončená. Miesto continue by sme samozrejme mohli použiť len príkaz if, kód by sme tým však zbytočne zanorili.

Nekonečný cyklus while

Nasledujúce konštrukcie sú tu pre ukážku, čo všetko je možné stretnúť v cudzích kódoch a nie je dobrý dôvod ich používať!

Pripomeňme si cyklus while a jeho základné použitie:

a = 0
while a<10:
    a+=1
    print(a)

Kód vykoná podľa očakávania desať iterácií, pričom v každej z nich vytlačí aktuálne číslo do konzoly. Čo ak chceme mať cyklus, pri ktorom vopred nebudeme poznať daný počet opakovaní? Teda potrebujeme cyklus, ktorý sa opakuje do nekonečna, bez nejakej riadiacej premennej alebo podmienky. Na tieto účely môžeme využiť tzv. nekonečný cyklus while. Jeho podoba je nasledujúca:

while True:

 # nekonečný cyklus

Ako podmienku sme dali rovnú hodnotu True, teda akúsi vyhodnotenú hodnotu logického výrazu, ktorý je vždy pravdivý. Tým sme vytvorili konštrukciu, kedy sa cyklus vykonáva stále do nekonečna. Vďaka nám už známemu príkazu break potom môžeme z cyklu vyskočiť.

Pre poriadok si uveďme orientačný príklad ukončenia nekonečného cyklu, akonáhle hodnota premennej stúpne nad hodnotu 50:

x = 0
while True:
    x += 1
    if x >= 50:
        print(f"hodnota x je{x}")
        break

print("Program úspešne skončil")

Akonáhle podmienka nie je priamo v deklarácii cyklu, je pomerne neprehľadné zistiť kedy cyklus vôbec skončí. Je potom veľmi ľahké nechtiac urobiť z takého cyklu nekonečný. To platí obzvlášť, keď z cyklu vyskakujeme viacerými podmienkami a nepokryjeme všetky možné prípady. Preto sa nekonečným cyklom budeme skôr vyhýbať.

To je pre dnešok všetko. Kód je opäť k dispozícii na stiahnutie na konci lekcie.


 

Predchádzajúci článok
Najčastejšie chyby Python začiatočníkov, robíš je tiež?
Všetky články v sekcii
Základné konštrukcie jazyka Python
Článok pre vás napísal Vašek Doškář
Avatar
Užívateľské hodnotenie:
1 hlasov
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