Pravdivostní operátory and
a or
v Python'u používají zkrácené vyhodnocování, tzn. že je-li možné určit hodnotu výrazu po vyhodnocení jeho prvního operandu, druhý operand není vůbec uvažován. Souhrnně tedy platí:
x or y
:
je-li x
nepravdivé, vrať y
, jinak vrať x
x and y
:
je-li x
pravdivé, vrať y
, jinak vrať x
Algoritmus vyhodnocování je vskutku takovýto – tyto operace vrací právě jeden ze svých operandů, nikoli booleovskou hodnotu (ale viz následující slajd):
K dispozici je samozřejmě i operátor negace not
. Má vyšší prioritu než and
a to má zase vyšší prioritu než or
.
Jelikož prakticky všechny ostatní operátory mají prioritu vyšší než operátory pravdivostní, tak je závorkování nejen dobrým nápadem pro lepší čitelnost.
Ačkoli je kvůli čitelnosti dobrým zvykem vypisovat podmínky v plné formě, často můžeme využít toho, že libovolný objekt v Python'u (tedy prakticky cokoliv) je možno testovat na pravdivostní hodnotu. Přitom následující hodnoty jsou pokládány za False
, cokoliv jiného za True
:
None
False
0
, 0.0
, 0j
)
''
, ()
, []
)
{}
)
__bool__
, resp. __len__
, vrací-li tato metoda boolovské False
, resp. celočíselnou 0
Poznámka 1: Python sám od sebe vrací ve většině případů pravdivostní hodnoty ve formě True/False
, resp. 1/0
. Specifickou výjimkou jsou booleovské operace or
a and
, které vrací jeden ze svých argumentů (viz předchozí slajd).
Poznámka 2: Pozor na neprázdné objekty plné False hodnot – třebas taková n-tice (False, [])
se už vyhodnotí jako True, protože není prázdná (obsahuje dokonce dva prvky)!
Jako vestavěný typ (byť tedy vlastně spíš podtyp celých čísel) mají pravdivostní hodnoty svůj vlastní konstruktor bool()
, který umí jemu zadaný parametr explicitně vyhodnotit a převést na True
/False
.
Sám o sobě vrací False (asi v konzistenci s „nulovou/prázdnou výchozí hodnotou“ u ostatních typů)..
..ale jinak to, co by člověk se znalostí předchozího slajdu očekával:
K dispozici je standardní sada porovnávacích operátorů: < <= > >= == !=
<>
.
Sekvenční typy se porovnávají lexikograficky a rekurzivně, tzn. prvek po prvku a je-li prvek neatomický typ, porovná se stejným způsobem. Je tedy jasné, že například u porovnávání seznamů musí prvky na stejných místech být porovnatelného typu a že porovnávání skončí na prvním (atomickém) prvku, který rozhodne o výsledku:
Pro objekty máme navíc k dispozici test jejich (ne)identity is
a is not
:
Více jmen pro stejný objekt:
Více jmen pro různé objekty:
Pro sekvenční typy je v Python'u ještě dvojce operátorů zjišťujících (ne)výskyt hodnoty v sekvenci in
a not in
:
∈
a ∉
).
Tabulka je seřazena od nejvyšší priority k nejnižší, tj. např. operátory porovnávání mají vyšší prioritu než logické operátory:
operátor | popis |
---|---|
(expressions...), [expressions...], {key:datum...}
|
„výroba“ nebo zobrazení n-tice, zobrazení seznamu či slovníku |
x[index], x[index:index], x(arguments...), x.attribute
|
hodnota, výřez, volání, odkaz na atribut |
**
|
umocňování |
-x +x ~x
|
unární minus a plus, bitové NOT |
* / // %
|
násobení, dělení, modulo |
+ -
|
sčítání, odčítání |
<< >>
|
levý a pravý posun |
&
|
bitové AND |
^
|
bitové XOR |
|
|
bitové OR |
in, not in, is, is not, <, <=, >, >=, !=, ==
|
test na přítomnost hodnoty v sekvenci, test na identitu objektů, porovnávání |
not
|
booleovské NOT |
and
|
booleovské AND |
or
|
booleovské OR |
lambda
|
lambda-výraz |