Geek tričko zdarma Python týden
Tričko zdarma! Stačí před dobitím bodů použít kód TRIKO15. Více informací zde
Pouze tento sleva až 80% na kurzy Python

Lekce 3 - Booleovské hodnoty, logické operátory a větvení v Pythonu

Unicorn College Tento obsah je dostupný zdarma v rámci projektu IT lidem.
Vydávání, hosting a aktualizace umožňují jeho sponzoři.

V minulé lekci, Proměnné, základní datové typy a funkce, jsme si ukázali základní datové typy, práci se vstupem a výstupem v konzoli. Dnes se v Python tutoriálu podíváme na další datový typ - booleovské hodnoty, dále na větvení pomocí if, elif a else, porovnávací a logické operátory.

Booleovské hodnoty

Booleovské hodnoty jsou pouze dvě - True a False (PRAVDA a NEPRAVDA). Celé si to lze představit jako žárovku. Buď žárovka svítí, nebo nesvítí. Jiná možnost není :) Pomocí těchto dvou hodnot se obvykle řídí tok programu. Pokud je tento výraz pravda udělej toto, jinak udělej něco jiného. V Pythonu se jako pravdivý výraz vyhodnotí nenulové číslo, neprázdný řetězec (nebo jiný neprázdný datový typ). Booleovskou hodnotu daného typu zjistíme funkcí bool().

Nyní si zkusíme pár příkladů. Do pythonovské konzole zkuste například zadat:

>>> bool(1)
True
>>> bool(3.14)
True
>>> bool("Ahoj!")
True
>>> bool(0)
False
>>> bool("")
False

Porovnávací operátory

Porovnávací operátory můžete vidět v tabulce dole:

Operátor C-like Zápis
Rovnost ==
Je ostře větší >
Je ostře menší <
Je větší nebo rovno >=
Je menší nebo rovno <=
Nerovnost !=

Znovu můžete vyzkoušet pár příkladů:

>>> 1 == 1
True
>>> 3 > 2
True
>>> 3 < 2
False
>>> 5 >= 4
True
>>> 5 <= 4
False
>>> 6 >= 6
True
>>> 1 != 2
True

V Pythonu se negace booleovské hodnoty provádí operátorem not. Python má také porovnávací operátory is, is not, in a not in.

Is

Operátor is můžete použít na porovnávání dvou čísel, objektu představující celé číslo a čísla, ale neporovnávejte tímto operátorem dva objekty. Python totiž porovná jestli obě proměnné odkazují na stejný objekt a ačkoliv mohou mít proměnné stejnou hodnotu, tak nemusí odkazovat na stejný objekt. Jen pro zájemce - ID objektu (jeho identifikační číslo) se dá zjistit pomocí funkce id(). Operátor is not vrací opačnou hodnotu, než operátor is.

In

Operátor in zjišťuje, zda-li je řetězec obsažený v jiném řetězci (lze použít i jinými datovými typy - ukážeme si později). Not in dělá pravý opak.

Příklady

>>> "a" in "abeceda"
True
>>> "b" in "python"
False
>>> "a" not in "python"
True
>>> "b" not in "abeceda"
False

Syntaxe

V Pythonu je důležité konzistentní odsazování - oficiální směrnice doporučují velikost zhruba čtyř mezer. Za výrazy určující tok programu se v Pythonu píše dvojtečka. Blok příkazů je určen odsazením.

Podmínky

