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:2017/pyladies-praha-jaro: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 hráče, jestli chce pokračovat.</li>\n<li>Pokud hráč odpoví „ne“, hra končí.</li>\n<li>Pokud hráč odpoví „ano“, počítač „otočí kartu“\n(náhodně vybere číslo od 2 do 10) a přičte její hodnotu k bodům.</li>\n<li>Pokud má hráč 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=\"/2017/pyladies-praha-jaro/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 "
}
}
}