Návod na Python – větvení, podmínky a logické operátory

větvení


Zatím jsme se věnovali především proměnným, datovým typům, přiřazovacímu příkazu a příkazům pro vstup a výstup. To samozřejmě stačí k tvorbě pouze nejjednodušších programů. K těm složitějším budeme potřebovat řídit jejich běh pomocí dalších strukturních příkazů, které nám zajistí opakování části programu nebo jeho větvení. A právě na větvení se nyní podíváme.

větvení vývojový diagram
Struktura větvení ve vývojovém diagramu. © Logickemysleni.cz

Příkaz větvení IF

Příkaz větvení používá jednoduchou konstrukci IF logická podmínka THEN příkaz_1 ELSE příkaz_2. V češtině KDYŽ / POKUD je splněna logická podmínka, POTOM vykonej příkaz_1, JINAK vykonej příkaz_2. Logická podmínka je výraz, který lze vyhodnotit jako TRUE nebo FALSE, typicky třeba porovnání dvou čísel, proměnné s číslem apod. Ve větvi THEN by měl být alespoň jeden příkaz, větev ELSE je většinou nepovinná a nemusí se uvádět. V Pythonu vypadá syntaxe takto:

a = int(input("Zadej celé číslo: "))
if a == 0:
  print("a je rovno 0")
else:
  print("a je nenulové")
  print("Konec programu")

Pokud zadáte do proměnné a nulu, program projde první větví za IF, vytiskne „a je rovno 0“ a „Konec programu“.

Pokud zadáte do proměnné a jiné číslo, vytiskne „a je nenulové“ a „Konec programu“. Pak skončí.

Pokud zadáte něco jiného než číslo, program skončí chybou.

Všimněte si, že větev THEN (POTOM) je uvedena dvojtečkou za podmínkou a příkazy v této větvi píšeme odsazené (typicky o 2 mezery nebo o tabulátor) doprava. Podobně větev ELSE, její začátek je na stejné úrovni odsazení jako IF, ke kterému patří, ukončená dvojtečkou, příkazy v této větvi jsou opět odsazené stejně jako ve větvi THEN. Další příkazy bez odsazení vykonají až poté, co program projde jednou z větví příkazu IF.

Pokud bychom tedy odsadili i poslední příkaz z předchozího programu, výsledek by byl poněkud jiný:

a = int(input("Zadej celé číslo: "))
if a == 0:
  print("a je rovno 0")
else:
  print("a je nenulové")
  print("Konec programu")

V tomto případě se výstup „Konec programu“ vytiskne jen v případě, že obsahem proměnné a bude něco jiného než nula.

Varianty příkazu IF

