Kromě cyklu for
máme ještě druhý typ cyklu uvozený příkazem while
(angl. dokud).
Na rozdíl od for
, kde předem známe počet opakování,
se while používá, když cyklus závisí na nějaké podmínce.
Tělo cyklu se opakuje, dokud je podmínka splněna. Například:
odpoved = input('Řekni Ááá! ')
while odpoved != 'Ááá':
print('Špatně, zkus to znovu')
odpoved = input('Řekni Ááá! ')
Ale pozor! Je velice jednoduché napsat cyklus, jehož podmínka bude splněna vždycky. Takový cyklus se bude opakovat donekonečna.
from random import randrange
while True:
print('Číslo je', randrange(10000))
print('(Počkej, než se počítač unaví...)')
Program se dá přerušit zmáčknutím Ctrl+C.
Tahle klávesová zkratka vyvolá v programu chybu a program se – jako po každé chybě – ukončí.
A nakonec, existuje příkaz break
, který z cyklu „vyskočí“:
začnou se hned vykonávat příkazy za cyklem.
while True:
odpoved = input('Řekni Ááá! ')
if odpoved == 'Ááá':
print('Bééé')
break
print('Špatně, zkus to znovu')
print('Hotovo, ani to nebolelo.')
Příkaz break
se dá použít jenom v cyklu (while
nebo for
)
a pokud máme víc cyklů zanořených v sobě, vyskočí jen z toho vnitřního.
for i in range(10): # Vnější cyklus
for j in range(10): # Vnitřní cyklus
print(j * i, end=' ')
if i <= j:
break
print()
Ale zpátky k while
!
Dokážeš napsat tenhle program?
{ "data": { "sessionMaterial": { "id": "session-material:2019/plzen-podzim-2019:loops:2", "title": "Cyklus While", "html": "\n \n \n\n <h1>While</h1>\n<p>Kromě cyklu <code>for</code> máme ještě druhý typ cyklu uvozený příkazem <code>while</code>\n(angl. <em>dokud</em>).\nNa rozdíl od <code>for</code>, kde <em>předem známe počet opakování</em>,\nse while používá, když cyklus závisí na nějaké podmínce.\nTělo cyklu se opakuje, dokud je podmínka splněna. Například:</p>\n<div class=\"highlight\"><pre><span></span><span class=\"n\">odpoved</span> <span class=\"o\">=</span> <span class=\"nb\">input</span><span class=\"p\">(</span><span class=\"s1\">'Řekni Ááá! '</span><span class=\"p\">)</span>\n<span class=\"k\">while</span> <span class=\"n\">odpoved</span> <span class=\"o\">!=</span> <span class=\"s1\">'Ááá'</span><span class=\"p\">:</span>\n <span class=\"k\">print</span><span class=\"p\">(</span><span class=\"s1\">'Špatně, zkus to znovu'</span><span class=\"p\">)</span>\n <span class=\"n\">odpoved</span> <span class=\"o\">=</span> <span class=\"nb\">input</span><span class=\"p\">(</span><span class=\"s1\">'Řekni Ááá! '</span><span class=\"p\">)</span>\n</pre></div><p>Ale pozor! Je velice jednoduché napsat cyklus,\njehož podmínka bude splněna vždycky.\nTakový cyklus se bude opakovat donekonečna.</p>\n<div class=\"highlight\"><pre><span></span><span class=\"kn\">from</span> <span class=\"nn\">random</span> <span class=\"kn\">import</span> <span class=\"n\">randrange</span>\n\n<span class=\"k\">while</span> <span class=\"bp\">True</span><span class=\"p\">:</span>\n <span class=\"k\">print</span><span class=\"p\">(</span><span class=\"s1\">'Číslo je'</span><span class=\"p\">,</span> <span class=\"n\">randrange</span><span class=\"p\">(</span><span class=\"mi\">10000</span><span class=\"p\">))</span>\n <span class=\"k\">print</span><span class=\"p\">(</span><span class=\"s1\">'(Počkej, než se počítač unaví...)'</span><span class=\"p\">)</span>\n</pre></div><p>Program se dá přerušit zmáčknutím\n<kbd>Ctrl</kbd>+<kbd>C</kbd>.</p>\n<div class=\"admonition note\"><p>Tahle klávesová zkratka vyvolá v programu chybu\na program se – jako po každé chybě – ukončí.</p>\n</div><p>A nakonec, existuje příkaz <code>break</code>, který z cyklu „vyskočí“:\nzačnou se hned vykonávat příkazy za cyklem.</p>\n<div class=\"highlight\"><pre><span></span><span class=\"k\">while</span> <span class=\"bp\">True</span><span class=\"p\">:</span>\n <span class=\"n\">odpoved</span> <span class=\"o\">=</span> <span class=\"nb\">input</span><span class=\"p\">(</span><span class=\"s1\">'Řekni Ááá! '</span><span class=\"p\">)</span>\n <span class=\"k\">if</span> <span class=\"n\">odpoved</span> <span class=\"o\">==</span> <span class=\"s1\">'Ááá'</span><span class=\"p\">:</span>\n <span class=\"k\">print</span><span class=\"p\">(</span><span class=\"s1\">'Bééé'</span><span class=\"p\">)</span>\n <span class=\"k\">break</span>\n <span class=\"k\">print</span><span class=\"p\">(</span><span class=\"s1\">'Špatně, zkus to znovu'</span><span class=\"p\">)</span>\n\n<span class=\"k\">print</span><span class=\"p\">(</span><span class=\"s1\">'Hotovo, ani to nebolelo.'</span><span class=\"p\">)</span>\n</pre></div><p>Příkaz <code>break</code> se dá použít jenom v cyklu (<code>while</code> nebo <code>for</code>)\na pokud máme víc cyklů zanořených v sobě, vyskočí jen z toho vnitřního.</p>\n<div class=\"highlight\"><pre><span></span><span class=\"k\">for</span> <span class=\"n\">i</span> <span class=\"ow\">in</span> <span class=\"nb\">range</span><span class=\"p\">(</span><span class=\"mi\">10</span><span class=\"p\">):</span> <span class=\"c1\"># Vnější cyklus</span>\n <span class=\"k\">for</span> <span class=\"n\">j</span> <span class=\"ow\">in</span> <span class=\"nb\">range</span><span class=\"p\">(</span><span class=\"mi\">10</span><span class=\"p\">):</span> <span class=\"c1\"># Vnitřní cyklus</span>\n <span class=\"k\">print</span><span class=\"p\">(</span><span class=\"n\">j</span> <span class=\"o\">*</span> <span class=\"n\">i</span><span class=\"p\">,</span> <span class=\"n\">end</span><span class=\"o\">=</span><span class=\"s1\">' '</span><span class=\"p\">)</span>\n <span class=\"k\">if</span> <span class=\"n\">i</span> <span class=\"o\"><=</span> <span class=\"n\">j</span><span class=\"p\">:</span>\n <span class=\"k\">break</span>\n <span class=\"k\">print</span><span class=\"p\">()</span>\n</pre></div><p>Ale zpátky k <code>while</code>!\nDokážeš napsat tenhle program?</p>\n<h2>Oko bere</h2>\n<ul>\n<li>Začínáš s 0 body.</li>\n<li>Počítač v každém kole vypíše, kolik máš bodů,\na zeptá se tě, jestli chceš pokračovat.</li>\n<li>Pokud odpovíš „ne“, hra končí.</li>\n<li>Pokud odpovíš „ano“, počítač „otočí kartu“\n(náhodně vybere číslo od 2 do 10), vypíše její hodnotu a přičte ji k bodům.</li>\n<li>Pokud máš víc než 21 bodů, prohráváš.</li>\n<li>Cílem hry je získat co nejvíc bodů, ideálně 21.</li>\n</ul>\n<div class=\"solution\" id=\"solution-0\">\n <h3>Řešení</h3>\n <div class=\"solution-cover\">\n <a href=\"/2019/plzen-podzim-2019/beginners/while/index/solutions/0/\"><span class=\"link-text\">Ukázat řešení</span></a>\n </div>\n <div class=\"solution-body\" aria-hidden=\"true\">\n <div class=\"highlight\"><pre><span></span><span class=\"kn\">from</span> <span class=\"nn\">random</span> <span class=\"kn\">import</span> <span class=\"n\">randrange</span>\n\n<span class=\"n\">soucet</span> <span class=\"o\">=</span> <span class=\"mi\">0</span>\n<span class=\"k\">while</span> <span class=\"n\">soucet</span> <span class=\"o\"><</span> <span class=\"mi\">21</span><span class=\"p\">:</span>\n <span class=\"k\">print</span><span class=\"p\">(</span><span class=\"s1\">'Máš'</span><span class=\"p\">,</span> <span class=\"n\">soucet</span><span class=\"p\">,</span> <span class=\"s1\">'bodů'</span><span class=\"p\">)</span>\n <span class=\"n\">odpoved</span> <span class=\"o\">=</span> <span class=\"nb\">input</span><span class=\"p\">(</span><span class=\"s1\">'Otočit kartu? '</span><span class=\"p\">)</span>\n <span class=\"k\">if</span> <span class=\"n\">odpoved</span> <span class=\"o\">==</span> <span class=\"s1\">'ano'</span><span class=\"p\">:</span>\n <span class=\"n\">karta</span> <span class=\"o\">=</span> <span class=\"n\">randrange</span><span class=\"p\">(</span><span class=\"mi\">2</span><span class=\"p\">,</span> <span class=\"mi\">11</span><span class=\"p\">)</span>\n <span class=\"k\">print</span><span class=\"p\">(</span><span class=\"s1\">'Otočila jsi'</span><span class=\"p\">,</span> <span class=\"n\">karta</span><span class=\"p\">)</span>\n <span class=\"n\">soucet</span> <span class=\"o\">=</span> <span class=\"n\">soucet</span> <span class=\"o\">+</span> <span class=\"n\">karta</span>\n <span class=\"k\">elif</span> <span class=\"n\">odpoved</span> <span class=\"o\">==</span> <span class=\"s1\">'ne'</span><span class=\"p\">:</span>\n <span class=\"k\">break</span>\n <span class=\"k\">else</span><span class=\"p\">:</span>\n <span class=\"k\">print</span><span class=\"p\">(</span><span class=\"s1\">'Nerozumím! Odpovídej "ano", nebo "ne"'</span><span class=\"p\">)</span>\n\n<span class=\"k\">if</span> <span class=\"n\">soucet</span> <span class=\"o\">==</span> <span class=\"mi\">21</span><span class=\"p\">:</span>\n <span class=\"k\">print</span><span class=\"p\">(</span><span class=\"s1\">'Gratuluji! Vyhrála jsi!'</span><span class=\"p\">)</span>\n<span class=\"k\">elif</span> <span class=\"n\">soucet</span> <span class=\"o\">></span> <span class=\"mi\">21</span><span class=\"p\">:</span>\n <span class=\"k\">print</span><span class=\"p\">(</span><span class=\"s1\">'Smůla!'</span><span class=\"p\">,</span> <span class=\"n\">soucet</span><span class=\"p\">,</span> <span class=\"s1\">'bodů je moc!'</span><span class=\"p\">)</span>\n<span class=\"k\">else</span><span class=\"p\">:</span>\n <span class=\"k\">print</span><span class=\"p\">(</span><span class=\"s1\">'Chybělo jen'</span><span class=\"p\">,</span> <span class=\"mi\">21</span> <span class=\"o\">-</span> <span class=\"n\">soucet</span><span class=\"p\">,</span> <span class=\"s1\">'bodů!'</span><span class=\"p\">)</span>\n</pre></div>\n </div>\n</div>\n\n\n " } } }