Logické výrazy, aneb co je pravda a co lež

Než se podíváme na problematiku příkazů pro řízení běhu programu, prodiskutujme otázku logických výrazů v Jythonu. Jython neobsahuje vestavěný datový typ, analogický typu Boolean v Javě. Otázku Co je pravda a co je lež? vyřešili autoři Jythonu následovně.

Bylo stanoveno, že jako nepravda (false) budou chápany následující hodnoty:

None
číslo 0
prázdný řetězec ... ""
prázdný seznam ... []
prázdné tuple ... ()
prázdné asociativní pole ... {}

Pokud budeme používat javovské třídy Vector, Hashtable, HashMap, Dictionary, List, Map, Collection, pak jejich prázdné objekty budou vyhodnocovány také jako nepravda.

Jakékoliv jiné hodnoty jsou považovány za pravdivé, tj. mají pravdivostní hodnotu pravda.

Logické výrazy se vyhodnocují obdobně jako v Javě, tj. využívá se zkrácené vyhodnocování. Návratové hodnoty logických výrazů jsou však poněkud odlišné od toho, na co jsme zvyklí. Návratová hodnota logických výrazů je rovna hodnotě posledního vyhodnoceného argumentu v logickém výrazu:

>>> '' and 'ona'
''
>>> 
>>> 'ja' and 'ona'
'ona'

>>> '' or 'ja'
'ja'
>>> 
>>> 'ona' or 'ja'
'ona'

Příkazy a řízení běhu programu

V této části se budeme nejprve zabývat jednoduchými příkazy a pak příkazy, které v sobě obsahují příkazy jiné. Těm se říká strukturované příkazy a slouží k podmíněnému či opakovanému provádění jednotlivých částí programu. I když základní konstrukce větvení a cyklů jsou si v jednotlivých programovacích jazycích podobné, každý jazyk se vyznačuje svou vlastní implementací. Pro programátory v Javě, kteří chtějí psát programy v Jythonu se některé konstrukce budou zdát známé, ale v určitých detailech se budou odlišovat od toho co již znají.

Jednoduché příkazy

Jednoduché příkazy můžeme zapsat na jednu logickou řádku. Často se pletou s vestavěnými funkcemi Jythonu, přestože určitý rozdíl tady je. Příkazy jsou součástí syntaxe jazyka, funkce jsou pak datové objekty definované uvnitř jmenného prostoru.

Následující sekce obsahuje seznam jednoduchých příkazů a popis jejich syntaxe.

Přiřazovací příkaz

Přiřazovací příkaz v Jythonu má podobnou syntaxi jako v Javě:

proměnná = výraz

Např.:

x = 1
Můžete dokonce použít i zápis,
x = y = 0

který přiřadí 0 oběma proměnným, x i y.

Je však rozdíl mezi Jythonem a Javou. Přiřazovací příkaz v Jythonu je příkazem a nikoliv jako v Javě výrazem. To znamená, že přiřazení nevrací hodnotu.

Význam přiřazovacího příkazu spočívá v tom, že se proměnné na levé straně příkazu přiřadí odkaz na aktuální hodnotu výrazu uvedeného na pravé straně. Proměnná obsahuje odkaz na hodnotu a nikoliv hodnotu samu. Při vykonávaní přířazovacího příkazu se vytvoří vazba mezi názvem proměnné na levé straně příkazu a hodnotou, která vznikla jako výsledek vyhodnocení výrazu na pravé straně. To platí pro všechny hodnoty, tedy i pro číselné hodnoty. Jython je plně objektově orientovaný nástroj. Neexistují v něm primitivní datové typy jako v Javě.

Níže uvedené ukázky obsahují validní přiřazovací příkazy:

x = 1
mujSeznam = [1,3,5]
mujSeznam[1] = 10
pole = {1:'jedna', 2: 'dva'}
jinySeznam = [123]

Přiřazovací příkaz v Jythonu se vyznačuje zajímavou vlastností. Dovede přiřadit obsah jedné sekvence do druhé sekvence. Jinými slovy, pokud obě strany přiřazovacího příkazu obsahují sekvence téže délky, hodnoty na pravé straně jsou přiřazeny do proměnných na levé straně:

>>> (a, b, c, d) = (1, 2, 3, 4)
>>> 
>>> a
1
>>> b
2
>>> c
3
>>> d
4
>>> 

>>> (a, b, c, d) = range(1, 5)
>>> a
1
>>> b
2
>>> c
3
>>> d
4

Tomuto přiřazení se také říká rozbalovací přiřazení (anglicky unpacking assignment). Tato vlastnost přiřazovacího příkazu je použitelná pro všechny typy sekvencí (tj. jak pro tuple, tak pro seznamy):

>>> (a, b) = [11, 22]
>>> a
11
>>> b
22

>>> [a, b] = [100, 200]
>>> a
100
>>> b
200

V Jythonu je možné používat i následující zápis, kdy na levé i pravé straně budeme mít tuple, ale bez závorek:

>>> x, y, z = 1, 5, 10
>>> x
1
>>> y
5
>>> z
10

Jython podporuje i široké spektrum přiřazovacích operátorů typu: +=, -=, *=, /= .... s podobnou funkcionalitou jako v Javě:

>>> x = 0
>>> x += 5      #prida 5 do x
>>> 
>>> x
5

Mezi chováním =  a  +=, -=, ... je však určitý rozdíl, který může být za určitých okolností významný:

>>> a = [1]
>>> b = a
>>> a = a + [2]
>>> 
>>> a
[1, 2]
>>> b
[1]
>>> 

>>> 
>>> a = [1]
>>> b = a
>>> a += [2]
>>> 
>>> a
[1, 2]
>>> b
[1, 2]

V případě klasického přiřazení se vždy na pravé straně vytvoří nový objekt reprezentující vypočtenou hodnotu, a proměnné na levé straně se přiřadí odkaz na tento objekt. Zatím co v případě přiřazení typu += , pokud je na pravé straně nekonstantní datový typ (např. seznam), je jeho hodnota změněna uvnitř tohoto objektu, tj. proměnná na levé straně obsahuje referenci na týž objekt jako před provedením příkazu.

Assert

Příkaz assert testuje, zda výraz je pravdivý či nepravdivý. Pokud je nepravdivý, vyvolá výjimku. Pokud se v příkazu vyskytnou dva výrazy, je druhý výraz použit jako argument vyvolané výjimky.

Syntaxe:

assert vyraz[, vyraz]
>>> isDatabaseOpen = 0
>>> assert isDatabaseOpen, "Database neni otevrena"
Traceback (innermost last):
  File "<console>", line 1, in ?
AssertionError: Database neni otevrena