Uživatelské nástroje

Nástroje pro tento web


prog:cyklus_for

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.

1)
pro kladný krok jsou členy posloupnosti menší než koncová mez, pro záporný krok větší než mez
2)
např. pro procházení jednotlivých znaků v řetězci, aj.
prog/cyklus_for.txt · Poslední úprava: 13.11.2017 19:12 autor: Ivana Stefanová