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:
a and b
- je-li a
nepravdivé, vrací a
,
jinak vrací b
a or b
- je-li a
pravdivé, vrací a
,
jinak vrací b
not a
- je-li a
pravdivé, vrací 0, jinak 1
>>> 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.
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.