Počítače sú silné v tom, že vedia tú istú činnosť zopakovať tisíckrát bez chyby. Opakovanie sa v programe zapisuje cyklom. Python má dva druhy cyklov: for – keď vieme, koľkokrát (alebo pre ktoré hodnoty) sa má niečo zopakovať, a while – keď sa má opakovať, kým platí podmienka.
Čo sa naučíš
- opakovať príkazy cyklom
fors funkciourange, - použiť cyklus
whilea vyhnúť sa nekonečnému cyklu, - počítať pomocou počítadla a akumulátora (súčet, súčin, priemer),
- predčasne ukončiť cyklus (
break) alebo preskočiť krok (continue), - písať vnorené cykly a trasovať, čo cyklus robí.
1Cyklus for a funkcia range
Výstup:
Opakovanie číslo 0
Opakovanie číslo 1
Opakovanie číslo 2
Opakovanie číslo 3
Opakovanie číslo 4
HotovoAko to funguje:
range(5)vytvorí čísla0, 1, 2, 3, 4– päť čísel, začína sa nulou a 5 už nepatrí do výsledku.- Premenná
i(riadiaca premenná cyklu) postupne nadobudne každú z týchto hodnôt. - Pre každú hodnotu sa vykoná telo cyklu – odsadený blok pod riadkom s dvojbodkou.
- Neodsadený riadok
print("Hotovo")sa vykoná až po skončení cyklu, raz.
1.1Tri podoby range
| Zápis | Čísla | Význam |
|---|---|---|
range(n) | 0, 1, …, n−1 | n čísel od nuly |
range(od, do) | od, od+1, …, do−1 | do už nepatrí |
range(od, do, krok) | od, od+krok, … | kým sme pred do |
>>> list(range(5)) [0, 1, 2, 3, 4] >>> list(range(2, 8)) [2, 3, 4, 5, 6, 7] >>> list(range(1, 11, 3)) [1, 4, 7, 10] >>> list(range(10, 0, -2)) [10, 8, 6, 4, 2] >>> list(range(5, 1)) []
(list(...) tu iba ukazuje, ktoré čísla range vytvorí.) So záporným krokom sa počíta smerom dole; ak je od už „za“ hranicou, range je prázdny a telo cyklu sa nevykoná ani raz.
1.2Riadiaca premenná v tele cyklu
Výstup:
1 na druhú je 1
2 na druhú je 4
3 na druhú je 9
4 na druhú je 16
5 na druhú je 25Ak hodnotu riadiacej premennej nepotrebuješ, zvykne sa pomenovať _:
Výstup:
Hip hip hurá!
Hip hip hurá!
Hip hip hurá!1.3Výpis do riadku
Vďaka end=" " vypíšeš hodnoty z cyklu vedľa seba. Prázdny print() po cykle ukončí riadok:
Výstup:
10 9 8 7 6 5 4 3 2 1
Štart!1.4for cez text a zoznam
Cyklus for vie prechádzať aj znaky reťazca alebo prvky zoznamu – nielen čísla z range:
Výstup:
P-y-t-h-o-n-
Ovocie: jablko
Ovocie: hruška
Ovocie: slivkaViac v témach Reťazce a Zoznamy.
2Cyklus while
Cyklus while opakuje svoje telo, kým platí podmienka. Podmienka sa testuje pred každým opakovaním; ak neplatí hneď na začiatku, telo sa nevykoná ani raz.
Výstup:
1 2 4 8 16 32 64
Prvá mocnina dvoch nad 100: 128Telo cyklu musí niečo meniť tak, aby podmienka raz prestala platiť – tu sa n zdvojnásobuje. Ak by sme riadok n = n * 2 vynechali, podmienka by platila stále a program by sa nikdy neskončil (nekonečný cyklus). Spustený program vtedy zastavíš klávesmi Ctrl + C alebo tlačidlom Stop.
2.1while so vstupom
while je ideálny, keď dopredu nevieme, koľko opakovaní bude – napríklad pri čítaní čísel, kým niekto nezadá nulu:
Výstup:
Číslo (0 = koniec): 12 Číslo (0 = koniec): 7 Číslo (0 = koniec): 30 Číslo (0 = koniec): 0 Súčet: 49
Prvé číslo načítame pred cyklom, aby mala podmienka čo testovať; ďalšie čísla čítame na konci tela cyklu.
2.2for alebo while?
- for – keď vieš, koľkokrát sa má cyklus vykonať, alebo prechádzaš prvky (čísla z
range, znaky textu, prvky zoznamu). - while – keď počet opakovaní závisí od niečoho, čo sa ukáže až počas behu (kým sa nezadá 0, kým číslo nie je 1, kým nenájdeme hľadanú hodnotu).
Každý for cyklus s range sa dá prepísať na while:
Výstup:
0 1 2 3 4 3Počítadlo a súčet
Veľmi časté úlohy v cykloch sú spočítať prvky s nejakou vlastnosťou a sčítať hodnoty. Postup je vždy rovnaký:
- pred cyklom premennú vynuluj (
pocet = 0,sucet = 0), - v cykle ju zväčšuj (
pocet += 1,sucet += x), - po cykle výsledok použi.
Výstup:
Súčet 1 až 20: 210
Párnych čísel: 10Pri súčine sa začína jednotkou, nie nulou (nula by všetko vynulovala). Príklad: faktoriál 6! = 1 · 2 · 3 · 4 · 5 · 6.
Výstup:
6! = 7203.1Priemer z načítaných čísel
Výstup:
Koľko čísel? 5 8 10 7 9 6 Priemer: 8.00
3.2Trasovanie cyklu
Pri trasovaní zapisuj hodnoty premenných po každom opakovaní. Program sucet = 0, for i in range(1, 5): sucet += i:
| opakovanie | i | sucet po kroku |
|---|---|---|
| pred cyklom | – | 0 |
| 1. | 1 | 1 |
| 2. | 2 | 3 |
| 3. | 3 | 6 |
| 4. | 4 | 10 |
4break a continue
breakcyklus okamžite ukončí – pokračuje sa prvým príkazom za cyklom.continuepreskočí zvyšok aktuálneho opakovania a pokračuje ďalším.
Výstup:
1
3
5Čísla 2 a 4 sa preskočili (continue), pri 6 cyklus skončil (break).
4.1while True a break
Častý vzor: cyklus „navždy“, ktorý sa ukončí break, keď nastane podmienka. Hodí sa, keď sa podmienka ukončenia dá otestovať až uprostred tela:
Výstup:
Heslo: ahoj Nesprávne, skús znova. Heslo: heslo Nesprávne, skús znova. Heslo: Tajne123 Prístup povolený.
4.2Hľadanie s break
Výstup:
1265Vnorené cykly
V tele cyklu môže byť ďalší cyklus. Vnútorný cyklus prebehne celý pri každom opakovaní vonkajšieho. Ak vonkajší beží 3-krát a vnútorný 4-krát, telo vnútorného sa vykoná 3 · 4 = 12-krát.
Výstup:
1 2 3 4
2 4 6 8
3 6 9 12 Takto vznikla malá tabuľka násobenia: vonkajší cyklus určuje riadok, vnútorný vypíše stĺpce jedného riadku a print() riadok ukončí.
5.1Obrazce zo znakov
Výstup:
*
**
***
****
*****Počet hviezdičiek v riadku závisí od čísla riadku. Pyramída potrebuje aj medzery pred hviezdičkami:
Výstup:
*
***
*****
*******Pri obrazcoch si najprv napíš do tabuľky, koľko medzier a znakov má mať každý riadok, a hľadaj vzťah s číslom riadku i.
6Riešené úlohy
6.1Ciferný súčet
Zadanie: Načítaj prirodzené číslo a vypíš súčet jeho cifier.
Riešenie: Poslednú cifru získame ako n % 10, potom ju „odtrhneme“ celočíselným delením n // 10. Opakujeme, kým číslo nie je 0 – počet cifier dopredu nepoznáme, preto while.
Výstup:
Číslo: 90417 Ciferný súčet: 21
n | n % 10 | sucet |
|---|---|---|
| 90417 | 7 | 7 |
| 9041 | 1 | 8 |
| 904 | 4 | 12 |
| 90 | 0 | 12 |
| 9 | 9 | 21 |
| 0 | – | koniec |
6.2Collatzova postupnosť
Zadanie: Začni od zadaného čísla. Ak je párne, vydeľ ho dvoma; ak je nepárne, vynásob ho tromi a pripočítaj 1. Opakuj, kým nedostaneš 1. Vypíš postupnosť a počet krokov.
Riešenie: Počet krokov nepoznáme, preto while n != 1. Matematici predpokladajú, že postupnosť sa vždy dostane k 1 (Collatzova hypotéza), dokázané to však zatiaľ nie je.
Výstup:
Začiatok: 6 6 3 10 5 16 8 4 2 1 Počet krokov: 8
6.3Prevod do dvojkovej sústavy
Zadanie: Načítaj prirodzené číslo a vypíš ho v dvojkovej sústave.
Riešenie: Číslo opakovane delíme dvoma a zapisujeme zvyšky. Zvyšky čítané odzadu tvoria zápis v dvojkovej sústave, preto každú novú cifru pridáme na začiatok textu.
Výstup:
Číslo: 13 1101
Kontrola: 1101₂ = 8 + 4 + 0 + 1 = 13. Python to vie aj sám: bin(13) je '0b1101'.
6.4Fibonacciho postupnosť
Zadanie: Vypíš prvých 12 členov Fibonacciho postupnosti: 1, 1, 2, 3, 5, 8, … (každý ďalší člen je súčtom dvoch predchádzajúcich).
Riešenie: Pamätáme si posledné dva členy a a b. V každom kroku vypíšeme a a posunieme sa: nové a je staré b, nové b je súčet. Zápis a, b = b, a + b vypočíta pravú stranu celú naraz, takže sa stará hodnota a nestratí.
Výstup:
1 1 2 3 5 8 13 21 34 55 89 144 6.5Hádanie čísla
Zadanie: Počítač si myslí číslo od 1 do 100. Ty hádaš a program odpovedá „viac“ alebo „menej“, kým neuhádneš. Na konci vypíše počet pokusov.
Riešenie: Náhodné číslo vyberie funkcia random.randint (téma Modulárny program). Pre ukážku je nastavené random.seed, aby bol príklad zakaždým rovnaký – v hre to nerob. Počet pokusov nepoznáme, preto while.
Výstup:
Tvoj tip: 50 Menej. Tvoj tip: 25 Viac. Tvoj tip: 37 Viac. Tvoj tip: 43 Menej. Tvoj tip: 40 Viac. Tvoj tip: 42 Uhádnuté na 6 pokusov!
6.6Prvočísla do n
Zadanie: Vypíš všetky prvočísla menšie ako 50.
Riešenie: Prvočíslo je číslo väčšie ako 1, ktoré je deliteľné iba 1 a sebou samým. Pre každé číslo spočítame jeho delitele od 2 po n − 1; vnútorný cyklus ukončíme break, len čo nájdeme prvého delitela.
Výstup:
2 3 5 7 11 13 17 19 23 29 31 37 41 43 47 Premenná prvocislo je príznak (flag): na začiatku predpokladáme, že číslo je prvočíslo, a ak nájdeme delitela, príznak zmeníme. Rýchlejší test (stačí skúšať delitele po odmocninu) je v téme Algoritmy.
7Časté chyby
- Chyba „o jednu“:
range(1, n)končí prin − 1. Pre čísla od 1 do n vrátane použirange(1, n + 1). - Nekonečný while: v tele cyklu sa nemení premenná z podmienky (alebo sa mení zlým smerom).
- Zlé odsadenie: príkaz, ktorý patrí za cyklus, je odsadený – vykoná sa pri každom opakovaní. Alebo naopak: príkaz, ktorý má byť v cykle, odsadený nie je.
- Vynulovanie v cykle:
sucet = 0napísané vo vnútri cyklu vynuluje súčet pri každom opakovaní. Patrí pred cyklus. - Zmena riadiacej premennej vo for: priradenie do
iv tele cyklu nezmení, ktorá hodnota príde v ďalšom kroku –forsi ju vezme zrange.
Výstup:
i = 0
i = 1
i = 2Zhrnutie
for i in range(...):range(n)je 0 až n−1,range(od, do)končí preddo, tretí argument je krok (aj záporný).while podmienka:– opakuje, kým podmienka platí; telo musí podmienku raz „pokaziť“.forpre známy počet alebo prechádzanie prvkov;whilepre neznámy počet opakovaní.- Počítadlo a súčet: vynulovať pred cyklom, zväčšovať v cykle; súčin začína od 1.
breakukončí cyklus,continuepreskočí zvyšok kroku;while True+breakje bežný vzor.- Vnorený cyklus prebehne celý pri každom kroku vonkajšieho.
Úlohy na precvičenie
- Vypíš násobky čísla 7 menšie ako 100 do jedného riadku.
- Načítaj n a vypíš súčet 1² + 2² + … + n².
- Načítavaj čísla, kým nepríde záporné; potom vypíš najväčšie z nich a ich počet.
- Vypíš celú malú násobilku (10 × 10) zarovnanú do stĺpcov.
- Načítaj číslo a vypíš počet jeho cifier (bez prevodu na text).
- Vypíš „obrátenú“ pyramídu z hviezdičiek s n riadkami.