While

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?

Oko bere

  • Začínáš s 0 body.
  • Počítač v každém kole vypíše, kolik máš bodů, a zeptá se hráče, jestli chce pokračovat.
  • Pokud hráč odpoví „ne“, hra končí.
  • Pokud hráč odpoví „ano“, počítač „otočí kartu“ (náhodně vybere číslo od 2 do 10) a přičte její hodnotu k bodům.
  • Pokud má hráč víc než 21 bodů, prohrává.
  • Cílem hry je získat co nejvíc bodů, ideálně 21.

Řešení

{
  "data": {
    "sessionMaterial": {
      "id": "session-material:2017/pyladies-brno-jaro-po:loops:2",
      "title": "Cyklus While",
      "html": "\n          \n    \n\n    <h1>While</h1>\n<p>Krom&#x11B; cyklu <code>for</code> m&#xE1;me je&#x161;t&#x11B; druh&#xFD; typ cyklu uvozen&#xFD; p&#x159;&#xED;kazem <code>while</code>\n(angl. <em>dokud</em>).\nNa rozd&#xED;l od <code>for</code>, kde <em>p&#x159;edem zn&#xE1;me po&#x10D;et opakov&#xE1;n&#xED;</em>,\nse while pou&#x17E;&#xED;v&#xE1;, kdy&#x17E; cyklus z&#xE1;vis&#xED; na n&#x11B;jak&#xE9; podm&#xED;nce.\nT&#x11B;lo cyklu se opakuje, dokud je podm&#xED;nka spln&#x11B;na. Nap&#x159;&#xED;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\">&apos;&#x158;ekni &#xC1;&#xE1;&#xE1;! &apos;</span><span class=\"p\">)</span>\n<span class=\"k\">while</span> <span class=\"n\">odpoved</span> <span class=\"o\">!=</span> <span class=\"s1\">&apos;&#xC1;&#xE1;&#xE1;&apos;</span><span class=\"p\">:</span>\n    <span class=\"k\">print</span><span class=\"p\">(</span><span class=\"s1\">&apos;&#x160;patn&#x11B;, zkus to znovu&apos;</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\">&apos;&#x158;ekni &#xC1;&#xE1;&#xE1;! &apos;</span><span class=\"p\">)</span>\n</pre></div><p>Ale pozor! Je velice jednoduch&#xE9; napsat cyklus,\njeho&#x17E; podm&#xED;nka bude spln&#x11B;na v&#x17E;dycky.\nTakov&#xFD; cyklus se bude opakovat donekone&#x10D;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\">&apos;&#x10C;&#xED;slo je&apos;</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\">&apos;(Po&#x10D;kej, ne&#x17E; se po&#x10D;&#xED;ta&#x10D; unav&#xED;...)&apos;</span><span class=\"p\">)</span>\n</pre></div><p>Program se d&#xE1; p&#x159;eru&#x161;it zm&#xE1;&#x10D;knut&#xED;m\n<kbd>Ctrl</kbd>+<kbd>C</kbd>.</p>\n<div class=\"admonition note\"><p>Tahle kl&#xE1;vesov&#xE1; zkratka vyvol&#xE1; v programu chybu\na program se &#x2013; jako po ka&#x17E;d&#xE9; chyb&#x11B; &#x2013; ukon&#x10D;&#xED;.</p>\n</div><p>A nakonec, existuje p&#x159;&#xED;kaz <code>break</code>, kter&#xFD; z cyklu &#x201E;vysko&#x10D;&#xED;&#x201C;:\nza&#x10D;nou se hned vykon&#xE1;vat p&#x159;&#xED;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\">&apos;&#x158;ekni &#xC1;&#xE1;&#xE1;! &apos;</span><span class=\"p\">)</span>\n    <span class=\"k\">if</span> <span class=\"n\">odpoved</span> <span class=\"o\">==</span> <span class=\"s1\">&apos;&#xC1;&#xE1;&#xE1;&apos;</span><span class=\"p\">:</span>\n        <span class=\"k\">print</span><span class=\"p\">(</span><span class=\"s1\">&apos;B&#xE9;&#xE9;&#xE9;&apos;</span><span class=\"p\">)</span>\n        <span class=\"k\">break</span>\n    <span class=\"k\">print</span><span class=\"p\">(</span><span class=\"s1\">&apos;&#x160;patn&#x11B;, zkus to znovu&apos;</span><span class=\"p\">)</span>\n\n<span class=\"k\">print</span><span class=\"p\">(</span><span class=\"s1\">&apos;Hotovo, ani to nebolelo.&apos;</span><span class=\"p\">)</span>\n</pre></div><p>P&#x159;&#xED;kaz <code>break</code> se d&#xE1; pou&#x17E;&#xED;t jenom v cyklu (<code>while</code> nebo <code>for</code>)\na pokud m&#xE1;me v&#xED;c cykl&#x16F; zano&#x159;en&#xFD;ch v sob&#x11B;, vysko&#x10D;&#xED; jen z&#xA0;toho vnit&#x159;n&#xED;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&#x11B;j&#x161;&#xED; 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&#x159;n&#xED; 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\">&apos; &apos;</span><span class=\"p\">)</span>\n        <span class=\"k\">if</span> <span class=\"n\">i</span> <span class=\"o\">&lt;=</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&#xE1;tky k&#xA0;<code>while</code>!\nDok&#xE1;&#x17E;e&#x161; napsat tenhle program?</p>\n<h2>Oko bere</h2>\n<ul>\n<li>Za&#x10D;&#xED;n&#xE1;&#x161; s 0 body.</li>\n<li>Po&#x10D;&#xED;ta&#x10D; v ka&#x17E;d&#xE9;m kole vyp&#xED;&#x161;e, kolik m&#xE1;&#x161; bod&#x16F;,\na zept&#xE1; se hr&#xE1;&#x10D;e, jestli chce pokra&#x10D;ovat.</li>\n<li>Pokud hr&#xE1;&#x10D; odpov&#xED; &#x201E;ne&#x201C;, hra kon&#x10D;&#xED;.</li>\n<li>Pokud hr&#xE1;&#x10D; odpov&#xED; &#x201E;ano&#x201C;, po&#x10D;&#xED;ta&#x10D; &#x201E;oto&#x10D;&#xED; kartu&#x201C;\n(n&#xE1;hodn&#x11B; vybere &#x10D;&#xED;slo od 2 do 10) a p&#x159;i&#x10D;te jej&#xED; hodnotu k bod&#x16F;m.</li>\n<li>Pokud m&#xE1; hr&#xE1;&#x10D; v&#xED;c ne&#x17E; 21 bod&#x16F;, prohr&#xE1;v&#xE1;.</li>\n<li>C&#xED;lem hry je z&#xED;skat co nejv&#xED;c bod&#x16F;, ide&#xE1;ln&#x11B; 21.</li>\n</ul>\n<div class=\"solution\" id=\"solution-0\">\n    <h3>&#x158;e&#x161;en&#xED;</h3>\n    <div class=\"solution-cover\">\n        <a href=\"/2017/pyladies-brno-jaro-po/beginners/while/index/solutions/0/\"><span class=\"link-text\">Uk&#xE1;zat &#x159;e&#x161;en&#xED;</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\">&lt;</span> <span class=\"mi\">21</span><span class=\"p\">:</span>\n    <span class=\"k\">print</span><span class=\"p\">(</span><span class=\"s1\">&apos;M&#xE1;&#x161;&apos;</span><span class=\"p\">,</span> <span class=\"n\">soucet</span><span class=\"p\">,</span> <span class=\"s1\">&apos;bod&#x16F;&apos;</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\">&apos;Oto&#x10D;it kartu? &apos;</span><span class=\"p\">)</span>\n    <span class=\"k\">if</span> <span class=\"n\">odpoved</span> <span class=\"o\">==</span> <span class=\"s1\">&apos;ano&apos;</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\">&apos;Oto&#x10D;ila jsi&apos;</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\">&apos;ne&apos;</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\">&apos;Nerozum&#xED;m! Odpov&#xED;dej &quot;ano&quot;, nebo &quot;ne&quot;&apos;</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\">&apos;Gratuluji! Vyhr&#xE1;la jsi!&apos;</span><span class=\"p\">)</span>\n<span class=\"k\">elif</span> <span class=\"n\">soucet</span> <span class=\"o\">&gt;</span> <span class=\"mi\">21</span><span class=\"p\">:</span>\n    <span class=\"k\">print</span><span class=\"p\">(</span><span class=\"s1\">&apos;Sm&#x16F;la!&apos;</span><span class=\"p\">,</span> <span class=\"n\">soucet</span><span class=\"p\">,</span> <span class=\"s1\">&apos;bod&#x16F; je moc!&apos;</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\">&apos;Chyb&#x11B;lo jen&apos;</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\">&apos;bod&#x16F;!&apos;</span><span class=\"p\">)</span>\n</pre></div>\n    </div>\n</div>\n\n\n        "
    }
  }
}