Bloky a cykly

Bloky

Bloky slouží k seskupení příkazů, například uvnitř cyklů, funkcí, objektů, struktur atd.

V programovacím jazyku Pascalu jsou bloky označeny slovy BEGIN a END, v jazyce C slouží pro vytváření bloků špičaté závorky {}. V Pythonu se pro vytváření bloků používá odsazování (ano, čtete dobře, o d s a z o v á n í).

Nový blok vytvoříte tak, že napíšete na začátku řádků před příkazy, které spolu tvoří blok, libovolný počet mezer nebo tabulátorů. Ale před všemi příkazy v bloku musí být stejný počet mezer a tabulátorů! Odsadíte-li o mezeru více, nebo pokud místo tabulátoru použijete mezery, začnete tím jiný blok. Pokud vytvoříte nový blok na místě, kde nemá být, skončí program s chybou.

Zdá se vám to zmatené? Chování bloků ukáži na cyklu for, který jsem již několikrát použil v předchozích kapitolách.

Zkuste si v Pythonu z příkazové řádky v interkativním řežimu:

>>> for i in range(2): # žádné odsazování u prvního bloku
...         print('a')          # odsazení o 8 mezer (počet mezer/tabulátorů je zcela libovolný)
...         print('b')          # odsazení o 8 mezer (počet mezer/tabulátorů musí být stejný jako v předchozím řádku
...                             # Entrem ukončíte blok, cyklus for se vykoná
a
b
a
b

Osum mezer a jeden tabulátor mohou vypadat stejně, ale Python to bere jako různé odsazení! V příkazové řádce se vám nemusí podařit tabulátor zadat, ale při psaní zdrojáků do souboru už může dojít ke zmatení mezer a tabulátorů snadno. Bacha na to!

Pokud používáte prostředí IDLE, pak za vás odsazuje samo a nemusíte se o nic starat. IDLE také nezobrazuje tři tečky na začátku bloku, jako python v konzoli.

Doporučuji pro vytváření bloku používat jeden způsob odsazování (např. jeden tabulátor) a toho se držet při psaní všech programů. Některé oditory zaměňují tabulátory za mezery, jiné ne, ale pamatujte, že Python mezi mezerami a tabulátory rozlišuje.

Nyní trochu složitější konstrukce – vnořený cyklus. Bude potřeba vnořený blok, neboli blok druhé úrovně. Vnořený blok musí odsazovat na začátku stejně jako jeho nadřazený blok, plus vlastní odsazení mezerami a tabulátory.

>>> for i in range(2):
...     print('cyklus %i' % i)              # odsazeni 4 mezery, print() po staru
...     for j in range(2):                  # odsazeni 4 mezery
...             print('a',end=",")          # odsazeni 4 + 8 mezer
...             print('b',end=",")          # odsazeni 4 + 8 mezer
...     print('\nkonec cyklu {}'.format(i)) # odsazeni 4 mezery, print() po novu
...
cyklus 0
a,b,a,b,
konec cyklu 0
cyklus 1
a,b,a,b,
konec cyklu 1
 

Cykly - koření každého programovacího jazyka

Cyklus for

for i in seznam:
     telo bloku
     telo bloku

Cyklus for prochází jednotlivé položky seznamu, n-tice, řetězce, slovníku, nebo čehokoliv iterovatelného, co je uvedeno za klíčovým slovem in.
Položky iterovatelného objektu se postupně ukládájí do proměnné uvedené za klíčovým slovem for a provede se s nimi tělo bloku, který začíná za dvojtečkou.

Iterovaný objekt není bezpečné během cyklu měnit. Pokud byste přeci jen potřebovali nějak iterovatelný objekt měnit, iterujte přes jeho kopii (vytvořenou například pomocí slice [:]).

V příkladu odstraňuji ze slovníku všechna celá čísla.

>>> all = ['a',1,3,'b',5.0, 4,'c']
>>> for i in all[:]:
...     if type(i) == type(0):
...         del all[all.index(i)]
...
>>> all
['a', 'b', 5.0, 'c']

Cyklus for s výhodou využívá funkce range().

A ještě ukázka cyklu for se slovníkem.

>>> knights = {'gallahad': 'the pure', 'robin': 'the brave'}
>>> for k, v in knights.items():
...     print(k, v)
...
gallahad the pure
robin the brave

Cyklus while

while podminka:
        telo bloku
        telo bloku

Cyklus while provádí blok za dvojtečkou tak dlouho, dokud je podmínka pravdivá.

>>> i = 5
>>> j = 0
>>> while j < i:
...       print(j)
...       j += 1
...
0
1
2
3
4

Větvení programu pomocí if, elif a else

if podmnika:
             telo bloku
             telo bloku
elif podmnika:
             telo bloku
elif podmnika:
             telo bloku
else:
             telo bloku

Ani zde nejde pro skušeného programátora o žádné překvapení.
Bloky elif a else jsou nepovinné.
Blok else může být jen jeden a je vždy na konci.

Provede se pouze ten blok, který je před první pravdivou podmínkou, nebo blok else (pokud existuje samozřejmě).

>>> a = 0
>>> if a > 0:         # podmínka nevyhoví, else blok neexistuje => nic se neprovede
...     print('a je větší jak 0')
...
>>>
>>> if a > 0:
...     print('a je větší jak 0')
... elif a < 0:
...     print('a je menší jak 0')
... else:
...     print('a je 0')
...
a je 0
>>>
Python neumí větvit program pomocí switch – case, jak je to běžné v jiných programovacích jazycích.

Příkazy break, continue a else

Příkaz break způsobí ukončení cyklu, zatímco příkaz continue způsobí ukončení aktuální iterace (zbytek bloku těla cyklu se neprovede, ale cyklus pokračuje následující iterací, jako by byl správně ukončen).

Příkazy break i continue se používají v cyklech for i while.

>>> for i in range(1000):
...     if i % 3 == 0:
...         print('hups')
...         continue
...     if i > 10:
...         print('konec')
...         break;
...     print(i)
...
hups
1
2
hups
4
5
hups
7
8
hups
10
konec

Nejen if má své else. Cykly mohou mít v Pythonu else také. Příkaz break se často používá v případě, že se během cyklu našlo to, co se hledalo. Příkaz else se tak využívá v případech, kdy se nic nenašlo, přesněji řešeno v případech, kdy cyklus nebyl ukončen pomocí break.

>>> all = [1, 2, 3 ,4, 5]
>>> for i in all:
...     if i == 100:
...         print('Hurra, je tu 100')
...         break
...     else:                 # Kdyby byl potreba blok else pro if, tak je tu.
...         pass              # Neni potreba :-)
... else:                     # else cyklu for - je odsazene stejne jako for
...     print('Sto nenalezeno')
...
Sto nenalezeno
Příkaz pass nedělá nic.
Komentář Hlášení chyby
Created: 11.9.2005
Last updated: 30.8.2015
Tato stánka používá ke svému běhu cookies, díky kterým je možné monitorovat, co tu provádíte (ne že bych to bez cookies nezvládl). Také vás tu bude špehovat google analytics. Jestli si myslíte, že je to problém, vypněte si cookies ve vašem prohlížeči, nebo odejděte a už se nevracejte :-). Prohlížením tohoto webu souhlasíte s používáním cookies. Dozvědět se více..