Funkce range a cyklus for
Již dříve jsme se seznámili s tím, jak opakovaně provádět nějaký blok příkazů pomocí cyklu s klíčovým slovem while
. Často je již dopředu zřejmé, kolikrát se cyklus vykoná (tj. počet opakování není závislý na průběhu zpracování dat v těle cyklu). Často v takových případech můžeme s výhodou použít zjednodušený zápis pomocí klíčového slova for
, nejprve se však seznámíme s funkcí range
.
Funkce range
Již v několika příkladech jsme potkali situaci, ve které cyklus probíhal pro celá čísla v nějakém intervalu. Funkce range
slouží k vytvoření takové skupiny celých čísel, která je s výhodou využita právě ve for
cyklech. Její chování se liší v závislosti na počtu vstupních argumentů (všechny musí být typu int
).
# range s jedním argumentem range(5) # skupina 5 čísel začínající 0, tj. 0, 1, 2, 3, 4 range(-2) # prázdná skupina # range s dvěma argumenty (volíme si počátek posloupnosti) range(1, 8) # čísla začínají 1 a pokračují, dokud se nedosáhne 8 # POZOR: koncové číslo 8 již do skupiny nepatří!, # tj. skupinu tvoří 1, 2, 3, 4, 5, 6, 7 range(3, 3) # prázdná skupina # range s třemi argumenty (nejobecnější, s volitelným krokem) range(1, 8, 2) # začneme s 1 a pokračujeme do dosažení 8 s krokem 2 # tj. skupinu tvoří 1, 3, 5, 7 range(1, -8, -2) # krok může být záporný, tj. posloupnost je klesající # a skupinu tvoří 1, -1, -3, -5, -7
Obecně lze konstatovat, že funkce range
vytvoří skupinu čísel, které tvoří členy aritmetické posloupnosti s daným počátkem, krokem a které nedosáhnou koncové meze1). Ještě jednou upozorňuji, že koncová mez do vytvořené skupiny čísel nepatří! Je-li krok 1, pak počet čísel skupiny je dán rozdílem horní a dolní meze (přímo horní mezí v případě volání s jedním argumentem).
Výhodou funkce range
je skutečnost, že skupina čísel se vytváří postupně (jedno číslo před každým vstupem do těla cyklu), takže při range(1000)
není potřeba paměť pro uložení 1000 hodnot typu int
.
Cyklus for
Nyní již můžeme typický cyklus nám již dobře známé formy
i = 0 # inicializace řídicí proměnné cyklu while i < 10: # nějaké příkazy, které mohou využívat proměnnou i, # ale nemění její hodnotu, např. print(i) # cyklus proběhne 10x, pro i = 0, 1, ..., 9 i = i + 1 # inkrementace řídicí proměnné cyklu
přepsat beze změny funkčnosti do tvaru
for i in range(10): # nějaké příkazy, které mohou využívat proměnnou i, # ale nemění její hodnotu, např. print(i) # cyklus proběhne 10x, pro i = 0, 1, ..., 9
Druhá podoba je kompaktnější a přehlednější, neboť se obejde bez explicitních operací s řídicí proměnnou cyklu i
. Skládá se z klíčových slov for
a in
, definice řídicí proměnné a skupiny hodnot (zde reprezentované funkcí range
), kterých řídicí proměnná postupně nabývá před vstupem do těla cyklu . Později uvidíme využití for
cyklů v dalších situacích2).
Uvedeme si alespoň jeden úplný příklad, v němž využijeme nově nabyté znalosti.
- rozklad.py
# rozklad zadaného čísla na součet 3 přirozených čísel # program vypíše všechny možné rozklady a jejich počet cislo = int(input('Zadej přirozené číslo: ')) moznosti = 0 # počítadlo # první člen rozkladu for cislo1 in range(1, cislo - 1): # druhý člen rozkladu for cislo2 in range(1, cislo - cislo1): # třetí člen je dopočítán cislo3 = cislo - cislo1 - cislo2 # výpis rozkladu print(cislo, '=', cislo1, '+', cislo2, '+', cislo3) moznosti = moznosti + 1 # aktualizace počítadla # výpis počtu možností print('Počet možných rozkladů čísla', cislo, ':', moznosti)
Stejně jako u cyklu while
je možné využít break
k předčasnému ukončení cyklu, program pokračuje prvním příkazem za cyklem. I v tomto případě lze využít závěrečný blok za else
.
Je třeba si uvědomit, že v řadě dalších situací for
cyklus použít nemůžeme. Takové případy řešíme pomocí cyklu s while
, který je obecnější a nemůžeme na něj tedy zapomenout.