V Pythonu se podmínky píší podobně, jako v CLike jazycích, jediný rozdíl je ve výrazu elif (např. C# má else if). Pro začátečníky samozřejmě vysvětlím. Pokročilejší se asi budou chvilku nudit :)

Podmínky zapisujeme pomocí klíčového slova if, za kterým následuje logický výraz. Pokud je výraz pravdivý, provede se následující příkaz. Pokud ne, následující příkaz se přeskočí a pokračuje se až pod ním. Vyzkoušejme si to:

#!/usr/bin/env python3

if 15 > 5:
    print("Pravda")
print("Program zde pokračuje dál")
input()

Výstup programu:

Konzolová aplikace
Pravda
Program zde pokračuje dál

V Pythonu můžete (ale nemusíte) ve výrazu použít závorky.

Od teď již nebudu psát první řádek!

Pokud podmínka platí (což zde ano), provede se příkaz vypisující do konzole text pravda. V obou případech program pokračuje dál. Součástí výrazu samozřejmě může být i proměnná:

cislo = int(input("Zadej nějaké číslo"))
if (cislo > 5):
    print("Zadal jsi číslo větší než 5!")
print("Děkuji za zadání")
input()

Rovnost zapisujeme dvěma == proto, aby se to nepletlo s běžným přiřazením do proměnné, které se dělá jen jedním =. Pokud chceme nějaký výraz znegovat, napíšeme ho do závorky a před něj operátor not. Když budeme chtít vykonat více než jen jeden příkaz, musíme blok příkazů odsadit.

cislo = int(input("Zadej nějaké číslo, ze kterého spočítám odmocninu: "))
if (cislo > 0):
    print("Zadal jsi číslo větší než 0, to znamená, že ho mohu odmocnit!")
    odmocnina = cislo ** (1/2)
    print("Odmocnina z čísla", cislo, "je", odmocnina)
print("Děkuji za zadání")
input()

Takto program vypadá:

Konzolová aplikace
Zadej nějaké číslo, ze kterého spočítám odmocninu:
144
Zadal jsi číslo větší než 0, to znamená, že ho mohu odmocnit!
Odmocnina z čísla 144 je 12.0
Děkuji za zadání

Program načte od uživatele číslo a pokud je větší než 0, vypočítá z něj druhou odmocninu. Odmocninu z čísla vypočítáme tak, že číslo umocníme na zlomek dané odmocniny (v tomto případě 2) :) Bylo by hezké, kdyby nám program vyhuboval v případě, že zadáme záporné číslo. S dosavadními znalostmi bychom napsali něco jako:

cislo = int(input("Zadej nějaké číslo, ze kterého spočítám odmocninu: "))
if (cislo > 0):
    print("Zadal jsi číslo větší než 0, to znamená, že ho mohu odmocnit!")
    odmocnina = cislo ** (1/2)
    print("Odmocnina z čísla", cislo, "je", odmocnina)
if (cislo <= 0):
    print("Odmocnina ze záporného čísla neexistuje!")
print("Děkuji za zadání")
input()

Všimněte si, že musíme pokrýt i případ, kdy se a == 0, nejen když je menší. Kód však můžeme výrazně zjednodušit pomocí klíčového slova else, které vykoná následující příkaz nebo blok příkazů v případě, že se podmínka neprovede:

cislo = int(input("Zadej nějaké číslo, ze kterého spočítám odmocninu: "))
if (cislo > 0):
    print("Zadal jsi číslo větší než 0, to znamená, že ho mohu odmocnit!")
    odmocnina = cislo ** (1/2)
    print("Odmocnina z čísla", cislo, "je", odmocnina)
else:
    print("Odmocnina ze záporného čísla neexistuje!")
print("Děkuji za zadání")
input()

Kód je mnohem přehlednější a nemusíme vymýšlet opačnou podmínku, což by v případě složené podmínky mohlo být někdy i velmi obtížné.

Else se také využívá v případě, kdy potřebujeme v příkazu manipulovat s proměnnou z podmínky a nemůžeme se na ni tedy ptát potom znovu. Program si sám pamatuje, že se podmínka nesplnila a přejde do sekce else. Ukažme si to na příkladu: Mějme číslo, kde bude hodnota 0 nebo 1 a po nás se bude chtít, abychom hodnotu prohodili (pokud tam je 0, dáme tam 1, pokud 1, dáme tam 0). Naivně bychom mohli kód napsat takto:

cislo = 0 # do čísla si přiřadíme na začátku 0
if (cislo == 0): # pokud je číslo 0, dáme do něj jedničku
    cislo = 1
if (cislo == 1): # pokud je číslo 1, dáme do něj nulu
    cislo = 0

print(cislo)
input()

Nefunguje to, že? Pojďme si projet, co bude program dělat. Na začátku máme v čísle nulu, první podmínka se jistě splní a dosadí do čísla jedničku. No ale rázem se splní i ta druhá. Co s tím? Když podmínky otočíme, budeme mít ten samý problém s jedničkou. Jak z toho ven? Ano, použijeme else.

cislo = 0 # do čísla si přiřadíme na začátku 0
if (cislo == 0): # pokud je číslo 0, dáme do něj jedničku
    cislo = 1
else: # pokud je číslo 1, dáme do něj nulu
    cislo = 0

print(cislo)
input()

Podmínky je možné skládat a to pomocí dvou základních operátorů:

Logické operátory

Operátor Zápis
A zároveň and
Nebo or
Negace not

Uveďme si příklad:

cislo = int(input("Zadejte číslo v rozmezí 10-20: "))
if ((cislo >= 10) and (cislo <= 20)):
    print("Zadal jsi správně")
else:
    print("Zadal jsi špatně")
input()

S tím si zatím vystačíme, operátory se pomocí závorek samozřejmě dají kombinovat.

