Section 5.1: while loops, etc. CS 106

advertisement
Section 5.1: while loops, etc.
CS 106
While loop syntax
Q: The syntax for a while statement is:
while _______________ :
_____________
or, condition
A: while <boolean expression>:
<body>
Difference from for loop
Q: How often does a while loop execute its
<body>?
A: until the boolean condition is False.
Note: that’s how it differs from for loop.
while loop vs. for loop
Q: When would you use a while loop instead of
a for loop?
A: When you don't know how many times you
need to run the body of the loop.
For loop is definite iteration; while loop is
indefinite iteration.
Changing the condition
Q: Is there any way for a progammer to know if
they are creating an infinite loop?
Q: Suppose you have a while loop like this:
while var1 op var2:
<body>
Is it good/bad/ugly to alter the value of var1 or var2
in the body of the loop?
A: You almost *always* alter the value of var1 or
var2 in the body, or you would have an infinite loop.
(If you don’t have break in the loop body.)
Infinite Loops: useful?
Q: Would you ever intentionally use an infinite
loop, or is it just done by accident?
A: You might use it if you are programming a
server that is just supposed to run all the time
when the machine is running – like a web server.
It never has to stop.
Checking for item in list (p 162)
Q. What is bad about this loop (where you
search for item val in list data)?
found = False
for item in data:
if item == val:
found = True
A. Continues searching even after the item is found.
Checking for item in list (p 162)
Q. What is bad about this loop (where you
search for item val in list data)?
for item in data:
if item == val:
found = True
else:
found = False
A. It is wrong! If you find an item but there are more
items, you “reset” found to False.
Checking for item in list (p 162)
Q. Why have i < len(data) in this code?
i = 0
found = False
while i < len(data) and not found:
if data[i] == val:
found = True
else:
i = i + 1
A. This is index-based search. You have to make sure i does
not “go off” the end of the list, if val is not in the list.
While loops and user input
Q: What is bad about this code?
guests = []
name = raw_input(“Enter a name (blank to end): “)
while name != “”:
guests.append(name)
name = raw_input(“Enter a name (blank to end): “)
print “You entered”, len(guests), “guests.”
A: The line name = raw_input… has to be written
twice…
While loops and user input (2)
Q: What is bad about this fix?
guests = []
name = ‘fake’
while name != “”:
name = raw_input(“Enter a name (blank to end): “)
if name != “”:
guests.append(name)
print “You entered”, len(guests), “guests.”
A: We are now testing the “stop condition”
twice!
While loops and user input (3)
Q: What is wrong with this fix?
guests = []
name = ‘fake’
while name != “”:
name = raw_input(“Enter a name (blank to end): “)
guests.append(name)
print “You entered”, len(guests), “guests.”
A: We are now inserting the empty string at the
end of the guests list. Fix by adding
guests.pop() before the print statement.
While loops and user input (4)
Best solution: use break (duh!)
guests = []
while True:
name = raw_input(“Enter a name (blank to end): “)
if name == “”:
break
guests.append(name)
print “You entered”, len(guests), “guests.”
Using break in this manner allows you to do a “midloop” test. Otherwise, we can only do “pre-loop”
test.
Rewrite this code
number = 0
while not 1 <= number <= 10:
number = int(raw_input(“Enter a single digit: “))
if not 1 <= number <= 10:
print ‘Your number is not a single digit.’
Rewrite this code: Answer
while True:
number = int(raw_input(“Enter a single digit: “))
if 1 <= number <= 10:
break
else:
print ‘Your number is not a single digit.’
What is wrong with this code?
while i < j:
# or a for statement
someCode()
someMoreCode()
if some_condition():
break
continue
A: Don’t need continue at the end of a loop
body – it will go back to the top anyway!
Efficiency
Q: Are there instances where while loops are
more efficient than for loops?
A: No. Probably both are about the same
efficiency. (And we don’t care too much about
efficiency when programming in python.)
Why don’t the authors like
break/continue?
A: The authors are, perhaps, purists. It *is* nice
to be able to look at a loop and know that you
enter it from the top, and exit it when the loop
is all done (for) or the condition is False
(while). If you have break in the middle, you
create another “exit point”. There is a branch of
CS where you try to prove that code is correct,
with pre-conditions, mid-conditions, postconditions, etc. That goes out the door with
break.
Practice while loops
Problem: Convert the following into a while
loop:
for g in groceries:
print g
Answer:
i = 0
while i < len(groceries):
print groceries[i]
i += 1
Practice while loops
Problem: Convert the following into an indexbased loop:
for g in groceries:
print g
Answer:
for i in range(len(groceries)):
print groceries[i]
Average of numbers
Problem: write code to prompt the user for a
number, until the user enters “q”. When the
user enters “q”, print the average of the
numbers that were entered.
NOTE: try to do it without using a list.
Average of numbers
total = 0
numNums = 0
while True:
num = raw_input(“Enter a number, q=quit:”)
if num == “q”:
break
total += float(num)
numNums += 1
if numNums == 0:
print “No numbers entered”
else:
print “Average is “, float(total) / numNums
Old Slides
while loop vs. index-based for loop
for i in range(len(data)):
use data[i] in body
i = 0
while i < len(data):
use data[i] in body
i = i + 1
continue statement
• Used only within a loop body
– in loop body itself, or within a body within the
loop body.
– for while loops and for loops.
• Makes control go back to the top of the loop.
• Often used when code detects that nothing
else needs to be done with the current
element of the loop.
One use of continue: to filter
# Plot each earthquake, skipping comment lines
# and the header line.
for line in input_lines:
fields = line.split()
if len(fields) == 0: # skip blank line
continue
if fields[0].startsWith("#"): # skip comment lines
continue
if fields[0] == 'Src':
continue
# do stuff with fields.
break statement
• also used only in loop body -- for loop or while
loop.
• causes control to pass to first line after end of
loop body.
– i.e., you "break" out of the loop.
• useful for when searching through a sequence
until you find what you are looking for.
• allows you to make a “mid-loop test”.
Mid-loop test
• while statement is pre-loop test
• Other languages have post-loop test:
repeat:
do_stuff()
until <bool expr is False>
• Using while True and break, you can do mid-loop
test. (Useful for getting user input.)
while True:
do_stuff()
if <bool expr>:
break
do_other_stuff()
Example of use of break
# find if num is a prime
isPrime = True
# assume it is prime
for div in range(2, num / 2 + 1):
if num % div == 0: # divides with no remainder
# found a divisor so num is not prime
isPrime = False
break
# isPrime is True mean num is a prime number.
Example of use of break
# looking for first room with someone in it.
found = False
for room in rooms:
if not room.is_empty():
found = True
break
if found:
room.invite_to_dance_the_night_away()
Download