While

In addition to the for loop, we have a second type of loop, namely, the while loop. Unlike for, where we know the number of repetitions in advance, while is used when the loop depends on some condition. The loop body is repeated until the condition is met.

response = input('Say aaa!')
while response != 'aaa':
    print('Incorrect, try again')
    response = input('Say aaa!')

But pay attention! It is very easy to write a loop with a condition that is always true. This kind of loop will be repeated forever.

from random import randrange

while True:
    print('The number is', randrange(10000))
    print('(Wait for the computer to get tired…)')

The program can be interrupted with Ctrl+C.

This shortcut will raise an error and the program will end - like after every error.

Finally, we have the break command, that will signal the process to ‘jump out’ of the loop, and commands after the loop will be performed immediately.

while True:
    response = input('Say aaa!')
    if response == 'aaa':
        print('Good')
        break
    print('Incorrect, try again')

print('Yay and it did not even hurt')

The break command can only be used inside a loop (while or for), and if we have nested loops, it will only jump out of the one where it is used.

for i in range(10):  # Outer loop
    for j in range(10):  # Inner loop
        print(j * i, end=' ')
        if i <= j:
            break
    print()

Break will jump out of the inner loop and back to the outer loop when i is less or equal than j.

Back to while! Can you write the following program?

21

  • You start with 0 points
  • In each round, the computer shows how many points you have, and asks if you want to continue
  • If you answer ‘No’, the game ends.
  • If you answer ‘Yes’, the computer ‘turns a card’ (randomly selects a number from 2 to 10) and adds its value to the current points.
  • If you go over 21, you lose
  • The aim of the game is to get as many points as possible, but you win only if you get 21.

Řešení