cislo = int(input("Zadejte číslo v rozmezí 10-20 nebo 30-40:"))
if (((cislo >= 10) and (cislo  <= 20)) or ((cislo  >=30) and (cislo  <= 40))):
    print("Zadal jsi správně")
else:
    print("Zadal jsi špatně")
input()

V Pythonu můžeme podmínky i skládat, díky tomu můžeme podmínky psát i takto:

cislo = int(input("Zadejte číslo v rozmezí 10-20 nebo 30-40:"))
if ((10 <= cislo <= 20) or (30 <= cislo <= 40)):
    print("Zadal jsi správně")
else:
    print("Zadal jsi špatně")
input()

Kalkulačka

Vzpomeňme si na naši kalkulačku z předchozí lekce, která načetla 2 čísla a vypočítala všechny 4 operace. Nyní si ale budeme chtít zvolit, kterou operaci chceme. Použijeme tedy konstrukci elif - ta provede operaci, pokud také platí podmínka:

print("Kalkulačka\n")
prvni_cislo = int(input("Zadejte první číslo: "))
druhe_cislo = int(input("Zadejte druhé číslo: "))
print("1 - sčítání")
print("2 - odčítání")
print("3 - násobení")
print("4 - dělení")
cislo_operace = int(input("Zadejte číslo operace: "))
if cislo_operace == 1:
    print("Jejich součet je:", prvni_cislo + druhe_cislo)
elif cislo_operace == 2:
    print("Jejich rozdíl je:", prvni_cislo - druhe_cislo)
elif cislo_operace == 3:
    print("Jejich součin je:", prvni_cislo * druhe_cislo)
elif cislo_operace == 4:
    print("Jejich podíl je:", prvni_cislo / druhe_cislo)
else:
    print("Neplatná volba!")
input("\nStiskněte libovolnou klávesu...")

Takto program vypadá:

Konzolová aplikace
Kalkulačka

Zadejte první číslo:
3
Zadejte druhé číslo:
2
1 - sčítání
2 - odčítání
3 - násobení
4 - dělení
Zadejte číslo operace:
4
Jejich podíl je: 1.5

Stiskněte libovolnou klávesu...

V příští lekci, Cykly v Pythonu, funkce range() a výraz pass, nás čekají cykly - konstrukce while, for in a příkazy continue a break. Dále se naučíme funkci range().


 

 

Aktivity (8)

 

 

Komentáře
Zobrazit starší komentáře (41)

Avatar
David Čápka
Tým ITnetwork
Avatar
David Čápka:7.6.2018 19:13

Nikde se tu nepíše, že by byl Python C-Like jazyk.

Odpovědět 7.6.2018 19:13
Jsem moc rád, že jsi na síti, a přeji ti top IT kariéru, ať jako zaměstnanec nebo podnikatel. Máš na to! :)
Avatar
Zdeněk Pavlátka
Tým ITnetwork
Avatar
Odpovídá na David Čápka
Zdeněk Pavlátka:7.6.2018 19:15
  1. Z té věty to tak zní
  2. Já tam moc podobnosti s C-Like jazyky nevidím... (tedy až na to že klíčové slovo je if...)
Odpovědět 7.6.2018 19:15
Kolik jazyků umíš, tolikrát jsi programátor.
Avatar
David Čápka
Tým ITnetwork
Avatar
Odpovídá na Zdeněk Pavlátka
David Čápka:7.6.2018 19:20

Dal jsem pryč slovo "všech", jinak mi to přijde korektní.

Editováno 7.6.2018 19:20
Odpovědět 7.6.2018 19:20
Jsem moc rád, že jsi na síti, a přeji ti top IT kariéru, ať jako zaměstnanec nebo podnikatel. Máš na to! :)
Avatar
cinkim
Člen
Avatar
cinkim:8.10.2018 16:13

Ahoj:
konečně to začínám chápat.

print("Výpočet obvodu a obsahu obdélníku nebo čtverce")
print ()
print(" 1 - obvod obdélníku ")
print(" 2 - obsah obdélníku ")
print()
print(" 3 - obvod čtverce ")
print(" 4 - obsah čtverce ")
print()
cislo_operace=in­t(input(" Zadejte číslo operace: "))
print()
if cislo_operace==1:
a=float(input(" Zadejte délku strany a: "))
b=float(input(" Zadejte délku strany b: "))
print("Obvod obdélníku je ", 2a+2b ,)
elif cislo_operace==2:
a=float(input(" Zadejte délku strany a: "))
b=float(input(" Zadejte délku strany b: "))
print("Obsah obdélníku je ", a*b ,)
elif cislo_operace==3:
a=float(input(" Zadejte délku strany a: "))
print(" Obvod čtverce je", a*4,)
elif cislo_operace==4:
a=float(input(" Zadejte délku strany a: "))
print(" Obsah čtverce je", a*a,)
input()

 
Odpovědět 8.10.2018 16:13
Avatar
cinkim
Člen
Avatar
cinkim:9.10.2018 11:21

