8.3. The while
Statement¶
There is another Python statement that can also be used to build an
iteration. It is called the while
statement. The while
statement provides a much more general mechanism for iterating.
Similar to the if
statement, it uses a boolean expression to
control the flow of execution. The body of while will be repeated as
long as the controlling boolean expression evaluates to True
.
The following figure shows the flow of control.
We can use the while
loop to create any type of iteration we wish,
including anything that we have previously done with a for
loop.
For example, the program in the previous section could be rewritten
using while
. Instead of relying on the range
function to
produce the numbers for our summation, we will need to produce them
ourselves. To do this, we will create a variable called i
and
initialize it to 1, the first number in the summation. Every
iteration will add i
to the running total until all the values
have been used. In order to control the iteration, we must create a
boolean expression that evaluates to True
as long as we want to
keep adding values to our running total. In this case, as long as
i
is less than or equal to the bound, we should keep going.
Here is a new version of the summation program that uses a while statement.
You can almost read the while
statement as if it were in natural
language. It means, while i
is less than or equal to bound
,
continue executing the body of the loop. Within the body, each time,
update the_sum
using the accumulator pattern and increment
i
. After the body of the loop, we go back up to the condition of
the while
and reevaluate it. When i
becomes greater than
bound
, the condition fails and flow of control continues to the
return
statement.
Run the program in CodeLens to observe the flow of execution.
More formally, here is the flow of execution for a while
statement:
Evaluate the condition, yielding
False
orTrue
.If the condition is
False
, exit thewhile
statement and continue execution at the next statement.If the condition is
True
, execute each of the statements in the body and then go back to step 1.
The body consists of all of the statements below the header with the same indentation.
This type of flow is called a loop because the third step loops
back around to the top. Notice that if the condition is False
the
first time through the loop, the statements inside the loop are never
executed.
Warning
Though Python’s while
is very close to the English “while”,
there is an important difference: In English “while X, do Y”, we
usually assume that immediately after X becomes false, we stop
with Y. In Python there is not an immediate stop: After the
initial test, any following tests come only after the execution of
the whole body, even if the condition becomes false in the middle
of the loop body.
The body of the loop should change the value of one or more variables
so that eventually the condition becomes False
and the loop
terminates. Otherwise the loop will repeat forever. This is called an
infinite loop. An endless source of amusement for computer
scientists is the observation that the directions written on the back
of the shampoo bottle (lather, rinse, repeat) create an infinite loop.
In the case shown above, we can prove that the loop terminates because
we know that the value of bound
is finite, and we can see that the
value of i
increments each time through the loop, so eventually it
will have to exceed bound
. In other cases, it is not so easy to
tell.
Note
Introduction of the while statement causes us to think about
the types of iteration we have seen. The for
statement
will always iterate through a sequence of values like the list
of names for the party or the list of numbers created by
range
. Since we know that it will iterate once for each
value in the collection, it is often said that a for
loop
creates a definite iteration because we definitely know
how many times we are going to iterate. On the other hand,
the while
statement is dependent on a condition that needs
to evaluate to False
in order for the loop to terminate.
Since we do not necessarily know when this will happen, it
creates what we call indefinite iteration. Indefinite
iteration simply means that we don’t know how many times we
will repeat but eventually the condition controlling the
iteration will fail and the iteration will stop. (Unless we
have an infinite loop which is of course a problem.)
What you will notice here is that the while
loop is more work for
you — the programmer — than the equivalent for
loop. When
using a while
loop you have to control the loop variable yourself.
You give it an initial value, test for completion, and then make sure
you change something in the body so that the loop terminates.
So why have two kinds of loop if for
looks easier? The next
section, shows an indefinite iteration where we need the extra power
that we get from the while
loop.
Check your understanding
- True
- Although the while loop uses a different syntax, it is just as powerful as a for-loop and often more flexible.
- False
- Often a for-loop is more natural and convenient for a task, but that same task can always be expressed using a while loop.
iter-3-1: True or False: You can rewrite any for-loop as a while-loop.
- n starts at 10 and is incremented by 1 each time through the loop, so it will always be positive
- The loop will run as long as n is positive. In this case, we can see that n will never become non-positive.
- answer starts at 1 and is incremented by n each time, so it will always be positive
- While it is true that answer will always be positive, answer is not considered in the loop condition.
- You cannot compare n to 0 in while loop. You must compare it to another variable.
- It is perfectly valid to compare n to 0. Though indirectly, this is what causes the infinite loop.
- In the while loop body, we must set n to False, and this code does not do that.
- The loop condition must become False for the loop to terminate, but n by itself is not the condition in this case.
iter-3-2: The following code contains an infinite loop. Which is the best explanation for why the loop does not terminate?
n: int
answer: int
n = 10
answer = 1
while n > 0:
answer = answer + n
n = n + 1
print(answer)
- 4 7
- Setting a variable so the loop condition would be false in the middle of the loop body does not keep the variable from actually being set.
- 5 7
- Setting a variable so the loop condition would be false in the middle of the loop body does not stop execution of statements in the rest of the loop body.
- 7 15
- After n becomes 5 and the test would be False, but the test does not actually come until after the end of the loop - only then stopping execution of the repetition of the loop.
iter-3-3: What is printed by this code?
n: int
x: int
n = 1
x = 2
while n < 5:
n = n + 1
x = x + 1
n = n + 2
x = x + n
print(str(n) + " " + str(x))