{
  "data": {
    "sessionMaterial": {
      "id": "session-material:2018/pyladies-en-prague:def:1",
      "title": "While",
      "html": "\n          \n    \n\n    <h1>While</h1>\n<p>In addition to the <code>for</code> loop, we have a second type of loop, namely, the <code>while</code> loop.\nUnlike <code>for</code>, where we <em>know the number of repetitions</em> in advance, <code>while</code> is used when the \nloop depends on some condition. The loop body is repeated until the condition is met.</p>\n<div class=\"highlight\"><pre><span></span><span class=\"n\">response</span> <span class=\"o\">=</span> <span class=\"nb\">input</span><span class=\"p\">(</span><span class=\"s1\">&apos;Say aaa!&apos;</span><span class=\"p\">)</span>\n<span class=\"k\">while</span> <span class=\"n\">response</span> <span class=\"o\">!=</span> <span class=\"s1\">&apos;aaa&apos;</span><span class=\"p\">:</span>\n    <span class=\"k\">print</span><span class=\"p\">(</span><span class=\"s1\">&apos;Incorrect, try again&apos;</span><span class=\"p\">)</span>\n    <span class=\"n\">response</span> <span class=\"o\">=</span> <span class=\"nb\">input</span><span class=\"p\">(</span><span class=\"s1\">&apos;Say aaa!&apos;</span><span class=\"p\">)</span>\n</pre></div><p>But pay attention! It is very easy to write a loop with a condition that is always true.\nThis kind of loop will be repeated forever.</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;The number is&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;(Wait for the computer to get tired&#x2026;)&apos;</span><span class=\"p\">)</span>\n</pre></div><p>The program can be interrupted with\n<kbd>Ctrl</kbd>+<kbd>C</kbd>.</p>\n<div class=\"admonition note\"><p>This shortcut will raise an error\nand the program will end - like after every error.</p>\n</div><p>Finally, we have the <code>break</code> command, that will signal the process to &#x2018;jump out&#x2019; of the loop,\nand commands after the loop will be performed immediately.</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\">response</span> <span class=\"o\">=</span> <span class=\"nb\">input</span><span class=\"p\">(</span><span class=\"s1\">&apos;Say aaa!&apos;</span><span class=\"p\">)</span>\n    <span class=\"k\">if</span> <span class=\"n\">response</span> <span class=\"o\">==</span> <span class=\"s1\">&apos;aaa&apos;</span><span class=\"p\">:</span>\n        <span class=\"k\">print</span><span class=\"p\">(</span><span class=\"s1\">&apos;Good&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;Incorrect, try again&apos;</span><span class=\"p\">)</span>\n\n<span class=\"k\">print</span><span class=\"p\">(</span><span class=\"s1\">&apos;Yay and it did not even hurt&apos;</span><span class=\"p\">)</span>\n</pre></div><p>The break command can only be used inside a loop (<code>while</code> or <code>for</code>), \nand if we have nested loops, it will only jump out of the one where it is used.</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\"># Outer loop</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\"># Inner loop</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><code>Break</code> will jump out of the inner loop and back to the outer loop \nwhen <var>i</var> is less or equal than <var>j</var>.</p>\n<p>Back to <code>while</code>!\nCan you write the following program?</p>\n<h2>21</h2>\n<ul>\n<li>You start with 0 points</li>\n<li>In each round, the computer shows how many points you have, and asks if you want to continue</li>\n<li>If you answer &#x2018;No&#x2019;, the game ends.</li>\n<li>If you answer &#x2018;Yes&#x2019;, the computer &#x2018;turns a card&#x2019; (randomly selects a number from 2 to 10)\nand adds its value to the current points.</li>\n<li>If you go over 21, you lose</li>\n<li>The aim of the game is to get as many points as possible, but you win only if you get 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=\"/2018/pyladies-en-prague/beginners-en/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=\"nb\">sum</span> <span class=\"o\">=</span> <span class=\"mi\">0</span>\n<span class=\"k\">while</span> <span class=\"nb\">sum</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;You have&apos;</span><span class=\"p\">,</span> <span class=\"nb\">sum</span><span class=\"p\">,</span> <span class=\"s1\">&apos;points.&apos;</span><span class=\"p\">)</span>\n    <span class=\"n\">answer</span> <span class=\"o\">=</span> <span class=\"nb\">input</span><span class=\"p\">(</span><span class=\"s1\">&apos;Turn card? &apos;</span><span class=\"p\">)</span>\n    <span class=\"k\">if</span> <span class=\"n\">answer</span> <span class=\"o\">==</span> <span class=\"s1\">&apos;yes&apos;</span><span class=\"p\">:</span>\n        <span class=\"n\">card</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=\"s2\">&quot;You&apos;ve got number&quot;</span><span class=\"p\">,</span> <span class=\"n\">card</span><span class=\"p\">)</span>\n        <span class=\"nb\">sum</span> <span class=\"o\">=</span> <span class=\"nb\">sum</span> <span class=\"o\">+</span> <span class=\"n\">card</span>\n    <span class=\"k\">elif</span> <span class=\"n\">answer</span> <span class=\"o\">==</span> <span class=\"s1\">&apos;no&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;I do not understand! Answer &quot;yes&quot; or &quot;no&quot;&apos;</span> <span class=\"p\">)</span>\n\n<span class=\"k\">if</span> <span class=\"nb\">sum</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;Congratulations! You won!&apos;</span><span class=\"p\">)</span>\n<span class=\"k\">elif</span> <span class=\"nb\">sum</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;Bad luck!&apos;</span><span class=\"p\">,</span> <span class=\"nb\">sum</span><span class=\"p\">,</span> <span class=\"s1\">&apos;points is too much!&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;So close! You missed&apos;</span><span class=\"p\">,</span> <span class=\"mi\">21</span> <span class=\"o\">-</span> <span class=\"nb\">sum</span><span class=\"p\">,</span> <span class=\"s1\">&apos;points!&apos;</span><span class=\"p\">)</span>\n</pre></div>\n    </div>\n</div>\n\n\n        "
    }
  }
}