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:
... 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.
... 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
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.
>>> 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.
>>> for k, v in knights.items():
... print(k, v)
...
gallahad the pure
robin the brave
Cyklus while
telo bloku
telo bloku
Cyklus while
provádí blok za dvojtečkou tak dlouho, dokud
je podmínka pravdivá.
>>> 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
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ě).
>>> if a > 0: # podmínka nevyhoví, else blok neexistuje => nic se neprovede
... print('a je větší jak 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
>>>
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
.
... 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
.
>>> 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