Jak používat Python Ternary Operator

Tato příručka vás naučí, jak používat ternární operátor v Pythonu. Naučíte se syntaxi a několik příkladů kódu, abyste pochopili, jak to funguje.

Začneme tím, že si zopakujeme, jak funguje podmíněný příkaz if-else, a pak se naučíme, jak napsat ekvivalentní výraz pomocí ternárního operátoru.

Dále si nakódujeme několik příkladů a pak se naučíme, jak emulovat chování ternárního operátoru Pythonu pomocí pythonské n-tice a slovníku. Nakonec se podíváme na několik případů použití, kdy byste měli raději používat ternární operátor.

Pojďme začít!

Prohlášení If-Else v Pythonu: Recenze

Můžete spolu kódovat spuštěním Python REPL nebo v online Python editoru etechblog.cz.

Obecná syntaxe příkazu if-else v Pythonu je následující:

if condition:
    # do this
else:
    # do this

Ve výše uvedeném úryvku podmínka označuje podmínku, která má být zkontrolována. Pokud se podmínka vyhodnotí jako True, spustí se blok if. Pokud se podmínka vyhodnotí jako False, provedou se příkazy uvnitř bloku else.

Zde je příklad, kdy je proměnné game_over přiřazena booleovská hodnota v závislosti na tom, zda je hodnota energie menší nebo rovna nule.

  • Pokud energie <= 0, game_over je True.
  • Jinak je game_over False.

Následující fragment kódu ukazuje, jak to provést pomocí podmíněných příkazů if-else:

energy = -1

if energy <= 0:
    game_over = True
else:
    game_over = False

print(game_over)
# True

V tomto příkladu je energie -1, což je méně než 0. Takže game_over je True.

Ternární operátor Pythonu: Syntaxe a příklady

Python má ternární operátor, který funguje podobně jako ternární podmíněný operátor v jazycích jako C a C++. Obecná syntaxe pro jeho použití je následující:

expression1 if condition else expression2

Pojďme analyzovat výše uvedenou syntaxi:

  • stav: Stav, který se má zkontrolovat.
  • výraz1: Výraz k vyhodnocení, zda je podmínka pravdivá.
  • výraz2: Výraz k vyhodnocení, zda je podmínka False.
  Jak zakázat službu Gear VR na Androidu

Nyní zjistíme, jaký výraz1, výraz2 a podmínka by měly být z verze kódu if-else.

Když to dáme dohromady, máme následující pomocí ternárního operátoru Pythonu.

game_over = True if energy <= 0 else False
print(game_over)
# True

Pojďme kódovat další příklad. Předpokládejme, že provozujete knihkupectví a dáte čtenářům slevu na nákup podle toho, jak často váš obchod za poslední rok navštívili.

Nechť numVisits označuje počet návštěv.

  • Pokud numVisits > 7, procento slevy, diskontní_perc je 20.
  • Jinak sleva_perc je 5.

Pomocí ternárního operátoru přiřadíme hodnotu proměnné diskontní_perc.

numVisits = 10

discount_perc = 20 if numVisits > 7 else 5

print(discount_perc)
# 20 (as numVisits = 10 which is > 7)

Dále se naučíme, jak emulovat ternární operátor pomocí pythonské n-tice a slovníku.

Emulace ternárního operátora pomocí Python Tuple

Stejně jako všechny iterovatelné v Pythonu se n-tice řídí nulovým indexováním. Pokud tedy máte dva prvky v n-tice, název_n-tice[0] označuje první prvek v n-tice a název_n-tice[1] dává druhý prvek v n-tice.

Základní datové typy v Pythonu jsou integer, float, string a Boolean. Python podporuje přetypování typu, které vám umožňuje reprezentovat konkrétní datový typ jeho ekvivalentní reprezentací v jiném datovém typu.

Spusťte Python REPL a spusťte následující příklady. Pokud se pokusíte převést celá čísla na booleovské hodnoty, všimnete si následujícího:

  • bool(0) je False.
  • bool() vrátí hodnotu True.
>>> bool(0)
False
>>> bool(1)
True
>>> bool(-1)
True
>>> bool(10)
True

Podobně při přetypování Boolean na celá čísla máme následující:

>>> int(True)
1
>>> int(False)
0

Když dáme dohromady typové odlévání a indexování, můžeme provést následující:

  • Prvek na indexu 0 v n-tici: Hodnota, která se má použít, když je podmínka False.
  • Prvek na indexu 1 v n-tici: Hodnota, která se použije, když je podmínka True.

Pomocí výše uvedeného máme následující:

>>> numVisits = 10
>>> discount_perc = (5,20)[numVisits > 7]
>>> discount_perc
# 20

Zde je podmínka numVisits > 7 True, protože numVisits je 10. Protože int(True) je 1, hodnota diskont_perc je 20, prvek na indexu 1.

Emulace ternárního operátoru pomocí slovníku Python

Jako klíče slovníku můžete nastavit True a False. A výraz1 a výraz2 můžete nastavit jako hodnoty odpovídající klíčům True a False.

some_dict = {True: expression1,
             False: expression2
            }

co budeš dělat dál? Nyní, pokud použijete some_dict[condition], výraz1 odpovídající klíči True se vyhodnotí, pokud je podmínka True. A výraz2 je vyhodnocen, když je podmínka False.

Pojďme kódovat příklad diskont_perc (znovu), ale tentokrát pomocí slovníku Pythonu.

