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 16 - Podmínky potřetí - Ternární výraz a propadávací match

V předešlém cvičení, Řešené úlohy ke 15. lekci Pythonu, jsme si procvičili nabyté zkušenosti z předchozích lekcí.

V dnešním Python tutoriálu si představíme dvě další konstrukce, které souvisejí s podmínkami. Konkrétně půjde o ternární výrazy a propadávání v konstrukci match. Jedná se o oddechový tutoriál, kterým toto téma dokončíme.

Ternární operátor

Často se nám stává, že někde potřebujeme nastavit dvě různé hodnoty podle toho, zda platí nějaká podmínka.

Příklad – Výpis pohlaví

Představme si, že máme např. pohlaví uživatele uložené jako bool (muž by byl True) a chceme ho převést do textu. S dosavadními znalostmi bychom napsali asi takovýto kód:

Klikni pro editaci
  • muz = True # nějaká proměnná udávající pohlaví
    nazev_pohlavi = ""
    if muz:
        nazev_pohlavi = "muž"
    else:
        nazev_pohlavi = "žena"
    print(nazev_pohlavi)
    • Zkontroluj, zda výstupy programu odpovídají předloze. S jinými texty testy neprojdou.

    Výstup programu je samozřejmě následující:

    Výstup podmínky:
    muž

    Kód je poměrně rozsáhlý na to, že jen přepíná mezi dvěma hodnotami. Proto programovací jazyky často podporují tzv. ternární výraz.

    Syntaxe ternárního výrazu

    Pomocí tohoto operátoru můžeme získat hodnotu podle platnosti logického výrazu. Zapíšeme jej takto:

    prvni_hodnota if (vyraz) else druha_hodnota

    Závorka pro vyhodnocovaný výraz není nutná, je zde jen pro přehlednost a lepší orientaci. V praxi se však téměř nepoužívá.

    Nejprve začíná prvni_hodnota, určená pro případ, že výraz je True. Následuje samotný výraz podmínky, který je pro přehlednost umístěn do nepovinné závorky, a poté else pro případ, že podmínka nabývá hodnoty False. Jak snadné! :) Název výrazu je odvozený od toho, že má tři části (první hodnotu, podmínku a druhou hodnotu), proto ternární.

    Příklad – Výpis pohlaví pomocí ternárního výrazu

    Pojďme si ternární operátor vyzkoušet na příkladu s pohlavím:

    Klikni pro editaci
    • muz = True # nějaká proměnná udávající pohlaví
      nazev_pohlavi =  "muž" if (muz) else "žena"
      print(nazev_pohlavi)
      • Zkontroluj, zda výstupy programu odpovídají předloze. S jinými texty testy neprojdou.

      Místo datového typu bool samozřejmě můžeme do závorky napsat jakoukoli jinou podmínku, například "zletilý" if (vek >= 18) else "nezletilý". V případě jednoduchých výrazů můžeme závorku i vynechat.

      Vnořování ternárních výrazů

      Ternární operátory lze teoreticky zanořovat do sebe a tím reagovat i na tři a více hodnot. Zanořování však ve většině případů kód spíše znepřehlední. Vznikají totiž dlouhé nebo podivně zalomené řádky a není na první pohled vidět, která část se kdy spustí. Ukažme si, jak by se pomocí vnořování ternárních výrazů vyřešil výpis tří smajlíků:

      Klikni pro editaci
      • smajlik = ":)"
        nalada = "veselý" if smajlik == ":)" else "smutný" if smajlik == ":(" else "neznámý"
        
        print(nalada)
        • Zkontroluj, zda výstupy programu odpovídají předloze. S jinými texty testy neprojdou.

        Pro příklad výše by bylo mnohem lepší vytvořit vlastní metodu, což si ale ukážeme až v navazujícím kurzu Objektově orientované programování v Pythonu.

        Konstrukce match s propadáváním

        S konstrukcí match jsme se již setkali v lekci Podmínky (větvení) podruhé – Konstrukce match v Pythonu. Dnes si ukážeme její další použití. Python umí v konstrukci match využít jednu zajímavou variantu, tzv. propadávání. Pokud potřebujeme ve více blocích case provádět stejný kód, stačí jejich hodnoty vložit za sebe, oddělit je svislou čárou | a neukončovat každý blok pomocí :. Celou skupinu tím vyřešíme pomocí jediného bloku case.

        Příklad – Čtvrtletí

        Předpokládejme, že chceme podle měsíce v roce zjistit, které je čtvrtletí. Pomocí bloků if a else by příklad vypadal následovně:

        Klikni pro editaci
        • mesic = 2
          
          if 1 <= mesic <= 3:
              print("Je první čtvrtletí.")
          elif 4 <= mesic <= 6:
              print("Je druhé čtvrtletí.")
          elif 7 <= mesic <= 9:
              print("Je třetí čtvrtletí.")
          elif 10 <= mesic <= 12:
              print("Je čtvrté čtvrtletí.")
          • Zkontroluj, zda výstupy programu odpovídají předloze. S jinými texty testy neprojdou.

          Zápis 1 <= mesic <= 3 odpovídá použití and a je ekvivalentní k "tradičnímu" zápisu podmínky mesic >= 1 and mesic <= 3. Je kratší a přehlednější. V Pythonu se často používá.

          Jak ale použít konstrukci match pro takovýto příklad? Možná by nás napadl následující zápis:

          Klikni pro editaci
          • mesic = 11
            
            match mesic:
                case 1:
                    print("Je první čtvrtletí.")
                case 2:
                    print("Je první čtvrtletí.")
                case 3:
                    print("Je první čtvrtletí.")
                case 4:
                    print("Je druhé čtvrtletí.")
                case 5:
                    print("Je druhé čtvrtletí.")
                case 6:
                    print("Je druhé čtvrtletí.")
                case 7:
                    print("Je třetí čtvrtletí.")
                case 8:
                    print("Je třetí čtvrtletí.")
                case 9:
                    print("Je třetí čtvrtletí.")
                case 10:
                    print("Je čtvrté čtvrtletí.")
                case 11:
                    print("Je čtvrté čtvrtletí.")
                case 12:
                    print("Je čtvrté čtvrtletí.")
            • Zkontroluj, zda výstupy programu odpovídají předloze. S jinými texty testy neprojdou.

            Příklad funguje spolehlivě, problém však je, že jsme si tímto zápisem moc nepomohli. Podobnému repetitivnímu kódu bychom se vždy měli vyhýbat.

            Propadávání

            Zkusme to ještě jednou a využijme tzv. propadávání.

            V následující ukázce použijeme znak |. Na české klávesnici ho napíšeme pomocí pravý ALT a písmene W:

            AND a OR - Základní konstrukce jazyka Python

            Bloky se stejným výstupem se sjednotí pomocí znaku |:

            Klikni pro editaci
            • mesic = 11
              match (mesic):
                  case 1 | 2 | 3:
                      print("Je první čtvrtletí.")
                  case 4 | 5 | 6:
                      print("Je druhé čtvrtletí.")
                  case 7 | 8 | 9:
                      print("Je třetí čtvrtletí.")
                  case 10 | 11 | 12:
                      print("Je čtvrté čtvrtletí.")
              • Zkontroluj, zda výstupy programu odpovídají předloze. S jinými texty testy neprojdou.

              Je to mnohem lepší než vypisovat samostatný blok case pro každý z 12 měsíců, že? Výstup programu pak bude vypadat následovně:

              Použití match s propadáváním:
              Je čtvrté čtvrtletí.

              Tento zápis je již mnohem přehlednější. Konstrukce match má ovšem přidanou hodnotu v případě, kdy nemůžeme použít větší/menší a kdy jde o výčet hodnot. Zde je to spíše redundantní kód plný prázdných case.

              Propadávání používejte v konstrukci match jenom tehdy, máte-li k němu dobrý důvod. Je však důležité, abyste jej uměli číst, když na něj někde narazíte.

              V příští lekci, Cykly v Pythonu podruhé - Výraz pass, break a continue, rozšíříme naše znalosti cyklů o další konstrukce a klíčová slova pass, break a continue.


               

              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
              Řešené úlohy ke 15. lekci Pythonu
              Všechny články v sekci
              Základní konstrukce jazyka Python
              Přeskočit článek
              (nedoporučujeme)
              Cykly v Pythonu podruhé - Výraz pass, break a continue
              Článek pro vás napsal Karel Zaoral
              Avatar
              Uživatelské hodnocení:
              514 hlasů
              Karel Zaoral
              Aktivity