15. diel - Podmienky tretíkrát - Ternárny výraz a prepadávací match

V predchádzajúcom cvičení, Riešené úlohy k 14. lekcii Pythonu, sme si precvičili získané skúsenosti z predchádzajúcich lekcií.

V dnešnom Python tutoriále si predstavíme dve ďalšie konštrukcie, ktoré súvisia s podmienkami. Konkrétne pôjde o ternárne výrazy a prepadávanie v konštrukcii match. Ide o oddychový tutoriál, ktorým túto tému dokončíme.

Ternárny operátor

Často sa nám stáva, že niekde potrebujeme nastaviť dve rôzne hodnoty podľa toho, či platí nejaká podmienka.

Príklad – Výpis pohlavia

Predstavme si, že máme napr. pohlavie užívateľa uložené ako bool (muž by bol True) a chceme ho previesť do textu. S doterajšími znalosťami by sme napísali asi takýto kód:

Klikni pre editáciu
  • man = True # variable determining gender
    gender_name = ""
    if man:
        gender_name = "man"
    else:
        gender_name = "woman"
    print(gender_name)
    • Skontroluj, či výstupy programu zodpovedajú predlohe. S inými textami testy neprejdú.

    Výstup programu je samozrejme nasledujúci:

    Conditional output:
    man

    Kód je pomerne rozsiahly na to, že iba prepína medzi dvoma hodnotami. Preto programovacie jazyky často podporujú tzv. ternárny výraz.

    Syntax ternárneho výrazu

    Pomocou tohto operátora môžeme získať hodnotu podľa platnosti logického výrazu. Zapíšeme ho takto:

    first_value if (expression) else second_value

    Zátvorka pre vyhodnocovaný výraz nie je nutná, je tu len pre prehľadnosť a lepšiu orientáciu. V praxi sa však takmer nepoužíva.

    Najprv začína first_value, určená pre prípad, že výraz je True. Nasleduje samotný výraz podmienky, ktorý je pre prehľadnosť umiestnený do nepovinnej zátvorky, a potom else pre prípad, že podmienka nadobúda hodnotu False. Ako ľahké! :) Názov výrazu je odvodený od toho, že má tri časti (prvú hodnotu, podmienku a druhú hodnotu), preto ternárne.

    Príklad – Výpis pohlavia pomocou ternárneho výrazu

    Poďme si ternárny operátor vyskúšať na príklade s pohlavím:

    Klikni pre editáciu
    • man = True # variable determining gender
      gender_name =  "man" if (man) else "woman"
      print(gender_name)
      • Skontroluj, či výstupy programu zodpovedajú predlohe. S inými textami testy neprejdú.

      Namiesto dátového typu bool samozrejme môžeme do zátvorky napísať akúkoľvek inú podmienku, napríklad "adult" if (age >= 18) else "child". V prípade jednoduchých výrazov môžeme zátvorku aj vynechať.

      Vnáranie ternárnych výrazov

      Ternárne operátory je možné teoreticky zanárať do seba a tým reagovať aj na tri a viac hodnôt. Zanáranie však vo väčšine prípadov kód skôr zneprehľadní. Vznikajú totiž dlhé alebo podivne zalomené riadky a nie je na prvý pohľad vidieť, ktorá časť sa kedy spustí. Ukážme si, ako by sa pomocou vnorovania ternárnych výrazov vyriešil výpis troch smajlíkov:

      Klikni pre editáciu
      • smiley = ":)"
        mood = "happy" if smiley == ":)" else "sad" if smiley == ":(" else "unknown"
        
        print(mood)
        • Skontroluj, či výstupy programu zodpovedajú predlohe. S inými textami testy neprejdú.

        Pre príklad vyššie by bolo oveľa lepšie vytvoriť vlastnú metódu, čo si ale ukážeme až v nadväzujúcom kurze Objektovo orientované programovanie v Pythone.

        Konštrukcia match s prepadávaním

        S konštrukciou match sme sa už stretli v lekcii Podmienky (vetvenia) druhýkrát – Konštrukcia match v Pythone. Dnes si ukážeme jej ďalšie použitie. Python vie v konštrukcii match využiť jeden zaujímavý variant, tzv. prepadávanie. Ak potrebujeme vo viacerých blokoch case vykonávať rovnaký kód, stačí ich hodnoty vložiť za seba, oddeliť ich zvislou čiarou | a neukončovať každý blok pomocou :. Celú skupinu tým vyriešime pomocou jediného bloku case.

        Príklad – Štvrťrok

        Predpokladajme, že chceme podľa mesiaca v roku zistiť, ktorý je štvrťrok. Pomocou blokov if a else by príklad vyzeral nasledovne:

        Klikni pre editáciu
        • month = 2
          
          if 1 <= month <= 3:
              print("It's the first quarter.")
          elif 4 <= month <= 6:
              print("It's the second quarter.")
          elif 7 <= month <= 9:
              print("It's the third quarter.")
          elif 10 <= month <= 12:
              print("It's the fourth quarter.")
          • Skontroluj, či výstupy programu zodpovedajú predlohe. S inými textami testy neprejdú.

          Zápis 1 <= month <= 3 zodpovedá použitiu and a je ekvivalentný k "tradičnému" zápisu podmienky month >= 1 and month <= 3. Je kratšia a prehľadnejšia. V Pythone sa často používa.

          Ako ale použiť konštrukciu match pre takýto príklad? Možno by nás napadol nasledujúci zápis:

          Klikni pre editáciu
          • month = 11
            
            match month:
                case 1:
                    print("It's the first quarter.")
                case 2:
                    print("It's the first quarter.")
                case 3:
                    print("It's the first quarter.")
                case 4:
                    print("It's the second quarter.")
                case 5:
                    print("It's the second quarter.")
                case 6:
                    print("It's the second quarter.")
                case 7:
                    print("It's the third quarter.")
                case 8:
                    print("It's the third quarter.")
                case 9:
                    print("It's the third quarter.")
                case 10:
                    print("It's the fourth quarter.")
                case 11:
                    print("It's the fourth quarter.")
                case 12:
                    print("It's the fourth quarter.")
            • Skontroluj, či výstupy programu zodpovedajú predlohe. S inými textami testy neprejdú.

            Príklad funguje spoľahlivo, problém však je, že sme si týmto zápisom veľmi nepomohli. Podobnému repetitívnemu kódu by sme sa vždy mali vyhýbať.

            Prepadávanie

            Skúsme to ešte raz a využime tzv. prepadávanie.

            V nasledujúcej ukážke použijeme znak |. Na slovenskej klávesnici píšeme znaky &| pomocou Pravého Alt a klávesov W a C:

            Operátory and a or - Základné konštrukcie jazyka Python

            Bloky s rovnakým výstupom sa zjednotia pomocou znaku |:

            Klikni pre editáciu
            • month = 11
              match (month):
                  case 1 | 2 | 3:
                      print("It's the first quarter.")
                  case 4 | 5 | 6:
                      print("It's the second quarter.")
                  case 7 | 8 | 9:
                      print("It's the third quarter.")
                  case 10 | 11 | 12:
                      print("It's the fourth quarter.")
              • Skontroluj, či výstupy programu zodpovedajú predlohe. S inými textami testy neprejdú.

              Je to oveľa lepšie ako vypisovať samostatný blok case pre každý z 12 mesiacov, však? Výstup programu potom bude vyzerať nasledovne:

              Using match with fallthrough:
              It's the fourth quarter.

              Tento zápis je už oveľa prehľadnejší. Konštrukcia match má však pridanú hodnotu v prípade, keď nemôžeme použiť väčší/menší a kedy ide o zoznam hodnôt.

              Prepadávanie používajte v konštrukcii match iba vtedy, ak máte k nemu dobrý dôvod. Je však dôležité, aby ste ho vedeli čítať, keď naň niekde narazíte.

              V budúcej lekcii, Cykly v Pythone druhýkrát - Výraz pass, break a continue, rozšírime naše znalosti cyklov o ďalšie konštrukcie a kľúčové slová pass, break a continue.


               

              Ako sa ti páči článok?
              Pred uložením hodnotenia, popíš prosím autorovi, čo je zleZnakov 0 z 50-500
              Predchádzajúci článok
              Riešené úlohy k 14. lekcii Pythonu
              Všetky články v sekcii
              Základné konštrukcie jazyka Python
              Preskočiť článok
              (neodporúčame)
              Cykly v Pythone druhýkrát - Výraz pass, break a continue
              Článok pre vás napísal Karel Zaoral
              Avatar
              Užívateľské hodnotenie:
              11 hlasov
              Karel Zaoral
              Aktivity