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