Ahoj,

mám jeden všeobecný dotaz. Napíšu si nějaký kód a chtěl bych ho ukázat kamarádovi na jeho PC (win10) bez toho, abych musel instalovat Python. Dá se kód nějak převést na exe soubor? Na netu jsem našel nějaké návody a odkazy, ale bez úspěchu.
Máte nějaký fungující odkaz na převod do exe souboru?
Mám nainstalovaný Python 3.7.0 a win7.

Díky

 
Odpovědět 9.10.2018 11:21
Avatar
Odpovídá na cinkim
Miloslav Kubátko:1.11.2018 11:47

Špatně, nefunkční !

 
Odpovědět  -1 1.11.2018 11:47
Avatar
cinkim
Člen
Avatar
Odpovídá na Miloslav Kubátko
cinkim:2.11.2018 8:23

Ahoj,
je to tak. V kódu byla chyba...:-)
print("Výpočet obvodu a obsahu obdélníku nebo čtverce")
print ()
print(" 1 - obvod obdélníku ")
print(" 2 - obsah obdélníku ")
print()
print(" 3 - obvod čtverce ")
print(" 4 - obsah čtverce ")
print()
cislo_operace = int(input(" Zadejte číslo operace: "))
print()
if cislo_operace==1:
a = float(input(" Zadejte délku strany a: "))
b = float(input(" Zadejte délku strany b: "))
print("Obvod obdélníku je ", 2a+2b ,)
elif cislo_operace==2:
a = float(input(" Zadejte délku strany a: "))
b = float(input(" Zadejte délku strany b: "))
print("Obsah obdélníku je ", a*b ,)
elif cislo_operace==3:
a = float(input(" Zadejte délku strany a: "))
print(" Obvod čtverce je", a*4,)
elif cislo_operace==4:
a = float(input(" Zadejte délku strany a: "))
print(" Obsah čtverce je", a*a,)
input()

 
Odpovědět 2.11.2018 8:23
Avatar
cinkim
Člen
Avatar
Odpovídá na cinkim
cinkim:2.11.2018 8:24

Tak ještě jednou

print("Výpočet obvodu a obsahu obdélníku nebo čtverce")
print ()
print(" 1 - obvod obdélníku ")
print(" 2 - obsah obdélníku ")
print()
print(" 3 - obvod čtverce ")
print(" 4 - obsah čtverce ")
print()
cislo_operace = int(input(" Zadejte číslo operace: "))
print()
if cislo_operace==1:
a = float(input(" Zadejte délku strany a: "))
b = float(input(" Zadejte délku strany b: "))
print("Obvod obdélníku je ", 2a+2b ,)
elif cislo_operace==2:
a = float(input(" Zadejte délku strany a: "))
b = float(input(" Zadejte délku strany b: "))
print("Obsah obdélníku je ", a*b ,)
elif cislo_operace==3:
a = float(input(" Zadejte délku strany a: "))
print(" Obvod čtverce je", a*4,)
elif cislo_operace==4:
a = float(input(" Zadejte délku strany a: "))
print(" Obsah čtverce je", a*a,)
input()

Editováno 2.11.2018 8:25
 
Odpovědět 2.11.2018 8:24
Avatar
cinkim
Člen
Avatar
cinkim:2.11.2018 8:34

Nechápu proč, ale z nějakého důvodu se při vložení změní odsazení a u vzorce výpočtu obvodu obdélníku se ztratí operátor násobení.
print("Obvod obdélníku je ",( 2a)+(2b) ,)

Editováno 2.11.2018 8:35
 
Odpovědět 2.11.2018 8:34
Avatar
Jakub Podskalský:17.12.2018 20:38

K podmínce elif bych jasně napsal, že se provede pouze tehdy, pokud se nesplní podmínka if, stejně jako u else. A naopak když se if vyhodnotí jako pravdivý výraz, tak je následující elif a else konstrukce ignorována a bez ohledu na jeho pravdivost se přeskočí. Setkal jsem se už totiž s několika případy, kdy lidem dělalo problém tyto dvě podmínky odlišit.

Editováno 17.12.2018 20:40
 
Odpovědět 17.12.2018 20:38
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 10 zpráv z 51. Zobrazit vše