For Loops
Overview
Teaching: 20 min
Exercises: 20 minQuestions
How can I make a program repeat a task?
Objectives
Explain what for loops are normally used for.
Trace the execution of a simple (unnested) loop and correctly state the values of variables in each iteration.
Write for loops that use accumulator values.
A for loop executes commands once for each value in a collection
- Doing calculations on the values in a list one by one
is as painful as working with
temperature_001
,temperature_002
, etc. - A for loop tells Python to execute some statements once for each value in a list, a character string, or some other collection.
- “for each thing in this group, do these operations”
for number in [2, 3, 5]:
print(number)
- This
for
loop is equivalent to:
print(2)
print(3)
print(5)
- And the
for
loop’s output is:
2
3
5
- The variable name ‘number’ is a name that you choose, when you create the for loop.
- You can choose any variable name you want.
- But don’t use an already existing variable name, as this will then be overwritten.
- The variable persists after the loop is done and will contain the last used value.
- In the case above, ‘number’ will contain the integer 5 after the for loop is finished.
The first line of the for
loop must end with a colon, and the body must be indented
- The colon at the end of the first line signals the start of a block of statements.
- Python uses indentation to show nesting (rather than
{}
orbegin
/end
, which are used in some other programming languages).- Any consistent indentation is legal, but almost everyone uses four spaces or tab.
- IDEs like Jupyter Lab will automatically create an indentation after the colon.
for number in [2, 3, 5]:
print(number)
print(number)
^
IndentationError: expected an indented block after 'for' statement on line 1
- Indentation is always meaningful in Python.
firstName = "Jon"
lastName = "Smith"
lastName = "Smith"
^
IndentationError: unexpected indent
- This error can be fixed by removing the indentation at the beginning of the second line.
A for
loop is made up of a collection, a loop variable, and a body
for number in [2, 3, 5]:
print(number)
- The collection,
[2, 3, 5]
, is what the loop is being run on. - The body,
print(number)
, specifies what to do for each value in the collection. - The loop variable,
number
, is what changes for each iteration of the loop.
Loop variable names follow the normal variable name conventions
- Loop variables will:
- Be created on demand during the course of each loop.
- Persist after the loop finishes.
- Often be used in the course of the loop.
- So give them a meaningful name you’ll understand as the body code in your loop grows.
- Example:
for single_letter in ['A', 'B', 'C', 'D']:
instead offor asdf in ['A', 'B', 'C', 'D']:
.
- Use a new variable name to avoid overwriting a data collection you need to keep for later
The body of a loop can contain many statements
- You can have as much code as you like inside of a loop.
- But keep in mind, the more code you have, the more difficult it can be to keep track of.
numbers = [2, 3, 5]
for n in numbers:
squared = n ** 2
cubed = n ** 3
print("The number", n, "squared is:", squared, ", and the number", n, "cubed is:", cubed)
The number 2 squared is: 4 , and the number 2 cubed is: 8
The number 3 squared is: 9 , and the number 3 cubed is: 27
The number 5 squared is: 25 , and the number 5 cubed is: 125
Use range
to go through a sequence of numbers
- The built-in function
range
produces a sequence of numbers.- Not a list: the numbers are produced on demand to make looping over large ranges more efficient.
range(N)
is the numbers 0, 1, 2, … N-1
print('A range is not a list: range(0, 3)')
for number in range(0, 3):
print(number)
A range is not a list: range(0, 3)
0
1
2
Or use range
to repeat an action a set number of times
- You don’t actually have to use the iterable variable’s value.
- Use this structure to simply repeat an action some number of times.
- That number of times goes into the
range
function.
- That number of times goes into the
for number in range(5):
print("Again!")
Again!
Again!
Again!
Again!
Again!
Using accumulator variables
- A common pattern in programs is to:
- Initialize an accumulator variable to zero, the empty string, or the empty list.
- Update the variable with values from a collection.
# Sum all of the integers from 1 to 10.
total = 0
for number in range(10):
total = total + (number + 1)
print(total)
55
- Read
total = total + (number + 1)
as:- Add 1 to the current value of the loop variable
number
.- We have to add
number + 1
becauserange
produces the numbers 0…9, not 1…10.
- We have to add
- Add that to the current value of the accumulator variable
total
. - Assign that to
total
, replacing the current value.
- Add 1 to the current value of the loop variable
Exercises
Classifying Errors
Is an indentation error a syntax error or a runtime error?
Solution
It is a syntax error. The problem has to do with the placement of the code, not its logic.
Tracing Execution
Create a table showing the numbers of the lines that are executed when this program runs, and the values of the variables after each line is executed.
total = 0 for animal in ['cat', 'dog', 'elephant', 'fish']: total = total + 1
Solution
Code line # total
animal
1 0 N/A 2 0 'cat' 3 1 'cat' 2 1 'dog' 3 2 'dog' 2 2 'elephant' 3 3 'elephant' 2 3 'fish' 3 4 'fish' Explanation:
- Line 1 initializes the variable
total
with a value of 0.- Line 2 begins a for loop that iterates over the list
['cat', 'dog', 'elephant', 'fish']
.
- Line 2 is the first iteration, where
animal
takes the value ‘cat’, andtotal
retains 0.- Line 3 increments
total
by 1, making it 1, andanimal
retains the value ‘cat’.- Line 2 is the second iteration, where
animal
takes the value ‘dog’, andtotal
retains 1.- Line 3 increments
total
by 1, making it 2, andanimal
retains the value ‘dog’.- Line 2 is the third iteration, where
animal
takes the value ‘elephant’, andtotal
retains 2.- Line 3 increments
total
by 1, making it 3, andanimal
retains the value ‘elephant’.- Line 2 is the fourth iteration, where
animal
takes the value ‘fish’, andtotal
retains 3.- Line 3 increments
total
by 1, making it 4, andanimal
retains the value ‘fish’.After the program finishes,
total
is 4, andanimal
retains its value from the last iteration, which is ‘fish’.
Reversing a String
Fill in the blanks in the program below so that it prints “nit” (the reverse of the original character string “tin”).
original = "tin" result = ____ for char in original: result = ____ print(result)
Solution
result
is an empty string because we use it to build or accumulate on our reverse string.char
is the loop variable fororiginal
.- For each iteration of the loop,
char
takes on one value (character) fromoriginal
.- Add
char
to the beginning ofresult
to change the order of the string.- Our loop code should look like this:
original = "tin" result = "" for char in original: result = char + result print(result)
If you were to explain the loop step by step, the iterations would look something like this:
#First loop char = "t" result = "" char + result = "t" #Second loop char = "i" result = "t" char + result = "it" #Third loop char = "n" result = "it" char + result = "nit"
Practice Accumulating
Fill in the blanks in each of the programs below to produce the indicated result.
# Total length of the strings in the list: ["red", "green", "blue"] => 12 total = 0 for word in ["red", "green", "blue"]: ____ = ____ + len(word) print(total)
Solution
# Total length of the strings in the list: ["red", "green", "blue"] => 12 total = 0 for word in ["red", "green", "blue"]: total = total + len(word) print(total)
# List of word lengths: ["red", "green", "blue"] => [3, 5, 4] lengths = ____ for word in ["red", "green", "blue"]: lengths.____(____) print(lengths)
Solution
# List of word lengths: ["red", "green", "blue"] => [3, 5, 4] lengths = [] for word in ["red", "green", "blue"]: lengths.append(len(word)) print(lengths)
# Concatenate all words: ["red", "green", "blue"] => "redgreenblue" words = ["red", "green", "blue"] result = ____ for ____ in ____: ____ print(result)
Solution
# Concatenate all words: ["red", "green", "blue"] => "redgreenblue" words = ["red", "green", "blue"] result = "" for word in words: result = result + word print(result)
# Create acronym: ["red", "green", "blue"] => "rgb" # write the whole thing
Solution
acronym = '' colours = ["red", "green", "blue"] for colour in colours: acronym = acronym + colour[0] print(acronym)
Cumulative Sum
Reorder and properly indent the lines of code below so that they print an array with the cumulative sum of data. The result should be
[1, 3, 5, 10]
.cumulative += [sum] for number in data: cumulative = [] sum += number print(cumulative) sum = 0 data = [1,2,2,5]
Solution
data = [1,2,2,5] cumulative = [] sum = 0 for number in data: sum += number cumulative += [sum] print(cumulative)
[1, 3, 5, 10]
Identifying Variable Name Errors
- Read the code below and try to identify what the errors are without running it.
- Run the code and read the error message. What type of
NameError
do you think this is? Is it a string with no quotes, a misspelled variable, or a variable that should have been defined but was not?- Fix the error.
- Repeat steps 2 and 3, until you have fixed all the errors.
for number in range(10): # use a if the number is a multiple of 3, otherwise use b if (Number % 3) == 0: message = message + a else: message = message + "b" print(message)
Identifying Item Errors
- Read the code below and try to identify what the errors are without running it.
- Run the code, and read the error message. What type of error is it?
- Fix the error.
seasons = ['Spring', 'Summer', 'Fall', 'Winter'] print('My favorite season is ', seasons[4])
Solution
It is an index error:
IndexError: list index out of range
The problem is that
4
points to an item that doesn’t exist in the list. Remember the first item of a list in Python is0
.
Replaceseasons[4]
withseasons[0]
,seasons[1]
,seasons[2]
orseasons[3]
to have the different items of the list printed.
Key Points
A for loop executes commands once for each value in a collection.
The first line of the
for
loop must end with a colon, and the body must be indented.Indentation is always meaningful in Python.
A
for
loop is made up of a collection, a loop variable, and a body.Loop variables can be called anything (but it is strongly advised to have a meaningful name to the looping variable).
The body of a loop can contain many statements.
Use
range
to iterate over a sequence of numbers.