2.11. Podmínky

Podmínka spustí blok kódu pouze tehdy, když nějaký test vyhodnotí jako pravdivý. Klíčovým slovem je if, za nímž volitelně následuje jedna nebo více větví elif („else if“) a závěrečné else.

n = 42

if n > 0:
    print("positive")
elif n < 0:
    print("negative")
else:
    print("zero")

Tělo každé větve je vše odsazené pod ní (čtyři mezery podle konvence). Python prochází větve v pořadí, spustí první, jejíž test je pravdivý, a zbytek přeskočí. Blok else se spustí pouze tehdy, pokud byl každý předchozí test nepravdivý; je vždy volitelný.

Vývojový diagram zobrazující if/elif/else: dva kosočtverce rozhodovacích testů s jejich těly, přecházející na závěrečné tělo else, když jsou oba testy nepravdivé.

Vždy se spustí pouze jedna větev. Testy se vyhodnocují shora dolů, dokud jeden neuspěje; zbytek se přeskočí.

2.11.1. Pravdivost

Test v if nemusí vracet True ani False – jakákoli hodnota se počítá buď jako pravdivá, nebo nepravdivá. Nepravdivé hodnoty jsou:

  • False a None

  • Číslo nula: 0, 0.0

  • Prázdné posloupnosti a kolekce: "", [], (), {}, b""

Vše ostatní je pravdivé. To vám umožňuje psát kompaktní testy:

if name:                     # false on empty string
    print("hello", name)

if items:                    # false on empty list, dict, etc.
    process(items)

Mějte na paměti, že pravdivost mění význam. if value: není totéž co if value is not None: – první je nepravdivé také tehdy, když je value rovno 0 nebo "". Když opravdu myslíte „je toto přesně None„, použijte explicitně is None / is not None.

2.11.2. Ternární výrazy

Podmínka se může objevit uvnitř výrazu:

label = "even" if n % 2 == 0 else "odd"

Čteno jako „label je "even" pokud n % 2 == 0 jinak "odd".“ Praktické pro jednořádkové zápisy; pro cokoli delšího než jeden řádek se snadněji čte plný příkaz if.

2.11.3. Vnořování a předčasné návraty

Podmínky lze libovolně hluboko vnořovat, ale každá další vrstva odsazení činí funkci hůře čitelnou. Příklad níže kontroluje čtyři podmínky před provedením skutečné práce a nechává užitečný řádek pohřbený čtyři odsazení hluboko:

def process(item):
    if item is not None:
        if item.is_valid():
            if item.size() > 0:
                if item.owner == "me":
                    return do_the_work(item)
    return None

Tento druh kódu zploští dva vzory.

2.11.3.1. Předčasné návraty pro stráže

Nejprve ošetřete každý případ „vyskoč ven“, každý s vlastním return, aby hlavní logika zůstala na vnějším odsazení. Každá stráž se čte jako „toto není případ, který řešíme; odejdi“:

def process(item):
    if item is None:
        return None
    if not item.is_valid():
        return None
    if item.size() == 0:
        return None
    if item.owner != "me":
        return None
    return do_the_work(item)

„Hlavní cesta“ je nyní jeden řádek na konci funkce, nikoli pohřbený uvnitř čtyř vrstev. Tento styl se někdy nazývá vzor strážní klauzule (guard clause).

2.11.3.2. Kombinování testů pomocí and / or

Když musí pro stejnou větev platit několik podmínek, kombinujte je pomocí and místo vnořování. Podmínky, které každá nezávisle spouští větev, kombinujte pomocí or:

# all must hold -- use `and`
if user.is_admin() and user.has_permission("write") and not locked:
    save()

# any one of them is enough -- use `or`
if c == " " or c == "\t" or c == "\n":
    whitespace_count += 1

Obě formy provádějí zkrácené vyhodnocení, takže nákladná kontrola na pravé straně se spustí pouze tehdy, když levnější kontroly vlevo již otázku nevyřešily.