Jak jsme si již řekli, větev ELSE není povinná, pokud není třeba, neuvádíme ji. Další možnou variantou je vícenásobné větvení pomocí konstrukce ELIF (zkrácené ESLE IF, česky JINAK KDYŽ). Jde v podstatě o další vnořený příkaz IF, který umožní otestovat další podmínku, pokud ta předchozí není splněna. Větví ELIF může být libovolný počet, jako poslední můžeme uvést opět klasickou větev ELSE. Samozřejmě lze stejné větvení napsat i pomocí vnořených IFů (následující dva programy jsou ekvivalentní:

a = int(input("Zadej celé číslo: "))
if a == 0:
  print("a je rovno 0")
elif a > 0:
  print("a je kladné")
else:
  print("a je záporné")
print("Konec programu")
a = int(input("Zadej celé číslo: "))
if a == 0:
  print("a je rovno 0")
else:
  if a > 0:
    print("a je kladné")
  else:
    print("a je záporné")
print("Konec programu")

V Pythonu není příklad SWITCH / CASE (jako v PHP, C++ či Javě), pokud tedy potřebujeme vícenásobné větvení tohoto typu, je konstrukce IF – ELIF – ELIF – ELIF možností, jak tuto strukturu elegantně zapsat:

a = str(input("Zadej písmeno: "))
if a == "A":
  print("a je rovno A")
elif a == "B":
  print("a je rovno B")
elif a == "C":
  print("a je rovno C")
print("Konec programu")

Tento typ větvení používáme pro výběr z variant, kdy proměnná (např. a) nabývá několik různých hodnot.

Typicky při výběru variant z nabídky (menu), případně při zpracování řetězců.

Následující jednoduchý příklad porovná dvě zadaná celá čísla A a B a vytiskne, které je větší, či zda se rovnají. Pokud zadáme desetinné číslo nebo řetězec, program ohlásí chybu. Program si můžete vyzkoušet zde.

Příklad: porovnání dvou čísel A a B

a = int(input("Zadej celé číslo A: "))
b = int(input("Zadej celé číslo B: "))
if a > b:
  print(a, "je větší než", b)
elif a < b:
  print(a, "je menší než", b) 
else:
  print(a, "se rovná", b)
print("Konec programu")

Podmínky a logické operátory

Tím, podle čeho se v příkazu IF rozhoduje, kterou z větví THEN či ELSE se půjde, je logický výraz, resp. jeho výsledná hodnota. Logický výraz se skládá z proměnných, jejich porovnání s jinými proměnnými či hodnotami, a to vše můžeme spojovat pomocí logických spojek.

Výsledkem logického výrazu je buď hodnota True (pravda), nebo False (nepravda). Pokud je výraz pravdivý, pokračuje se větví za IF (větví THEN), pokud je nepravdivý, pokračuje se větví ELSE. Pokud větev ELSE chybí, pokračuje se prvním dalším příkazem na stejné úrovni za příkazem IF.

a = 21.758
if a > 20:
  print("a je větší než 20")
else:
  print("a je menší nebo rovno 20")

Proměnná a má hodnotu 21,758,
podmínka a > 20 je tedy splněná,
pokračuje se první větví a program vytiskne:
„a je větší než 20“
Větev ELSE se neprovede.

Příkaz IF reaguje v Pythonu i na výrazy jiného typu, než jen bool (tj. s výsledkem True a False). Nulu, prázdný řetězec, prázdné pole ( [] )či jiný prázdný objekt (None) interpretuje stejně jako logickou hodnotu False (logická nula), vše ostatní (neprázdný řetězec, nenulové číslo, objekt, neprázdné pole) je pro něj True (logická jednička). Rozhodně ale pište logické výrazy v IFech klasicky s výsledkem True nebo False, bude to jasnější, přehlednější a nebudete řešit chyby.

Operátory porovnání a logické spojky AND, OR a NOT

Základem logického výrazu je buď proměnná typu bool, nebo porovnání proměnné jiného typu s další proměnnou nebo zadanou hodnotou. Operátory pro porovnání jsou následující:

Operátor porovnáníVýznamPříklad
==rovná sea == 0
!=nerovná sea != 0
>větší neža > 0
>=větší nebo rovnoa >= 0
<menší neža < b
<=menší nebo rovnoa <= b
===identita objektů (proměnné ukazují na stejný objekt v paměti)a === b

Logickými spojkami spojujeme dílčí logické výrazy (např. porovnání výše) nebo proměnné typu bool do větších logických výrazů. Logické spojky se vyhodnocují zleva doprava a tzv. „líně“ (lazy evaluation). Tj, pokud už interpret Pythonu má jasno (např. proto, že mezi výrazy spojenými spojkou and je jeden False), dále už nevyhodnocuje.

Není ani potřeba dělat při spojování porovnání pomocí logických spojek závorky, nicméně to vřele doporučujeme, usnadní to a přehlednost kódu.

Logický operátorVýznamPříklad
anda zároveň
(oba výrazy musejí být pravdivé, aby byl výsledek pravdivý)
a > b and b > c
ornebo
(stačí jeden pravdivý výraz, aby byl výsledek pravdivý)
a == 0 or a == 1
notnegace (z pravdy udělá nepravdu a naopak)not a ==b
je to samé jako
a != b

V Pythonu je i logická spojka XOR (výlučné nebo, v češtině používáme konstrukci buď, anebo), používá se však na bitové porovnávání. Nepíše se xor, ale používá se znak ^ (AltGr + š + mezera). Je možné ji použít i v logických výrazech, nebo použít definici spojky (funkce) XOR:

x ^ y  je to samé jako  (not x and y) or (x and not y)

Buďte první, kdo vloží komentář

Přidejte odpověď