Zápis příkazů if na jeden řádek pomocí ternárního operátoru jazyka Python (podmíněný operátor)

Podnikání

Python má styl zápisu nazývaný ternární operátory (podmíněné operátory), který dokáže popsat proces jako příkaz if na jednom řádku.

Zde je vysvětlen následující postup spolu s ukázkovým kódem.

  • Základní zápis ternárních operátorů
  • if ... elif ... else ...Popište to jedním řádkem
  • Kombinace komplexního zápisu seznamu a ternárních operátorů
  • Kombinace anonymních funkcí (lambda výrazů) a ternárních operátorů

Další informace o normálním příkazu if naleznete v následujícím článku.

Základní zápis ternárních operátorů

V jazyce Python lze ternární operátor zapsat takto

Expression evaluated when the conditional expression is true if conditional expression else Expression evaluated when the conditional expression is false

Pokud chcete přepínat hodnoty podle podmínek, jednoduše zapište každou hodnotu tak, jak je.

Value to return if conditional expression is true if conditional expression else Value to return if conditional expression is false
a = 1
result = 'even' if a % 2 == 0 else 'odd'
print(result)
# odd

a = 2
result = 'even' if a % 2 == 0 else 'odd'
print(result)
# even

Pokud chcete přepínat zpracování podle podmínek, popište jednotlivé výrazy.

a = 1
result = a * 2 if a % 2 == 0 else a * 3
print(result)
# 3

a = 2
result = a * 2 if a % 2 == 0 else a * 3
print(result)
# 4

Přípustné jsou i výrazy, které nevracejí žádnou hodnotu (výrazy vracející None). V závislosti na podmínce se vyhodnotí jeden z výrazů a provede se proces.

a = 1
print('even') if a % 2 == 0 else print('odd')
# odd

Ekvivalentní následujícímu kódu zapsanému pomocí běžného příkazu if.

a = 1

if a % 2 == 0:
    print('even')
else:
    print('odd')
# odd

Více podmíněných výrazů lze také spojit pomocí logických operátorů (and, or atd.).

a = -2
result = 'negative and even' if a < 0 and a % 2 == 0 else 'positive or odd'
print(result)
# negative and even

a = -1
result = 'negative and even' if a < 0 and a % 2 == 0 else 'positive or odd'
print(result)
# positive or odd

if ... elif ... else ...Jednořádkový popis

if ... elif ... else ...Neexistuje žádný speciální způsob, jak to napsat na jeden řádek. Lze to však realizovat pomocí dalšího ternárního operátoru ve výrazu, který se vyhodnotí, když je podmíněný výraz ternárního operátoru false. Obrázek vnoření ternárních operátorů.

Možná by však bylo lepší nepoužívat ji ve velké míře, protože snižuje čitelnost.

a = 2
result = 'negative' if a < 0 else 'positive' if a > 0 else 'zero'
print(result)
# positive

a = 0
result = 'negative' if a < 0 else 'positive' if a > 0 else 'zero'
print(result)
# zero

a = -2
result = 'negative' if a < 0 else 'positive' if a > 0 else 'zero'
print(result)
# negative

Následující podmíněný výraz lze interpretovat dvěma způsoby, ale považuje se za první z nich (1).

A if condition 1 else B if condition 2 else C
1. A if condition 1 else ( B if condition 2 else C )
2. ( A if condition 1 else B ) if condition 2 else C 

Konkrétní příklad je následující. Na první výraz se pohlíží, jako by to byl druhý výraz.

a = -2
result = 'negative' if a < 0 else 'positive' if a > 0 else 'zero'
print(result)
# negative

result = 'negative' if a < 0 else ('positive' if a > 0 else 'zero')
print(result)
# negative

result = ('negative' if a < 0 else 'positive') if a > 0 else 'zero'
print(result)
# zero

Kombinace komplexního zápisu seznamu a ternárních operátorů

Užitečné použití ternárního operátoru je při zpracování seznamů v notaci pro porozumění seznamu.

Kombinací ternárního operátoru a notace pro porozumění seznamu je možné nahradit prvky seznamu nebo provést jiné zpracování v závislosti na podmínkách.

l = ['even' if i % 2 == 0 else i for i in range(10)]
print(l)
# ['even', 1, 'even', 3, 'even', 5, 'even', 7, 'even', 9]
l = [i * 10 if i % 2 == 0 else i for i in range(10)]
print(l)
# [0, 1, 20, 3, 40, 5, 60, 7, 80, 9]

Další informace o zápisu srozumitelnosti seznamu naleznete v následujícím článku.

Kombinace anonymních funkcí (lambda výrazů) a ternárních operátorů

Užitečný je ternární operátor, který lze stručně popsat i v anonymní funkci (lambda výraz).

get_odd_even = lambda x: 'even' if x % 2 == 0 else 'odd'

print(get_odd_even(1))
# odd

print(get_odd_even(2))
# even

Všimněte si, že ačkoli to nesouvisí s ternárním operátorem, výše uvedený příklad přiřazuje lambda výrazu jméno. Proto mohou nástroje pro automatickou kontrolu, jako je kódovací konvence PEP8 v jazyce Python, vygenerovat varování.

Je to proto, že PEP8 doporučuje při přiřazování názvů funkcím používat def.

Koncepce PEP8 je následující

  • Výrazy lambda se používají k předávání volatelných objektů jako argumentů, například bez jejich pojmenování.
  • V lambda výrazech použijte def pro definici podle jména.