Doteraz sa každý program vykonal vždy rovnako – riadok po riadku. Skutočné programy sa však rozhodujú: ak je teplota pod nulou, upozornia na poľadovicu; ak je heslo správne, pustia ťa ďalej. Na rozhodovanie slúži príkaz if a jeho rozšírenia else a elif.
Čo sa naučíš
- zapísať podmienku
ifso správnym odsadením, - vybrať jednu z dvoch možností pomocou
if – else, - vybrať jednu z viacerých možností pomocou
elifa zvoliť správne poradie podmienok, - vnárať podmienky a skladať ich pomocou
and,or,not.
1Príkaz if
Výstup:
Teplota: -3 Pozor, mrzne! Obleč sa teplo. Pekný deň.
Ako príkaz if funguje:
- Za slovom
ifje podmienka – výraz, ktorý je pravdivý (True) alebo nepravdivý (False). - Na konci riadku je dvojbodka
:. - Pod ním nasleduje blok – riadky odsadené o 4 medzery. Vykonajú sa iba vtedy, keď podmienka platí.
- Prvý riadok, ktorý už nie je odsadený (
print("Pekný deň.")), do bloku nepatrí – vykoná sa vždy.
Pre teplotu 5 by sa vypísalo iba „Pekný deň.“
1.1Odsadenie
V Pythone určuje odsadenie (medzery na začiatku riadku), ktoré príkazy patria do bloku. Iné jazyky na to používajú zložené zátvorky, Python nie. Pravidlá:
- všetky riadky jedného bloku musia mať rovnaké odsadenie,
- zvykom sú 4 medzery (editor ich zvyčajne vloží klávesom Tab),
- v jednom programe nemiešaj medzery s tabulátormi.
Výstup (program skončí chybou):
File "program.py", line 3
print("Vstup povolený")
^^^^^
IndentationError: expected an indented block after 'if' statement on line 2Blok za dvojbodkou nesmie byť prázdny. Ak v ňom zatiaľ nič nechceš mať, napíš príkaz pass (nerobí nič).
2if – else
Vetva else („inak“) sa vykoná vtedy, keď podmienka neplatí. Vždy sa teda vykoná práve jedna z dvoch vetiev:
Výstup:
Zadaj číslo: 7 7 je nepárne
else nemá vlastnú podmienku a píše sa na rovnakej úrovni odsadenia ako if, ku ktorému patrí.
3elif: viac možností
Keď je možností viac, použijeme elif (skratka else if, „inak ak“). Python skúša podmienky zhora nadol a vykoná iba prvú vetvu, ktorej podmienka platí. Ostatné preskočí. Ak neplatí žiadna, vykoná sa else (ak je uvedené).
Príklad: známka podľa percent – aspoň 90 % je 1, aspoň 75 % je 2, aspoň 50 % je 3, aspoň 30 % je 4, inak 5.
Výstup:
Percentá: 68 Známka: 3
Pri 68 % podmienky >= 90 ani >= 75 neplatia, ale >= 50 áno – vypíše sa 3 a zvyšok sa preskočí. Vďaka tomu netreba písať percenta >= 50 and percenta < 75; horná hranica je zaručená tým, že predchádzajúce vetvy neplatili.
3.1Na poradí záleží
Ak by sme podmienky napísali v opačnom poradí, program by bol zlý:
Výstup:
Percentá: 95 Známka 4
Pre 95 % platí hneď prvá podmienka (95 >= 30), takže sa vypíše 4 a na >= 90 sa nikdy nedostane. Prísnejšie podmienky patria vyššie.
3.2elif verzus samostatné if
Niekoľko samostatných if sa vyhodnotí všetky – každý zvlášť. Reťaz if – elif – else vyberie najviac jednu vetvu. Porovnaj:
Výstup:
5
kladné
nulaPre 5 sa vypíše „kladné“ a hneď nato aj „nula“: else patrí iba k druhému if (n < 0 neplatí). Správne je druhé if nahradiť elif – potom tvoria všetky tri vetvy jeden celok.
4Zložené podmienky
Podmienky môžeš spájať logickými operátormi and, or, not (téma Operátory):
Výstup:
Vek: 16 Súhlas rodičov (ano/nie): ano Môžeš sa prihlásiť.
Užitočný je aj operátor in, ktorý zistí, či je hodnota medzi vymenovanými možnosťami alebo či je znak v texte:
Výstup:
Písmeno: a samohláska
5Vnorené podmienky
V bloku podmienky môže byť ďalšia podmienka – hovoríme o vnorení. Vnútorná podmienka sa vyhodnotí iba vtedy, keď platí vonkajšia:
Výstup:
Číslo: 12 kladné párne
Vnútorný blok je odsadený o ďalšie 4 medzery. Vnorenie sa často dá nahradiť podmienkou s and – vyber zápis, ktorý sa lepšie číta. Príliš hlboké vnorenie (viac ako 2–3 úrovne) je signál, že by program mal byť zapísaný jednoduchšie.
6Pravdivosť hodnôt
V podmienke nemusí byť iba porovnanie. Python vie posúdiť pravdivosť každej hodnoty: nepravdivé sú 0, 0.0, prázdny text "", prázdny zoznam [], None a False; všetko ostatné je pravdivé.
Výstup:
Meno:
Meno nebolo zadané.Zápis if meno: znamená „ak meno nie je prázdne“.
7Časté chyby
| Chyba | Ako sa prejaví | Oprava |
|---|---|---|
if x = 5: | SyntaxError | porovnanie je == |
| chýba dvojbodka | SyntaxError: expected ':' | if x > 5: |
| neodsadený blok | IndentationError | odsaď 4 medzerami |
dva samostatné if namiesto elif | vypíše sa viac vetiev | if – elif – else |
zlé poradie elif | prísnejšia vetva sa nikdy nevykoná | prísnejšie podmienky vyššie |
| porovnanie textu s číslom | podmienka nikdy neplatí | preveď vstup na int |
Posledný riadok tabuľky: input() vracia text, takže "18" == 18 je False a podmienka if vek == 18: by bez prevodu nikdy neplatila.
Pri porovnávaní textov pozor aj na veľké písmená: "Áno" == "áno" je False. Pomôže previesť vstup na malé písmená: odpoved.lower() == "áno".
8Riešené úlohy
8.1Najväčšie z troch čísel
Zadanie: Načítaj tri čísla a vypíš najväčšie z nich (bez funkcie max).
Riešenie: Predpokladáme, že najväčšie je prvé, a postupne ho porovnáme s ďalšími. Tento postup sa neskôr použije aj na hľadanie maxima v zozname.
Výstup:
7 19 4 Najväčšie: 19
Tu sú správne dva samostatné if: obe porovnania sa musia vykonať.
8.2Trojuholník
Zadanie: Načítaj dĺžky troch strán. Rozhodni, či z nich možno zostrojiť trojuholník, a ak áno, či je rovnostranný, rovnoramenný alebo rôznostranný.
Riešenie: Trojuholník existuje, ak je súčet každých dvoch strán väčší ako tretia strana (trojuholníková nerovnosť). Najprv skontrolujeme existenciu, až potom typ. Rovnostranný preveríme pred rovnoramenným, lebo rovnostranný trojuholník je zároveň aj rovnoramenný.
Výstup:
a: 5 b: 5 c: 8 rovnoramenný
8.3Kvadratická rovnica
Zadanie: Načítaj koeficienty a, b, c rovnice ax² + bx + c = 0 (a ≠ 0) a vypíš jej reálne korene.
Riešenie: Počet koreňov závisí od diskriminantu D = b² − 4ac: pre D > 0 sú dva korene, pre D = 0 jeden, pre D < 0 žiadny reálny koreň. Odmocninu vypočítame ako D ** 0.5.
Výstup:
a: 1 b: -5 c: 6 x1 = 3.0, x2 = 2.0
8.4Kameň, papier, nožnice
Zadanie: Načítaj svoju voľbu a voľbu počítača (kamen, papier, noznice) a vypíš výsledok. Kameň tupí nožnice, nožnice strihajú papier, papier zabalí kameň.
Riešenie: Najprv vyriešime remízu. Potom vymenujeme tri situácie, keď vyhráš ty; vo všetkých ostatných vyhrá počítač. V skutočnej hre by počítač volil náhodne (random.choice, téma Modulárny program).
Výstup:
Hráč: papier Počítač: kamen Vyhrávaš!
Dlhú podmienku sme rozdelili na viac riadkov znakom \ na konci riadku.
8.5Cena lístka
Zadanie: Lístok stojí 8 €. Deti do 6 rokov majú vstup zadarmo, deti do 15 rokov a ľudia od 62 rokov platia polovicu. Načítaj vek a vypíš cenu.
Výstup:
Vek: 64 Cena: 4 €
Zhrnutie
if podmienka:+ odsadený blok – blok sa vykoná, iba ak podmienka platí.else:– vykoná sa, keď podmienka neplatí; vždy sa vykoná práve jedna z vetiev.elif– ďalšia podmienka; vykoná sa iba prvá platná vetva, preto prísnejšie podmienky píš vyššie.- Samostatné
ifsa vyhodnocujú všetky, reťazif – elif – elsevyberie jednu vetvu. - Odsadenie (4 medzery) určuje blok; za
if,elif,elseje dvojbodka. 0,"",[],NoneaFalsesú v podmienke nepravdivé.
Úlohy na precvičenie
- Načítaj číslo a vypíš, či je kladné, záporné alebo nula.
- Načítaj rok a vypíš, či je priestupný – tentoraz pomocou vnorených podmienok.
- Načítaj body z písomky (0 – 50) a vypíš známku podľa stupnice 45, 38, 25, 16 bodov.
- Načítaj tri čísla a vypíš ich zoradené od najmenšieho.
- Načítaj hmotnosť a výšku, vypočítaj BMI a vypíš kategóriu: pod 18,5 podváha, do 25 norma, do 30 nadváha, inak obezita.