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
forloop is equivalent to:
print(2)
print(3)
print(5)
- And the
forloop’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
rangeproduces 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
rangefunction.
- 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 + 1becauserangeproduces 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 + 1Solution
Code line # totalanimal1 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
totalwith 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
animaltakes the value ‘cat’, andtotalretains 0.- Line 3 increments
totalby 1, making it 1, andanimalretains the value ‘cat’.- Line 2 is the second iteration, where
animaltakes the value ‘dog’, andtotalretains 1.- Line 3 increments
totalby 1, making it 2, andanimalretains the value ‘dog’.- Line 2 is the third iteration, where
animaltakes the value ‘elephant’, andtotalretains 2.- Line 3 increments
totalby 1, making it 3, andanimalretains the value ‘elephant’.- Line 2 is the fourth iteration, where
animaltakes the value ‘fish’, andtotalretains 3.- Line 3 increments
totalby 1, making it 4, andanimalretains the value ‘fish’.After the program finishes,
totalis 4, andanimalretains 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
resultis an empty string because we use it to build or accumulate on our reverse string.charis the loop variable fororiginal.- For each iteration of the loop,
chartakes on one value (character) fromoriginal.- Add
charto the beginning ofresultto 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 thingSolution
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
NameErrordo 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 rangeThe problem is that
4points 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
forloop must end with a colon, and the body must be indented.Indentation is always meaningful in Python.
A
forloop 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
rangeto iterate over a sequence of numbers.