Další Předchozí Obsah

8. Logické výrazy a operátory

8.1 Logické hodnoty

Pozorný čtenář si všiml, že jsem se nikde nezmínil o ekvivalentu typu boolean z ukecaných jazyků.

Nepravdivou pravdivostní hodnotě v Pythonu odpovídá None, nula, prázdný řetězec, sekvence či n-tice s žádnými položkami či slovník, který nic neobsahuje. Všechno ostatní je považováno za pravdivé. Všechny logické operátory (s výjimkou and a or) a logické funkce vrací 0 nebo 1.

Budiž a, b objekty (objekt je jakýkoliv datový typ). Potom je možné použít operátory:

>>> 2 or 4
2
>>> 2 and 4
4
>>> 2 | 4   # bitový operátor, ne logický
0
>>> 2 & 4
0
>>> 'velbloud' and 'hroznys'
'hroznys'
>>> 'hroznys' or 'velbloud'
'hroznys'
>>> '' or ":-)"
':-)'
>>> 3 and '5'
'5'

To, že Python umožňuje používat operátory and a or ``humusným způsobem'' neznamená, že je toho nutné využívat. Jsou ale situace, kdy se to může hodit a při inteligentním použití program neztratí čitelnost.

8.2 Porovnávání objektů

Pro porovnávání objektů slouží operátory <, <=, >=, >, ==, <>, !=. (Operátory <> a != mají ten samý význam, autor jazyka se nemohl rozhodnout mezi syntaxí jazyka ABC a C. :-) Operátory vrací 1 nebo 0.

Porovnávání numerických objektů funguje tak, jak by člověk čekal, numerické objekty jsou před porovnáváním (koerce) na vyšší typ. Výjimku tvoří komplexní čísla, ta jsou porovnávána nejprve podle reálné a poté podle imaginární složky.

>>> 2 > 2.5
0
>>> 2 > 2j 
1
>>> 2L > 2        
0
>>> 2L < 2
0

Pokud jsou porovnávány struktury stejného typu, jsou porovnávány lexikograficky, tj. výsledek porovnávání rozhoduje první odlišná položka. Položky za koncem struktury mají nekonečně malou hodnotu, dostaneme-li se při porovnávání až na konec kratší struktury, tak delší struktura je větší.

Jsou-li porovnávány objekty různého typu, jsou porovnávány lexikograficky podle anglických názvů typů: list < string < tuple.

Jak je to s porovnáváním slovníků nevím, nenapadá mne, k čemu by to mohlo být dobré. :-) V dokumentaci je poznámka o tom, že objekty jsou uspořádávány konzistentně, tj.relace uspořádání je tranzitivní.

Při porovnávání je možné ``zřetězit'' porovnávací operátory do jednoho dlouhého výrazu. Místo x < y and y <= z je možné psát x < y <= z. Rozdíl je v tom, že při běhu programu se v druhém případě hodnota y vyčísluje pouze jednou. Ve většině programů to nevadí (či je to dokonce kladná vlastnost) a proto druhou variantu směle používejte.

ADVANCED: Je možné použít i konstrukci x < y > z. Zřetězené porovnávání se vyhodnocuje zleva doprava po jednotlivých operátorech, končí se u prvního operátoru, který nevyjadřuje pravdivou hodnotu. Výrazy, které nejsou potřeba, nejsou vyhodnocovány.


Další Předchozí Obsah