Cykly a vstupně-výstupní operace

V dnešním díle našeho seriálu se ještě v krátkosti podíváme na cykly v Jythonu, vstupně-výstupní operace a na spouštění Jythonovských modulů z příkazové řádky.

Cyklus for

Cyklus for je v Jythonu používán častěji než while a chová se zde zcela jinak než v Javě. Je používán pro iteraci přes sekvence.

Syntaxe je následující:

for název_proměnné in sekvece_nebo_výraz:
blok
else:
blok

 

Klausule else se chová stejně, jako v prípadě cyklu while. Následující fragmenty kódu jsou si zcela rovnocenné:

>>>for x in [1,2,3]:
... print x
...
1
2
3

>>>for x in range(1,4):
... print x
...
1
2
3
 
>>>seznam = [1,2,3]
>>>index = 0
>>>while index < len(seznam):
... print seznam[index]
... index += 1
...
1
2
3

Sdružený seznam, aneb List comprehension

Jednou z velmi často vykonávaných operací je vytváření nových seznamů ze seznamů již existujících. Takto vytvořeného nového seznamu lze dosáhnout například následující konstrukcí:

>>>seznam = ['prvni', 'druhy', 'treti']
>>>vysledek = []
>>>for x in seznam:
... vysledek.append(x + 'A')
...
>>>vysledek
['prvniA', 'druhyA', 'tretiA']

Tento příklad je přímočarý, ale je možné jej zapsat pomocí konstrukce zvané anglicky list comprehension:

[vyraz for promenna in sekvence]

 

Výše uvedený fragment je možné přepsat následovně:

>>>seznam = ['prvni', 'druhy', 'treti']
>>>[x + 'A' for x in seznam]
['prvniA', 'druhyA', 'tretiA']

Nadále budeme místo anglického termínu list comprehension používat pojem sdružený seznam.

Sdružený seznam můžeme používat všude tam, kde lze použít obyčejný seznam. Často se používá na pravé straně přiřazovacího příkazu a v cyklech for. Následující konstrukce setřídí seznam řetězců podle jejich délky:

>>>seznam = ['a', 'ab', 'abc', 'abcd']
>>>dvojice = [(-len(x), x) for x in seznam]
>>>dvojice
[(-4, 'abcd'), (-3, 'abc'), (-2, 'ab'), (-1, 'a')]
>>>setridSeznam = [x[1] for x in dvojice]
>>>setridSeznam
['abcd', 'abc', 'ab', 'a']

Konstrukci sdruženého seznamu lze rozšířit přidáním filtrovací podmínky:

[vyraz for promenna in sekvence if testovaci_podminka]

Pokud chceme setřídit seznam řetězců tak, abychom získali pouze prvky splňující určité podmínky postupujeme následovně:

>>>seznam = ['a', 'ab', 'abc', 'abcd']
>>>dvojice = [(-len(x), x) for x in seznam if len(x) >= 3]
>>>
>>>dvojice
[(-3, 'abc'), (-4, 'abcd')]
>>>
>>>setridSeznam = [x[1] for x in dvojice]
>>>setridSeznam
['abc', 'abcd']

Nyní si ukážeme nejjednodušší nástroje, které nám umožní předkládat našim programům data ke zpracování s následným zobrazením výsledků:

Vstup

Pro interaktivní zadávání údajů nám poslouží vestavěná funkce raw_input, která má následující syntaxi:

raw_input([prompt])

Tato funkce přečte ze standardního vstupu řádek, převede ho na řetězec (odřízne znaky konce řádku ‘\n'), a poskytne tento řetězec jako návratovou hodnotu. Pokud bude při volání funkce vyplněn nepovinný argument prompt, vypíše se na standardní výstup.

>>>s = raw_input("Zadejte vstupni udaje: ")
Zadejte vstupni udaje: Ahoj svete!!!
>>>
>>>s
'Ahoj svete!!!'
Výstup

Jython umožňuje tisknout výstupní hodnoty na standardní výstup prostřednictvím příkazu print, jehož nejjednodušší forma je:

	print výraz

Při vykonávání tohoto příkazu se nejprve vyhodnotí výraz a poté je tisknut na standardní výstup následovaný znakem pro novou řádku:

>>>print 3
3
>>>print 1 + 2
3
>>>print ['a', 'b']
['a', 'b']

Je možné tisknout současně i několik výrazů, pokud použijete jako oddělovač čárku:

>>>print 'Vysledek je: ', 123, ' a dalsi je: ', [1,2,3]
Vysledek je: 123 a dalsi je: [1, 2, 3]

Pokud je poslední výraz v příkazu print zakončen čárkou, nevloží se za výstup znak nové řádky:

>>>#print ukoncen novou radkou
>>>print 1; print 2
1
2
>>>#nyni se vytiskne vse na jednu radku
>>>print 1, ; print 2
1
2

Zápis programu

Až do tohoto okamžiku jsme si při předvádění vlastností jazyka Jython vystačili s interaktivním módem, který nám umožňoval vkládat jednotlivé konstrukce jazyka přímo a zároveň nám hned zobrazil výsledky našeho snažení. Tato vlastnost je výhodná tehdy, kdy vytváříme nějaký prototyp našeho programu a potřebujeme interaktivně testovat jeho chování.

Pro opětovné využití našeho kódu však tato vlastnost příliš vhodná není. Abychom mohli naše programy spouštět kdykoliv to potřebujeme, je vhodnější je ukládat do textových souborů. Na rozdíl od Javy, názvy textových souborů nejsou žádným způsobem svázány s jejich obsahem. Slouží jen jako úložiště našich zdrojových kódů. Později, až se seznámíme s dalšími koncepty jazyka Jython, ukážeme si jak tyto soubory organizovat do složitějších struktur, jako například knihoven a balíčků.

Soubor, který obsahuje zdrojový kód, se nazývá modul. Moduly jazyka Jython mají extenzi .py. Pokud chceme náš modul spustit, stačí na příkazové řádce zadat příkaz:

jython mujmodul.py

D:\Jython\Source codes>jython mujmodul.py
Vytiskne 10 cisel po sobe:
0
1
2
3
4
5
6
7
8
9
D:\Jython\Source codes>

Co se týče obsahu modulu, moduly mohou v nejjednodušším případě obsahovat spustitelný kód, který je okamžitě vykonán. Moduly většinou kromě tohoto kódu obsahují odkazy na jiné moduly, definice funkcí a tříd, které jsou pak dále využívány. Příště si ukážeme malou ukázku jednoduchého modulu, který nám spočítá nejmenšího společného dělitele dvou čísel.