>>> numVisits = 10
>>> discount_dict = {True: 20, False:5}
>>> discount_perc = discount_dict[numVisits > 7]
>>> discount_perc
# 20

Zde je numVisits = 10, což je větší než 7. Proto podmínka numVisits > 7 je True. Takže sleva_dikt[numVisits > 7] vyhodnotí jako diskontní_dikt[True] což je hodnota 20.

Měli byste vždy používat ternárního operátora Pythonu?

Zatím jsme se naučili používat ternární operátor. Měli bychom ale vždy používat ternární operátor? No, ternární operátor nemusí být nejlepší volbou pro všechny případy použití. Tato část rozebírá, kdy byste měli upřednostňovat použití ternárního operátoru před příkazy if-else. Probereme také, kdy bychom měli zvážit použití příkazu if-else namísto ternárního operátoru.

Výstižnější než bloky If-Else

Jak již bylo zmíněno, v Pythonu je výraz ternárního operátoru stručnější než příkaz if-else. Proto jej můžete použít ke kontrole podmínek a podmíněnému vyhodnocování výrazů za běhu.

V následujícím příkladu je nums seznam 100 náhodně generovaných celých čísel. U každého ze 100 čísel zkontrolujeme, zda je liché nebo sudé. A toto vyhodnocení probíhá inline uvnitř f-řetězce.

import random

nums = [random.choice(range(100)) for i in range(10)]

for num in nums:
    print(f"{num} is {'even' if num%2==0 else 'odd'}")
# sample output

0 is even
56 is even
6 is even
53 is odd
62 is even
7 is odd
8 is even
77 is odd
41 is odd
94 is even

Ternární operátor vyžaduje ustanovení Else

Když používáte podmíněné příkazy if-else, klauzule else je volitelná. Vezměme si příklad. Proměnná game_over je nastavena na True, pokud energie klesne na hodnotu menší nebo rovnou nule.

Pokud je však energie větší než nula, proměnná game_over se nikdy neinicializuje. Pokud se tedy pokusíte získat přístup k proměnné game_over, narazíte na chyby.

energy = 5
if energy <= 0:
    game_over = True

print(f"Is the game over? {game_over}")
Traceback (most recent call last):
  File "ternary_op.py", line 39, in <module>
    print(f"Is the game over? {game_over}")
NameError: name 'game_over' is not defined

Jedním ze způsobů, jak to napravit, je zpočátku nastavit game_over na False a aktualizovat na True, pokud je úroveň energie menší nebo rovna nule.

energy = 5
game_over = False
if energy <= 0:
    game_over1 = True

print(f"Is the game over? {game_over}")

Při použití ekvivalentu ternárního operátoru Pythonu výše uvedenému však klauzule else není volitelná. Ternární operátor vyžaduje, aby byl výraz vyhodnocen, když je podmínka False.

game_over = True if energy <= 0 else False

Pokud změníte výše uvedené na game_over = True if energy <= 0 odstraněním části else, narazíte na chybu syntaxe, jak je ukázáno:

File "ternary_op.py", line 42
    game_over = True if energy <= 0
                                  ^
SyntaxError: invalid syntax

Chcete-li zkontrolovat více podmínek, použijte příkazy If-Else

Zvažte příklad: Každá otázka v sadě otázek kódovacího rozhovoru má přiřazené skóre obtížnosti. V závislosti na tomto skóre přiřadíme konkrétní otázce jednu ze tří úrovní obtížnosti: snadná, střední nebo těžká. Předpokládejme, že máme následující:

Skóre Úroveň Obtížnosti Méně než 10 snadnéMezi 10 a 20 středníVětší než 20 těžké

Vzhledem ke skóre obtížnosti můžete získat jeho úroveň obtížnosti pomocí ternárního operátoru Pythonu, jak je znázorněno:

score = 12

difficulty_level = "easy" if score < 10 else "hard" if score > 20 else "medium"

print(difficulty_level)
# medium

Výraz ternárního operátoru ve výše uvedeném bloku kódu má následující formu:

expression1 if condition1 else expression2 if condition2 else expression3

Přestože je stručná, je trochu obtížné ji číst a analyzovat. Následující obrázek ukazuje, jak v tomto případě probíhá řídicí tok.

Následující fragment kódu ukazuje ekvivalentní implementaci pomocí příkazů if-else. Jak je vidět, řídicí tok je mnohem srozumitelnější a kód je čitelnější.

if score < 10:
    difficulty_level="easy"
elif score > 20:
    difficulty_level="hard"
else:
    difficulty_level="medium"

print(difficulty_level)

Pokud tedy máte více podmínek, měli byste místo ternárního operátoru použít bloky if-else. Tím je zajištěno, že kód je snadno čitelný a srozumitelný.

Také, když potřebujete provést více příkazů – v závislosti na tom, zda je podmínka pravdivá nebo nepravdivá – měli byste zvážit použití příkazu if-else.

Závěr

Zde je rekapitulace toho, co jste se v tomto tutoriálu naučili.

  • V Pythonu lze ternární operátor použít s následující syntaxí: expression1 if podmínka else expression2.
  • Chování ternárního operátoru můžete emulovat pomocí pythonských n-tic a slovníků.
  • I když ternární operátor může být stručnější alternativou k blokům if-else, měli byste zajistit, aby byl kód čitelný. Chcete-li zlepšit čitelnost kódu, můžete místo ternárního operátoru použít příkazy if-else, zvláště když potřebujete řetězit více podmínek.

Dále se naučte podívat se na tutoriál o stejných a nestejných operátorech v Pythonu.