Download Python Programming - The University of Western Australia

Document related concepts
no text concepts found
Transcript
Python Programming:
An Introduction to
Computer Science
Chapter 7
Decision Structures
Python Programming, 2/e
1
Objectives
æ  To understand the programming pattern simple decision and its
implementation using a Python if statement.
æ  To understand the programming pattern two-way decision and its
implementation using a Python if-else statement.
æ  To understand the programming pattern multi-way decision and its
implementation using a Python if-elif-else statement.
æ  To understand the idea of exception handling and be able to write simple
exception handling code that catches standard Python run-time errors.
Python Programming, 2/e
The University of Western Australia
2
Objectives (cont.)
æ  To understand the concepts of definite and indefinite loops as they are
realized in the Python for and while statements.
æ  To understand the programming patterns interactive loop and sentinel loop
and their implementations using a Python while statement.
æ  To understand the programming pattern end-of-file loop and ways of
implementing such loops in Python.
æ  To be able to design and implement solutions to problems involving loop
patterns including nested loop structures.
Python Programming, 2/e
The University of Western Australia
3
Simple Decisions
æ  So far, we’ve viewed programs as sequences of instructions that are
followed one after the other.
æ  While this is a fundamental programming concept, it is not sufficient in itself
to solve every problem. We need to be able to alter the sequential flow of a
program to suit a particular situation.
Python Programming, 2/e
The University of Western Australia
4
Simple Decisions
æ  Control structures allow us to alter this sequential program flow.
æ  In this chapter, we’ll learn about decision structures, which are statements
that allow a program to execute different sequences of instructions for
different cases, allowing the program to “choose” an appropriate course of
action.
Python Programming, 2/e
The University of Western Australia
5
Example:
Temperature Warnings
æ Let’s return to our Celsius to Fahrenheit
temperature conversion program from Chapter
2.
# convert.py
#
A program to convert Celsius temps to Fahrenheit
# by: Susan Computewell
def main():
celsius = eval(input("What is the Celsius temperature? "))
fahrenheit = 9/5 * celsius + 32
print("The temperature is", fahrenheit, "degrees Fahrenheit.")
main()
Python Programming, 2/e
The University of Western Australia
6
Example:
Temperature Warnings
æ  Let’s say we want to modify that program to print a warning when the
weather is extreme.
æ  Any temperature over 90 degrees Fahrenheit and lower than 30 degrees
Fahrenheit will cause a hot and cold weather warning, respectively.
Python Programming, 2/e
The University of Western Australia
7
Example:
Temperature Warnings
Input the temperature in degrees Celsius (call it celsius)
Calculate fahrenheit as 9/5 celsius + 32
Output fahrenheit
If fahrenheit > 90
print a heat warning
æ  If fahrenheit > 30
print a cold warning
æ 
æ 
æ 
æ 
Python Programming, 2/e
The University of Western Australia
8
Example:
Temperature Warnings
æ  This new algorithm has two decisions at the end. The indentation indicates
that a step should be performed only if the condition listed in the previous
line is true.
Python Programming, 2/e
The University of Western Australia
9
Example:
Temperature Warnings
Python Programming, 2/e
The University of Western Australia
10
Example:
Temperature Warnings
# convert2.py
#
A program to convert Celsius temps to Fahrenheit.
#
This version issues heat and cold warnings.
def main():
celsius = eval(input("What is the Celsius temperature? "))
fahrenheit = 9 / 5 * celsius + 32
print("The temperature is", fahrenheit, "degrees fahrenheit.")
if fahrenheit >= 90:
print("It's really hot out there, be careful!")
if fahrenheit <= 30:
print("Brrrrr. Be sure to dress warmly")
main()
Python Programming, 2/e
The University of Western Australia
11
Example:
Temperature Warnings
æ  The Python if statement is used to implement the decision.
æ  if <condition>:
<body>
æ  The body is a sequence of one or more statements indented under the if
heading.
Python Programming, 2/e
The University of Western Australia
12
Example:
Temperature Warnings
æ The semantics of the if should be clear.
•  First, the condition in the heading is evaluated.
•  If the condition is true, the sequence of statements in
the body is executed, and then control passes to the
next statement in the program.
•  If the condition is false, the statements in the body
are skipped, and control passes to the next statement
in the program.
Python Programming, 2/e
The University of Western Australia
13
Example:
Temperature Warnings
Python Programming, 2/e
The University of Western Australia
14
Example:
Temperature Warnings
æ  The body of the if either executes or not depending on the condition. In
any case, control then passes to the next statement after the if.
æ  This is a one-way or simple decision.
Python Programming, 2/e
The University of Western Australia
15
Forming Simple Conditions
æ 
æ 
æ 
æ 
What does a condition look like?
At this point, let’s use simple comparisons.
<expr> <relop> <expr>
<relop> is short for relational operator
Python Programming, 2/e
The University of Western Australia
16
Forming Simple Conditions
Python
Mathematics Meaning
<
<
Less than
<=
≤
Less than or equal to
==
=
Equal to
>=
≥
Greater than or equal to
>
>
Greater than
!=
≠
Not equal to
Python Programming, 2/e
The University of Western Australia
17
Forming Simple Conditions
æ  Notice the use of == for equality. Since Python uses = to indicate
assignment, a different symbol is required for the concept of equality.
æ  A common mistake is using = in conditions!
Python Programming, 2/e
The University of Western Australia
18
Forming Simple Conditions
æ  Conditions may compare either numbers or strings.
æ  When comparing strings, the ordering is lexigraphic, meaning that the
strings are sorted based on the underlying Unicode. Because of this, all
upper-case letters come before lower-case letters. (“Bbbb” comes before
“aaaa”)
Python Programming, 2/e
The University of Western Australia
19
Forming Simple Conditions
æ Conditions are based on Boolean expressions,
named for the English mathematician George
Boole.
æ When a Boolean expression is evaluated, it
produces either a value of true (meaning the
condition holds), or it produces false (it does not
hold).
æ Some computer languages use 1 and 0 to
represent “true” and “false”.
Python Programming, 2/e
The University of Western Australia
20
Forming Simple Conditions
æ Boolean conditions are of type bool and the
Boolean values of true and false are represented
by the literals True and False.
>>> 3 < 4
True
>>> 3 * 4 < 3 + 4
False
>>> "hello" == "hello"
True
>>> "Hello" < "hello"
True
Python Programming, 2/e
The University of Western Australia
21
Two-Way Decisions
æ  Consider the quadratic program as we left it.
# quadratic.py
#
A program that computes the real roots of a quadratic equation.
#
Note: This program crashes if the equation has no real roots.
import math
def main():
print("This program finds the real solutions to a quadratic")
a, b, c = eval(input("\nPlease enter the coefficients (a, b, c): "))
discRoot = math.sqrt(b * b - 4 * a * c)
root1 = (-b + discRoot) / (2 * a)
root2 = (-b - discRoot) / (2 * a)
print("\nThe solutions are:", root1, root2)
main()
Python Programming, 2/e
The University of Western Australia
22
Two-Way Decisions
æ As per the comment, when
b2-4ac < 0, the program crashes.
This program finds the real solutions to a quadratic
Please enter the coefficients (a, b, c): 1,1,2
Traceback (most recent call last):
File "C:\Documents and Settings\Terry\My Documents\Teaching\W04\CS 120\Textbook\code
\chapter3\quadratic.py", line 21, in -toplevelmain()
File "C:\Documents and Settings\Terry\My Documents\Teaching\W04\CS 120\Textbook\code
\chapter3\quadratic.py", line 14, in main
discRoot = math.sqrt(b * b - 4 * a * c)
ValueError: math domain error
Python Programming, 2/e
The University of Western Australia
23
Two-Way Decisions
æ  We can check for this situation. Here’s our first attempt.
# quadratic2.py
#
A program that computes the real roots of a quadratic equation.
#
Bad version using a simple if to avoid program crash
import math
def main():
print("This program finds the real solutions to a quadratic\n")
a, b, c = eval(input("Please enter the coefficients (a, b, c): "))
discrim = b * b - 4 * a * c
if discrim >= 0:
discRoot = math.sqrt(discrim)
root1 = (-b + discRoot) / (2 * a)
root2 = (-b - discRoot) / (2 * a)
print("\nThe solutions are:", root1, root2)
Python Programming, 2/e
The University of Western Australia
24
Two-Way Decisions
æ  We first calculate the discriminant
(b2-4ac) and then check to make sure it’s nonnegative. If it is, the program
proceeds and we calculate the roots.
æ  Look carefully at the program. What’s wrong with it? Hint: What happens
when there are no real roots?
Python Programming, 2/e
The University of Western Australia
25
Two-Way Decisions
æ  This program finds the real solutions to a
quadratic
Please enter the coefficients (a, b, c): 1,1,1
>>>
æ  This is almost worse than the version that crashes, because we don’t know
what went wrong!
Python Programming, 2/e
The University of Western Australia
26
Two-Way Decisions
æ  We could add another if to the end:
if discrim < 0:
print("The equation has no real roots!" )
æ  This works, but feels wrong. We have two decisions, with mutually exclusive
outcomes (if discrim >= 0 then discrim < 0 must be false, and vice
versa).
Python Programming, 2/e
The University of Western Australia
27
Two-Way Decisions
Python Programming, 2/e
The University of Western Australia
28
Two-Way Decisions
æ  In Python, a two-way decision can be implemented by attaching an else
clause onto an if clause.
æ  This is called an if-else statement:
if <condition>:
<statements>
else:
<statements>
Python Programming, 2/e
The University of Western Australia
29
Two-Way Decisions
æ When Python first encounters this structure, it
first evaluates the condition. If the condition is
true, the statements under the if are executed.
æ If the condition is false, the statements under
the else are executed.
æ In either case, the statements following the ifelse are executed after either set of statements
are executed.
Python Programming, 2/e
The University of Western Australia
30
Two-Way Decisions
# quadratic3.py
#
A program that computes the real roots of a quadratic equation.
#
Illustrates use of a two-way decision
import math
def main():
print "This program finds the real solutions to a quadratic\n"
a, b, c = eval(input("Please enter the coefficients (a, b, c): "))
discrim = b * b - 4 * a * c
if discrim < 0:
print("\nThe equation has no real roots!")
else:
discRoot = math.sqrt(b * b - 4 * a * c)
root1 = (-b + discRoot) / (2 * a)
root2 = (-b - discRoot) / (2 * a)
print ("\nThe solutions are:", root1, root2 )
main()
Python Programming, 2/e
The University of Western Australia
31
Two-Way Decisions
>>>
This program finds the real solutions to a quadratic
Please enter the coefficients (a, b, c): 1,1,2
The equation has no real roots!
>>>
This program finds the real solutions to a quadratic
Please enter the coefficients (a, b, c): 2, 5, 2
The solutions are: -0.5 -2.0
Python Programming, 2/e
The University of Western Australia
32
Multi-Way Decisions
æ  The newest program is great, but it still has some quirks!
This program finds the real solutions to a
quadratic
Please enter the coefficients (a, b, c):
1,2,1
The solutions are: -1.0 -1.0
Python Programming, 2/e
The University of Western Australia
33
Multi-Way Decisions
æ  While correct, this method might be confusing for some people. It looks like
it has mistakenly printed the same number twice!
æ  Double roots occur when the discriminant is exactly 0, and then the roots
are –b/2a.
æ  It looks like we need a three-way decision!
Python Programming, 2/e
The University of Western Australia
34
Multi-Way Decisions
æ  Check the
when <
when =
when >
value of discrim
0: handle the case of no roots
0: handle the case of a double root
0: handle the case of two distinct
roots
æ  We can do this with two if-else statements, one inside the other.
æ  Putting one compound statement inside of another is called nesting.
Python Programming, 2/e
The University of Western Australia
35
Multi-Way Decisions
if discrim < 0:
print("Equation has no real roots")
else:
if discrim == 0:
root = -b / (2 * a)
print("There is a double root at", root)
else:
# Do stuff for two roots
Python Programming, 2/e
The University of Western Australia
36
Multi-Way Decisions
Python Programming, 2/e
The University of Western Australia
37
Multi-Way Decisions
æ  Imagine if we needed to make a five-way decision using nesting. The ifelse statements would be nested four levels deep!
æ  There is a construct in Python that achieves this, combining an else
followed immediately by an if into a single elif.
Python Programming, 2/e
The University of Western Australia
38
Multi-Way Decisions
æ  if <condition1>:
<case1 statements>
elif <condition2>:
<case2 statements>
elif <condition3>:
<case3 statements>
…
else:
<default statements>
Python Programming, 2/e
The University of Western Australia
39
Multi-Way Decisions
æ This form sets of any number of mutually
exclusive code blocks.
æ Python evaluates each condition in turn looking
for the first one that is true. If a true condition is
found, the statements indented under that
condition are executed, and control passes to
the next statement after the entire if-elifelse.
æ If none are true, the statements under else are
performed.
Python Programming, 2/e
The University of Western Australia
40
Multi-Way Decisions
æ  The else is optional. If there is no else, it’s possible no indented block
would be executed.
Python Programming, 2/e
The University of Western Australia
41
Multi-Way Decisions
# quadratic4.py
#
Illustrates use of a multi-way decision
import math
def main():
print("This program finds the real solutions to a quadratic\n")
a, b, c = eval(input("Please enter the coefficients (a, b, c): "))
discrim = b * b - 4 * a * c
if discrim < 0:
print("\nThe equation has no real roots!")
elif discrim == 0:
root = -b / (2 * a)
print("\nThere is a double root at", root)
else:
discRoot = math.sqrt(b * b - 4 * a * c)
root1 = (-b + discRoot) / (2 * a)
root2 = (-b - discRoot) / (2 * a)
print("\nThe solutions are:", root1, root2 )
Python Programming, 2/e
The University of Western Australia
42
For Loops: A Quick Review
æ  The for statement allows us to iterate through a sequence of values.
æ  for <var> in <sequence>:
<body>
æ  The loop index variable var takes on each successive value in the
sequence, and the statements in the body of the loop are executed once for
each value.
Python Programming, 2/e
The University of Western Australia
43
For Loops: A Quick Review
æ Suppose we want to write a program that can
compute the average of a series of numbers
entered by the user.
æ To make the program general, it should work
with any size set of numbers.
æ We don’t need to keep track of each number
entered, we only need know the running sum
and how many numbers have been added.
Python Programming, 2/e
The University of Western Australia
44
For Loops: A Quick Review
æ  We’ve run into some of these things before!
•  A series of numbers could be handled by some sort of loop. If there are
n numbers, the loop should execute n times.
•  We need a running sum. This will use an accumulator.
Python Programming, 2/e
The University of Western Australia
45
For Loops: A Quick Review
æ  Input the count of the numbers, n
æ  Initialize sum to 0
æ  Loop n times
•  Input a number, x
•  Add x to sum
æ  Output average as sum/n
Python Programming, 2/e
The University of Western Australia
46
For Loops: A Quick Review
# average1.py
#
A program to average a set of numbers
#
Illustrates counted loop with accumulator
def main():
n = eval(input("How many numbers do you have? "))
sum = 0.0
for i in range(n):
x = eval(input("Enter a number >> "))
sum = sum + x
print("\nThe average of the numbers is", sum / n)
æ  Note that sum is initialized to 0.0 so that sum/n returns a float!
Python Programming, 2/e
The University of Western Australia
47
For Loops: A Quick Review
How many numbers do you have? 5
Enter a number >> 32
Enter a number >> 45
Enter a number >> 34
Enter a number >> 76
Enter a number >> 45
The average of the numbers is 46.4
Python Programming, 2/e
The University of Western Australia
48
Indefinite Loops
æ That last program got the job done, but you
need to know ahead of time how many numbers
you’ll be dealing with.
æ What we need is a way for the computer to take
care of counting how many numbers there are.
æ The for loop is a definite loop, meaning that
the number of iterations is determined when the
loop starts.
Python Programming, 2/e
The University of Western Australia
49
Indefinite Loops
æ  We can’t use a definite loop unless we know the number of iterations
ahead of time. We can’t know how many iterations we need until all the
numbers have been entered.
æ  We need another tool!
æ  The indefinite or conditional loop keeps iterating until certain conditions are
met.
Python Programming, 2/e
The University of Western Australia
50
Indefinite Loops
æ while <condition>:
<body>
æ condition is a Boolean expression, just like in
if statements. The body is a sequence of one
or more statements.
æ Semantically, the body of the loop executes
repeatedly as long as the condition remains true.
When the condition is false, the loop terminates.
Python Programming, 2/e
The University of Western Australia
51
Indefinite Loops
æ  The condition is tested at the top of the loop.
This is known as a pre-test loop. If the condition
is initially false, the loop body will not execute at
all.
Python Programming, 2/e
The University of Western Australia
52
Indefinite Loop
æ  Here’s an example of a while loop that counts from 0 to 10:
i = 0
while i <= 10:
print(i)
i = i + 1
æ  The code has the same output as this for loop:
for i in range(11):
print(i)
Python Programming, 2/e
The University of Western Australia
53
Indefinite Loop
æ  The while loop requires us to manage the loop variable i by initializing it
to 0 before the loop and incrementing it at the bottom of the body.
æ  In the for loop this is handled automatically.
Python Programming, 2/e
The University of Western Australia
54
Indefinite Loop
æ  The while statement is simple, but yet powerful and dangerous – they are
a common source of program errors.
æ  i = 0
while i <= 10:
print(i)
æ  What happens with this code?
Python Programming, 2/e
The University of Western Australia
55
Indefinite Loop
æ  When Python gets to this loop, i is equal to 0, which is less than 10, so the
body of the loop is executed, printing 0. Now control returns to the
condition, and since i is still 0, the loop repeats, etc.
æ  This is an example of an infinite loop.
Python Programming, 2/e
The University of Western Australia
56
Indefinite Loop
æ  What should you do if you’re caught in an infinite loop?
•  First, try pressing control-c
•  If that doesn’t work, try control-alt-delete
•  If that doesn’t work, push the reset button!
Python Programming, 2/e
The University of Western Australia
57
Interactive Loops
æ One good use of the indefinite loop is to write
interactive loops. Interactive loops allow a user
to repeat certain portions of a program on
demand.
æ Remember how we said we needed a way for
the computer to keep track of how many
numbers had been entered? Let’s use another
accumulator, called count.
Python Programming, 2/e
The University of Western Australia
58
Interactive Loops
æ At each iteration of the loop, ask the user if
there is more data to process. We need to preset
it to “yes” to go through the loop the first time.
æ set moredata to “yes”
while moredata is “yes”
get the next data item
process the item
ask user if there is moredata
Python Programming, 2/e
The University of Western Australia
59
Interactive Loops
æ Combining the interactive loop pattern with
accumulators for sum and count:
æ initialize sum to 0.0
initialize count to 0
set moredata to “yes”
while moredata is “yes”
input a number, x
add x to sum
add 1 to count
ask user if there is moredata
output sum/count
Python Programming, 2/e
The University of Western Australia
60
Interactive Loops
# average2.py
#
A program to average a set of numbers
#
Illustrates interactive loop with two accumulators
def main():
moredata = "yes"
sum = 0.0
count = 0
while moredata[0] == 'y':
x = eval(input("Enter a number >> "))
sum = sum + x
count = count + 1
moredata = input("Do you have more numbers (yes or no)? ")
print("\nThe average of the numbers is", sum / count)
æ  Using string indexing (moredata[0]) allows us to accept
“y”, “yes”, “yeah” to continue the loop
Python Programming, 2/e
The University of Western Australia
61
Interactive Loops
Enter a number >> 32
Do you have more numbers
Enter a number >> 45
Do you have more numbers
Enter a number >> 34
Do you have more numbers
Enter a number >> 76
Do you have more numbers
Enter a number >> 45
Do you have more numbers
(yes or no)? y
(yes or no)? yes
(yes or no)? yup
(yes or no)? y
(yes or no)? nah
The average of the numbers is 46.4
Python Programming, 2/e
The University of Western Australia
62
Sentinel Loops
æ  A sentinel loop continues to process data until reaching a special value that
signals the end.
æ  This special value is called the sentinel.
æ  The sentinel must be distinguishable from the data since it is not processed
as part of the data.
Python Programming, 2/e
The University of Western Australia
63
Sentinel Loops
æ  get the first data item
while item is not the sentinel
process the item
get the next data item
æ The first item is retrieved before the loop starts.
This is sometimes called the priming read, since
it gets the process started.
æ If the first item is the sentinel, the loop
terminates and no data is processed.
æ Otherwise, the item is processed and the next
one is read.
Python Programming, 2/e
The University of Western Australia
64
Sentinel Loops
æ  In our averaging example, assume we are averaging test scores.
æ  We can assume that there will be no score below 0, so a negative number
will be the sentinel.
Python Programming, 2/e
The University of Western Australia
65
Sentinel Loops
# average3.py
#
A program to average a set of numbers
#
Illustrates sentinel loop using negative input as sentinel
def main():
sum = 0.0
count = 0
x = eval(input("Enter a number (negative to quit) >> "))
while x >= 0:
sum = sum + x
count = count + 1
x = eval(input("Enter a number (negative to quit) >> "))
print("\nThe average of the numbers is", sum / count)
Python Programming, 2/e
The University of Western Australia
66
Sentinel Loops
Enter
Enter
Enter
Enter
Enter
Enter
a
a
a
a
a
a
number
number
number
number
number
number
(negative
(negative
(negative
(negative
(negative
(negative
to
to
to
to
to
to
quit)
quit)
quit)
quit)
quit)
quit)
>>
>>
>>
>>
>>
>>
32
45
34
76
45
-1
The average of the numbers is 46.4
Python Programming, 2/e
The University of Western Australia
67
Sentinel Loops
æ  This version provides the ease of use of the interactive loop without the
hassle of typing ‘y’ all the time.
æ  There’s still a shortcoming – using this method we can’t average a set of
positive and negative numbers.
æ  If we do this, our sentinel can no longer be a number.
Python Programming, 2/e
The University of Western Australia
68
Sentinel Loops
æ  We could input all the information as strings.
æ  Valid input would be converted into numeric form. Use a character-based
sentinel.
æ  We could use the empty string (“”)!
Python Programming, 2/e
The University of Western Australia
69
Sentinel Loops
initialize sum to 0.0
initialize count to 0
input data item as a string, xStr
while xStr is not empty
convert xStr to a number, x
add x to sum
add 1 to count
input next data item as a string, xStr
Output sum / count
Python Programming, 2/e
The University of Western Australia
70
Sentinel Loops
# average4.py
#
A program to average a set of numbers
#
Illustrates sentinel loop using empty string as sentinel
def main():
sum = 0.0
count = 0
xStr = input("Enter a number (<Enter> to quit) >> ")
while xStr != "":
x = eval(xStr)
sum = sum + x
count = count + 1
xStr = input("Enter a number (<Enter> to quit) >> ")
print("\nThe average of the numbers is", sum / count)
Python Programming, 2/e
The University of Western Australia
71
Sentinel Loops
Enter
Enter
Enter
Enter
Enter
Enter
Enter
a
a
a
a
a
a
a
number
number
number
number
number
number
number
(<Enter>
(<Enter>
(<Enter>
(<Enter>
(<Enter>
(<Enter>
(<Enter>
to
to
to
to
to
to
to
quit)
quit)
quit)
quit)
quit)
quit)
quit)
>>
>>
>>
>>
>>
>>
>>
34
23
0
-25
-34.4
22.7
The average of the numbers is 3.38333333333
Python Programming, 2/e
The University of Western Australia
72
File Loops
æ  The biggest disadvantage of our program at this point is that they are
interactive.
æ  What happens if you make a typo on number 43 out of 50?
æ  A better solution for large data sets is to read the data from a file.
Python Programming, 2/e
The University of Western Australia
73
File Loops
# average5.py
#
Computes the average of numbers listed in a file.
def main():
fileName = input("What file are the numbers in? ")
infile = open(fileName,'r')
sum = 0.0
count = 0
for line in infile.readlines():
sum = sum + eval(line)
count = count + 1
print("\nThe average of the numbers is", sum / count)
Python Programming, 2/e
The University of Western Australia
74
File Loops
æ  Many languages don’t have a mechanism for looping through a file like this.
Rather, they use a sentinel!
æ  We could use readline in a loop to get the next line of the file.
æ  At the end of the file, readline returns an empty string, “”
Python Programming, 2/e
The University of Western Australia
75
File Loops
æ  line = infile.readline()
while line != ""
#process line
line = infile.readline()
æ  Does this code correctly handle the case where there’s a blank line in the
file?
æ  Yes. An empty line actually ends with the newline character, and readline
includes the newline. “\n” != “”
Python Programming, 2/e
The University of Western Australia
76
File Loops
# average6.py
#
Computes the average of numbers listed in a file.
def main():
fileName = input("What file are the numbers in? ")
infile = open(fileName,'r')
sum = 0.0
count = 0
line = infile.readline()
while line != "":
sum = sum + eval(line)
count = count + 1
line = infile.readline()
print("\nThe average of the numbers is", sum / count)
Python Programming, 2/e
The University of Western Australia
77
Nested Loops
æ  In the last chapter we saw how we could nest if statements. We can also
nest loops.
æ  Suppose we change our specification to allow any number of numbers on a
line in the file (separated by commas), rather than one per line.
Python Programming, 2/e
The University of Western Australia
78
Nested Loops
æ  At the top level, we will use a file-processing loop that computes a running
sum and count.
sum = 0.0
count = 0
line = infile.readline()
while line != "":
#update sum and count for values in line
line = infile.readline()
print("\nThe average of the numbers is", sum/count)
Python Programming, 2/e
The University of Western Australia
79
Nested Loops
æ In the next level in we need to update the sum
and count in the body of the loop.
æ Since each line of the file contains one or more
numbers separated by commas, we can split the
string into substrings, each of which represents
a number.
æ Then we need to loop through the substrings,
convert each to a number, and add it to sum.
æ We also need to update count.
Python Programming, 2/e
The University of Western Australia
80
Nested Loops
æ  for xStr in line.split(","):
sum = sum + eval(xStr)
count = count + 1
æ  Notice that this for statement uses line, which is also the loop control
variable for the outer loop.
Python Programming, 2/e
The University of Western Australia
81
Nested Loops
# average7.py
#
Computes the average of numbers listed in a file.
#
Works with multiple numbers on a line.
import string
def main():
fileName = input("What file are the numbers in? ")
infile = open(fileName,'r')
sum = 0.0
count = 0
line = infile.readline()
while line != "":
for xStr in line.split(","):
sum = sum + eval(xStr)
count = count + 1
line = infile.readline()
print("\nThe average of the numbers is", sum / count)
Python Programming, 2/e
The University of Western Australia
82
Nested Loops
æ The loop that processes the numbers in each
line is indented inside of the file processing loop.
æ The outer while loop iterates once for each line
of the file.
æ For each iteration of the outer loop, the inner
for loop iterates as many times as there are
numbers on the line.
æ When the inner loop finishes, the next line of the
file is read, and this process begins again.
Python Programming, 2/e
The University of Western Australia
83
Nested Loops
æ  Designing nested loops –
•  Design the outer loop without worrying about what goes inside
•  Design what goes inside, ignoring the outer loop.
•  Put the pieces together, preserving the nesting.
Python Programming, 2/e
The University of Western Australia
84