Lekcie
Podmienky II. - vetvenie a komplexná logika
Život je zložitý a programy bývajú ešte zložitejšie. Naučíš sa riešiť situácie s viacerými možnosťami a spájať podmienky do logických celkov.
Vetvenie podmienok
V minulej lekcii sme tvorili zložitejšie podmienky pomocou vnorených podmienok. Tento spôsob je zbytočne pracný. Nižšie je príklad takéhoto programu, ktorý neskôr zlepšíme pomocou využitia elif.
if dlzka_videa < 10:
print("Video musí mať aspoň 10 sekúnd.")
else:
if dlzka_videa > 300:
print("Video nesmie byť dlhšie ako 300 sekúnd.")
else:
print("Video môže byť nahrané.")
V tomto príklade na základe hypotetickej dĺžky videa sa používateľovi vypíšu rôzne správy. Ako si ale môžeš všimnúť, takáto jednoduchšia podmienka zbytočne zaberá 7 riadkov kódu. Celý blok prvého else, vieme zapísať jednoduchšie pomocou elif. elif je príkaz, ktorý sa spustí, ak podmienka nad ním nie je splnená (resp. nie je pravdivá). Taktiež jeho názov je skratkou pre "else if". Vidíš takéto niečo v našom kóde? (Je to na riadku 3 a 4.)
elif v našom príklade. Ako môžeš vidieť, logika programu sa vôbec nezmenila, ale napísali sme menej riadkov a takto vieme tvoriť zložité podmienky jednoduchšie. Aj keď sa ušetrenie jedného riadku zdá byť minimálne, v pokročilejších programoch je tento rozdiel väčší.
if dlzka_videa < 10:
print("Video musí mať aspoň 10 sekúnd.")
elif dlzka_videa > 300:
print("Video nesmie byť dlhšie ako 300 sekúnd.")
else:
print("Video môže byť nahrané.")
# Kontrolujeme, či dlzka_videa je menej ako 10.
if dlzka_videa < 10:
print("Video musí mať aspoň 10 sekúnd.")
# Ak dlzka_videa je viac ako 10 (teda neplatí podmienka vyššie),
# tak skontrolujeme, či dlzka_videa je viac ako 300,
# ak áno, vykoná sa kód v tomto bloku.
elif dlzka_videa > 300:
print("Video nesmie byť dlhšie ako 300 sekúnd.")
# Ak dlzka_videa nie je viac ako 300 (a tým pádom ani menej ako 10), tak
# sa spustí else blok.
else:
print("Video môže byť nahrané.")
Logické operátory
Čo ak chceme skontrolovať viac podmienok naraz? Na to slúžia
logické operátory, vďaka ktorým vieme spájať a kombinovať naše podmienky. V Pythone poznáme tri: and,
or a not.
| Operátor | Význam | Príklad |
|---|---|---|
and |
Obe podmienky musia byť pravdivé. | if vek >= 18 and vek <= 65: |
or |
Aspoň jedna podmienka musí byť pravdivá. | if den == "sobota" or den == "nedeľa": |
not |
Neguje ("otočí") logickú hodnotu. | if not je_prihlaseny: |
Operátor and
Operátor and zabezpečí, že
sa kód vykoná iba vtedy, ak sú splnené obe podmienky zároveň. Napríklad,
ak chceme skontrolovať, či je používateľ plnoletý a zároveň nie starší ako 65
rokov (teda v produktívnom veku):
vek = int(input("Zadaj vek: "))
if vek >= 18 and vek <= 65:
print("Si v produktívnom veku.")
else:
print("Nie si v produktívnom veku.")
Operátor or
Operátor or sa spustí vtedy,
ak aspoň jedna z podmienok je pravdivá. Napríklad, ak chceme
skontrolovať, či je dnes víkend:
den = input("Zadaj deň v týždni: ")
if den == "sobota" or den == "nedeľa":
print("Je víkend! Hurá!")
else:
print("Je pracovný deň.")
Operátor not
Operátor not neguje logickú hodnotu. Teda ak je niečo True,
tak not z toho spraví False a naopak. Hodí sa vtedy, keď je prirodzenejšie
vyjadriť podmienku negáciou.
je_prihlaseny = False
if not je_prihlaseny:
print("Prosím, prihláste sa.")
else:
print("Vitajte!")
Toto je rovnaké, ako keby sme napísali if je_prihlaseny == False, ale not je prehľadnejšie a kratšie.
Reťazové porovnanie
Python ti dovoľuje zapísať podmienky s rozsahom čísel prehľadnejšie, ako si zvyknutý z matematiky - pomocou reťazového porovnania. Namiesto dvoch podmienok spojených pomocou and vieš zapísať obe naraz:
# Klasický spôsob (s and)
if vek >= 18 and vek <= 65:
print("Si v produktívnom veku.")
# Reťazové porovnanie - rovnaký výsledok, kratší zápis
if 18 <= vek <= 65:
print("Si v produktívnom veku.")
Oba zápisy sú správne a fungujú rovnako. Reťazové porovnanie je viac čitateľné a bližšie k matematickému zápisu. Môžeš používať ktorýkoľvek štýl chceš, je to na tebe.
Kombinovanie logických operátorov
Logické operátory môžeš kombinovať dohromady a tvoriť tak komplexné podmienky. Ak kombinuješ viac operátorov naraz, odporúčame používať zátvorky, aby bolo zreteľné, ktoré podmienky patria k sebe.
V tomto kóde používateľ musí zadať dva údaje, jeho vek a či je študentom. Kontrolujeme, či jeho vek je v rozsahu 15 až 26 a či zadal, že je študentom. Následne podľa týchto údajov vypíšeme, či má nárok na študentskú zľavu alebo nie.
vek = int(input("Zadaj vek: "))
je_student = input("Si študent? (ano/nie): ")
if (vek >= 15 and vek <= 26) and je_student == "ano":
print("Máš nárok na študentskú zľavu!")
else:
print("Na študentskú zľavu nemáš nárok.")
Zopakuj si!
- Pomocou
elifvieš pridať ďalšie vetvy rozhodovania bez zbytočných vnorených podmienok. - Logické spojky
and,oranotti umožňujú spájať viaceré podmienky do jednej. - Reťazové porovnanie (napr.
18 <= vek <= 65) je skratka za dve podmienky spojené sand.
elif a logickými operátormi.
Vytvor premennú body, ktorá bude načítaná zo vstupu od používateľa. Vstup bude vždy číslo od 0 do 100, pretypuj ho na int.Na základe počtu bodov vypíš "Známka: X", kde namiesto X vypíš jednu z týchto známok podľa počtu bodov:
0 až 35: 5
36 až 54: 4
55 až 69: 3
70 až 89: 2
90 až 100: 1
Napríklad, ak počet bodov bude 72, do konzoly bude vypísaný text "Známka: 2".
elif v Pythone?
if a else
elif môže mať jeden if blok?
elif vetiev v jednom rozhodovacom bloku. Môžeš ich použiť toľko, koľko potrebuješ.
or
and
not
x = 10
if x > 5:
print("A")
elif x > 8:
print("B")
x > 5 je splnená. Keď sa splní if, ostatné vetvy (elif alebo else) sa už nekontrolujú. Preto sa elif x > 8 vôbec nevyhodnotí, aj keď by bola tiež pravdivá.
if?
x > 5
x == 10
x + 5
x < 3 and x > 1
cislo > 3 and < 5
x > 5, x == 10 a x < 3 and x > 1, pretože ide o logické výrazy, ktoré majú hodnotu True alebo False. Podmienka if potrebuje práve takýto výsledok. Výraz x + 5 nie je logická podmienka, je to len matematický výpočet, ktorý nevracia priamo logickú hodnotu. cislo > 3 and < 5 by vyhodil chybu, keďže používa nesprávny syntax (zápis).
or?
10 < x < 20
10 < x and < 20
x > 10 > 20
x < (10 < 20)
x = 5
if x > 3 and x < 10:
print("OK")
else:
print("Not ok")
1 < x < 10
x > 1 and x < 10
x < 1 and x > 10
1 < x < 10, x > 1 and x < 10, pretože obidva vyjadrujú, že x je väčšie ako 1 a menšie ako 10. Python umožňuje aj reťazové porovnanie 1 < x < 10. Výraz x < 1 and x > 10 je nesprávny, pretože číslo nemôže byť zároveň menšie ako 1 a väčšie ako 10.
x = 12
if x < 10:
print("A")
elif x < 20:
print("B")
else:
print("C")
x < 10 je nepravdivá. Python preto skontroluje ďalšiu vetvu elif x < 20, ktorá je pravdivá. Vetva else sa vykoná iba vtedy, keď žiadna predchádzajúca podmienka neplatí.