Nauč se Python > Kurzy > Začátečnický kurz > První program > Porovnávání

Porovnávání

Pamatuješ si ještě, co je to operátor?

V domácím projektu jsme si ukázali základní aritmetické operátory. Přidáme-li jeden další (//), jsou to tyhle:

Symbol Příklad Popis
+, -, *, / 1 + 1 Základní aritmetika
- -5 Negace
//; % 7 // 2; 7 % 2 Dělení se zbytkem (celočíselné dělení); zbytek
** 3 ** 2 Umocnění (3 na druhou)

Python ale zná i další druhy operátorů. Důležité jsou operátory porovnávací. Zkus si co dělají! (Buď z programu pomocí print, nebo pusť python z příkazové řádky.)

Symbol Příklad Popis
==, != 1 == 1, 1 != 1 Je rovno, není rovno
<, > 3 < 5, 3 > 5 Větší než, menší než
<=, >= 3 <= 5, 3 >= 5 Větší nebo rovno, menší nebo rovno

Hodnoty provnání jsou takzvané booleovské hodnoty (angl. boolean, podle G. Boolea). V Pythonu se používají vždycky, když potřebujeme vědět, jestli něco platí nebo neplatí. Jsou jenom dvě – buď True (pravda), nebo False (nepravda).

Jako všechny hodnoty, True a False se dají přiřazovat do proměnných:

pravda = 1 < 3
print(pravda)

nepravda = 1 == 3
print(nepravda)

Všimni si, že rovnost se zjišťuje pomocí dvou rovnítek: 3 == 3. Jedno rovnítko přiřazuje do proměnné; dvě rovnítka porovnávají.

Slova True a False jdou v programu použít i přímo, jen je potřeba dávat pozor na velikost písmen:

print(True)
print(False)

Podmínky

Teď oprášíme program na výpočet obvodu a obsahu. Do nového souboru, třeba ~/naucse-python/02/if.py, napiš následující program. Co se stane, když jako stranu zadáš záporné číslo? Dává výstup smysl?

strana = float(input('Zadej stranu čtverce v centimetrech: '))
print('Obvod čtverce se stranou', strana, 'je', 4 * strana, 'cm')
print('Obsah čtverce se stranou', strana, 'je', strana * strana, 'cm2')

Tady je vidět, jak počítač dělá přesně, co se mu řekne, a nepřemýšlí o významu. Bylo by dobré uživateli, který zadá záporné číslo, přímo říct, že zadal blbost. Jak na to?

Nejdřív zkus nastavit proměnnou která bude True, když uživatel zadal kladné číslo.

Řešení

A nyní řekneme počítači, aby tuhle proměnnou použil. K tomu se používá dvojice příkazů if (pokud) a else (jinak). Nejlepší bude je ukázat na příkladu:

strana = float(input('Zadej stranu čtverce v centimetrech: '))
cislo_je_spravne = strana > 0

if cislo_je_spravne:
    print('Obvod čtverce se stranou', strana, 'je', 4 * strana, 'cm')
    print('Obsah čtverce se stranou', strana, 'je', strana * strana, 'cm2')
else:
    print('Strana musí být kladná, jinak z toho nebude čtverec!')

print('Děkujeme za použití geometrické kalkulačky.')

Neboli: po if následuje podmínka (angl. condition), což je výraz, podle kterého se budeme rozhodovat. Za podmínkou je dvojtečka. Potom následují příkazy, které se provedou, pokud je podmínka pravdivá. Všechny jsou odsazeny o čtyři mezery.
Po téhle části stačí napsat neodsazené else:, zase s dvojtečkou na konci, a odsazené příkazy, které se provedou v opačném případě.
Potom můžeš psát příkazy, které se provedou vždycky – ty odsazené nebudou, podmíněná část programu už skončila.

Čistě technicky, odsazení nemusí být o čtyři mezery. Může být třeba o dvě nebo o jedenáct, nebo dokonce o tabulátor. V rámci jednoho bloku musí být ale odsazení vždycky stejné, takže když pak na jednom programu spolupracuje více lidí, musí se shodnout. No a na čtyřech mezerách se shodla většina Pythonního světa.

Další podmíněné příkazy

Někdy není else vůbec potřeba. V následujícím programu se nedělá nic navíc, pokud je číslo nenulové:

cislo = int(input('Zadej číslo, přičtu k němu 3: '))
if cislo == 0:
    print('Jé, to je jednoduché!')
print(cislo, '+ 3 =', cislo + 3)

Někdy je naopak potřeba podmínek několik, k čemuž slouží příkaz elif – kombinace else a if. Dává se „mezi“ bloky if a else. Příkazů elif může být za jedním if-em několik, ale vždy se provede jen jedna „větev“: ta první, jejíž podmínka je splněna.

vek = int(input('Kolik ti je let? '))
if vek >= 150:
    print('A ze kterépak jsi planety?')
elif vek >= 18:
    # Tahle větev se např. pro "200" už neprovede.
    print('Můžeme nabídnout: víno, cider, nebo vodku.')
elif vek >= 1:
    print('Můžeme nabídnout: mléko, čaj, nebo vodu')
elif vek >= 0:
    print('Sunar už bohužel došel.')
else:
    # Nenastala ani nedna ze situací výše – muselo to být záporné
    print('Návštěvníky z budoucnosti tady nevidíme rádi.')

Kámen nůžky papír

Příkazy if se dají zanořovat (angl. nest): jeden může být vevniř ve druhém. Třeba takhle:

tah_pocitace = 'kámen'
tah_cloveka = input('kámen, nůžky, nebo papír? ')

if tah_cloveka == 'kámen':
    if tah_pocitace == 'kámen':
        print('Plichta.')
    elif tah_pocitace == 'nůžky':
        print('Vyhrála jsi!')
    elif tah_pocitace == 'papír':
        print('Počítač vyhrál.')
elif tah_cloveka == 'nůžky':
    if tah_pocitace == 'kámen':
        print('Počítač vyhrál.')
    elif tah_pocitace == 'nůžky':
        print('Plichta.')
    elif tah_pocitace == 'papír':
        print('Vyhrála jsi!')
elif tah_cloveka == 'papír':
    if tah_pocitace == 'kámen':
        print('Vyhrála jsi!')
    elif tah_pocitace == 'nůžky':
        print('Počítač vyhrál.')
    elif tah_pocitace == 'papír':
        print('Plichta.')
else:
    print('Nerozumím.')

Vida, tvoje první hra! Jen je ještě potřeba před každým spuštěním přepsat řetězec na prvním řádku. Jak zařídit, aby počítač vybíral náhodně, to si povíme později.