If you’re coming to this tutorial as a complete Python beginner, make sure you are familiar with the Python concepts covered in our Python for complete beginners tutorial, and with dictionaries and lists.
Getting started with Python for loops - A comprehensive guide with exercises
- python
- loops
- syntax
- programming
Introduction
So you know how to create variables in Python, as well as how to create lists and dictionaries to store multiple items in a single variable? Then you are ready to learn about loops.
A loop is a piece of code that tells Python to repeat a specified set of actions multiple times. Loops are a fundamental part of most programming languages, and let you achieve a lot with just a few lines of code. Often, they iterate over collections of data (such as data held in dictionaries or lists) and carry out all sorts of operations on those collections.
Why are loops useful? Let’s look at a quick example:
Imagine you have a list of numbers, and you want to find every number higher than 10. Without a loop, the code is very long and repetitive:
my_list = [3, 10.1, 62, 9]if my_list[0] > 10:print(my_list[0])if my_list[1] > 10:print(my_list[1])if my_list[2] > 10:print(my_list[2])if my_list[3] > 10:print(my_list[3])## Output:10.162
With a for loop, we can do it in just three lines of code:
for number in my_list:if number > 10:print(number)## Output:10.162
Let’s dive into the world of for loops in Python, and learn how to code them and what we can do with them.
There are two types of loops in Python:
- while-loops repeat while a certain condition is true and exit once the condition is false.
- for-loops iterate over a sequence or collection of data and exit when they reach the end of the sequence/collection. This tutorial concerns only for loops.
Before you start
To complete the actions presented below, you must have:
- Installed Python on your machine
- Knowledge of how to execute Python commands and see their output, using for example either the Python Interactive Shell, a text editor and the terminal, or another method such as Jupyter notebook
- Familiarity with the basics of if statements, operators, lists, and dictionaries in Python
For loop syntax and basic examples
The syntax for a for loop is as follows:
for element in iterable-object:statement(s)
Here are some basic examples of loops iterating over different types of objects:
my_list = ["red", "blue", "yellow"]for color in my_list:print(color)## output:redblueyellow
word = "hello"for letter in word:print(letter)## output:hello
product_dict = {"bread": 1.5, "jam": 2.75, "butter": 0.99}for product in product_dict:print(product)### output:breadjambutterfor product in product_dict:print(product_dict.get(product))### output:1.52.750.99
for x in range (1, 4):print(x)## output:123
Ingredients of a for loop (see the syntax above):
- for: this keyword is required to start a loop
- element: after the
for
keyword, we can use any variable name we want. This variable will simply access each item of the sequence on each iteration. In the examples above you can see that we’ve called it variouslyelement
,color
,letter
,product
, andx
. Anything works, but generally you should try to give this variable a meaningful name: it will make your code easier to read for yourself and anyone else who looks at it. - in: this keyword is required to introduce the object you want to iterate over in the loop
- iterable-object: after the
in
keyword, state the object you want to iterate over. This can be any iterable object, including lists, strings, dictionaries, ranges, tuples, and sets. - The for statement must end with a colon, followed by a line return and indentation.
- statement(s): One or more actions to be carried out on every iteration of the loop. In the examples above we simply use a print statement, but anything is possible.
Basic exercises
When working with loops, you will probably find it more practical to use a text editor and the terminal or Jupyter notebook / other IDE, rather than the Python Interactive Shell.
-
Run the following code to get started with your first loop, making sure to include all the necessary syntax such as the colon and indentation:
my_list = ["red", "blue", "yellow"]for color in my_list:print(color) -
Run the following loop, to see how you can define the iterable object directly in the loop statement itself:
for country in ["France", "Japan", "USA"]:print(country) -
Using the example of a loop with a range as shown above, create a loop that prints out the numbers 1 to 6. The output should look like this:
123456Answer below.
-
Using the example of looping over a string as shown above, create a loop that prints out the letters A B C D E. The output should look like this:
ABCDEAnswer below.
-
Using the example of looping over a dictionary as shown above, create a dictionary
{"France": "Paris", "Japan": "Tokyo", "USA": "Washington DC"}
, then:- Create a loop that prints out the names of the countries
- Create a loop that prints out the names of the capital cities
The output should look like this:
FranceJapanUSAParisTokyoWashington DCAnswer below.
For loops with an if/else statement
We can use an if/else statement inside the loop to deal with different possibilities:
for number in [1, 10, 9, 4]:if number > 5:print(number, " is greater than 5")else:print(number, " is not greater than 5")## Output:1 is not greater than 510 is greater than 59 is greater than 54 is not greater than 5
Note that in the example above, we can print a variable and some text in the same string by separating them with commas and putting the text in quotation marks:
print(variable_name, " text you want here", another_variable_name, " more text here")
If/else exercises
-
Create a loop that iterates over the list
[1, 10, 9, 4]
and checks whether each number is greater than 3. The output should look like this:1 is not greater than 310 is greater than 39 is greater than 34 is greater than 3Answer below.
-
Create a loop that iterates over the list
["France", "Japan", "the USA"]
and searches for “the USA” in the list. The output should look like this:This country is not the USAThis country is not the USAThis country is the USAAnswer below.
-
Create a loop that iterates over the list
[-1, 2, 3, 0, -4]
and checks whether each number is positive or negative. The output should look like this:-1 is a negative number2 is a positive number3 is a positive number0 is neither positive nor negative-4 is a negative numberAnswer below.
For loops with a range() function
As we saw in an earlier example we can use loops with Python’s built-in range()
function to state exactly how many times we want the loop to iterate.
This function can be used in many ways:
With just one parameter, the range starts at a default of 0 and finishes at (not including) the specified number:
for x in range(3):print(x)## Output:012
With two parameters, we set the start and finish numbers of the range:
for x in range(2, 6):print(x)## Output:2345
With three parameters, we set the start and finish numbers of the range, and the step value (the interval between each iteration):
for x in range(2, 10, 2):print(x)## Output:2468
Range exercises
-
Create a loop that iterates over a range and produces the following output:
56789Answer below.
-
Create a loop that iterates over a range and produces the following output:
0255075Answer below.
-
Create code that includes a loop that iterates over a range, and produces the following output:
Counting down...54321Go!Answer below.
Nested for loops
We can use a loop inside another loop: this is called a nested loop. This is useful if, for example, you want to loop through a list of lists:
groups = [["Kendall", "Shiv", "Roman"], ["Logan", "Ewan", "Gerri"], ["Tom", "Greg"]]# this first loop iterates through each group:for group in groups:# this second loop iterates through the people in each group:for person in group:## we can access both the 'group' and 'person' variables here!print(person, "is in the group", group)## Output:Kendall is in the group ['Kendall', 'Shiv', 'Roman']Shiv is in the group ['Kendall', 'Shiv', 'Roman']Roman is in the group ['Kendall', 'Shiv', 'Roman']Logan is in the group ['Logan', 'Ewan', 'Gerri']Ewan is in the group ['Logan', 'Ewan', 'Gerri']Gerri is in the group ['Logan', 'Ewan', 'Gerri']Tom is in the group ['Tom', 'Greg']Greg is in the group ['Tom', 'Greg']
Nested loop exercises
-
Create code with a nested loop based on the list of lists
[["apple", "orange"], ["carrot", "cabbage"], ["chicken", "beef"]]
and produces the following output:appleorangecarrotcabbagechickenbeefAnswer below.
-
Create code with a nested loop based on the list of lists
[["go", "went", "gone"], ["see", "saw", "seen"], ["take", "took", "taken"]]
that produces the following output:The conjugations of go are:gowentgoneThe conjugations of see are:seesawseenThe conjugations of take are:taketooktakenAnswer below.
-
Create code with a nested loop that searches the list of lists
[["50", "48", "-40"], ["57", "99", "80"], ["49, 40, 45"]]
and prints out all the numbers greater than or equal to 50. The output should look like this:50579980Answer below.
Break and continue statements in for loops
A break
statement can be used to exit a loop before all the iterations have finished. We might want to do this when a certain condition is met, and there is no value to continuing to loop.
In the example below, we want to check whether a list contains the word “bingo”:
words = ["tennis", "poker", "bingo", "chess"]for word in words:if word == "bingo":print("The list contains the word bingo")break## Output:The list contains the word bingo
Alternatively, a continue
statement can be used to skip the remaining code inside the loop for the current iteration. We might want to do this when a certain condition is not met, and there is no value to continuing the rest of the code for this iteration.
In the example below we want to find words with first letter “b” and last letter “o”:
words = ["tennis", "poker", "bingo", "chess"]for word in words:if word[0] != "b":continueelse:if word[-1] == "o":print("The word", word, "starts with b and ends with o")## Output:The word bingo starts with b and ends with o.
Break and continue exercises
-
Create a loop to check whether the list
[3, 5, 11, 12, 1]
contains at least one number higher than 10, and print “This list contains a number higher than 10” if it does. Include a break statement. The output should be as follows:This list contains a number higher than 10Answer below.
-
Create a loop to check whether the list of lists
[[1, 3, 9], [3, 2], [4, 2]
contains any lists that a) contain exactly two items, and b) the sum of the items is not greater than 5. Include a continue statement. The output should be as follows:[3, 2] contains two items which have a sum no greater than 5Answer below.
Manipulating variables with for loops
Let’s imagine we want to check whether a particular word is in a list. We could use a loop as shown below:
words = ["tennis", "poker", "bingo", "chess"]for word in words:if word == "bingo":print("bingo is in the list")## output:bingo is in the list
However, there are two problems:
- If the word “bingo” was in the list multiple times, we risk printing the statement multiple times when it is not necessary (though we could solve this with a break statement)
- If the word “bingo” wasn’t on the list, nothing would be printed. This is not very explicit and might lead us to wonder if the code worked properly or not.
We can improve this by using a variable that we create outside the loop and conditionally modify inside the loop. It then has a useful, meaningful value once the loop has finished:
words = ["tennis", "poker", "bingo", "chess"]bingo_in_list = Falsefor word in words:if word == "bingo":bingo_in_list = Trueif bingo_in_list == True:print("The list contains the word bingo")else:print("The list does not contain the word bingo")## Output:The list contains the word bingo
Another common practice is to instantiate a variable outside a list, and use it to “collect” certain information from inside the loop. The following example shows how we can create a list containing all the words beginning with C from another list:
words = ["deranged", "anger", "cowardly", "things", "abject", "cuddly", "rhyme", "bed", "harm"]c_words = []for word in words:if word[0] == "c":c_words.append(word)print(c_words)## Output:['cowardly', 'cuddly']
It is bad practice to modify a list (or dictionary, or any other sequence) while you are iterating over it. For example, we could try to achieve the above task by removing words in the list when they do not start with c, but as words are removed mid-loop, the length of the list changes and this confuses the iterator, which ends up missing out some words as according to their index postion, they have already been checked. The output would therefore be inaccurate.
For this reason, you should always follow the example above, and use separate variables to collect data from the sequence you are iterating over.
Variable exercises
-
Create code that includes a loop which iterates over the list
[1, 5, 2, 6]
and prints “The sum of the numbers in the list is 14” at the end. Use the+=
operator, and a variable which is instantiated outside the loop, but modified inside it.The sum of the numbers in the list is 14Answer below
-
Create code that includes a loop which iterates over the list
[1, 5, 2, 6]
and prints “The highest number in this list is 6” at the end. Use a variable which is instantiated outside the loop, but modified inside it.The highest number in the list is 6Answer below
-
Create code that includes a loop which iterates over the list
[3, 6, 1, 2, 5]
and creates a new list calleddoubled
which holds the double of each number, i.e.[6, 12, 2, 4, 10]
and prints it. Use a variable which is instantiated outside the loop, but modified inside it.[6, 12, 2, 4, 10]Answer below
-
Create code that includes a loop which iterates over the dictionary
{"bread": 1.5, "jam": 2.75, "butter": 0.99, "sugar": "0.75"}
and creates two lists as shown below. Print both lists at the end. Use variables which are instantiated outside the loop, but modified inside it.Items that cost less than 1 euro: [butter, sugar]Items that cost more than (or exactly) 1 euro: [bread, jam]Answer below
Answers
The name of the loop variable (x
, country
, number
etc.) could be different in your answers.
Basic exercises: answers
3: Create a loop with a range statement, that prints out the numbers 1 to 6:
for x in range(1,7):print(x)## output:123456
4: Create a loop that prints out the letters A B C D E:
for x in "ABCDE":print(x)## output:ABCDE
5a: Create a dictionary {"France": "Paris", "Japan": "Tokyo", "USA": "Washington DC"}
, then create a loop that prints out the name of the countries, then another that prints out the names of the capital cities.
countries = {"France": "Paris", "Japan": "Tokyo", "USA": "Washington DC"}for country in countries:print(country)## output:FranceJapanUSAfor country in countries:print(countries.get(country))## output:ParisTokyoWashington DC
If/else exercises: answers
1: Create a loop that iterates over the list [1, 10, 9, 4]
and checks whether each number is greater than 3:
numbers = [1, 10, 9, 4]for number in numbers:if number>3:print(number, "is greater than 3")## output:1 is not greater than 310 is greater than 39 is greater than 34 is greater than 3
2: Create a loop that iterates over the list ["France", "Japan", "the USA"]
and searches for “the USA” in the list:
countries = ["France", "Japan", "the USA"]for country in countries:if country=="the USA":print("This country is the USA")else:print("This country is not the USA")## output:This country is not the USAThis country is not the USAThis country is the USA
3: Create a loop that iterates over the list [-1, 2, 3, 0, -4]
and checks whether each number is positive or negative:
numbers = [-1, 2, 3, 0, -4]for number in numbers:if number > 0:print(number, "is a positive number")elif number < 0:print(number, "is a negative number")else:print(number, "is neither positive nor negative")## output:-1 is a negative number2 is a positive number3 is a positive number0 is neither positive nor negative-4 is a negative number
Range exercises: answers
1: Create a loop that iterates over a range and produces the output shown below:
for x in range(5,10):print(x)## output:56789
2: Create a loop that iterates over a range and produces the output shown below:
for x in range(0,100,25):print(x)## output:0255075
3: Create code that includes a loop that iterates over a range and produces the output shown below:
print("Counting down")for x in range(5,0,-1):print(x)print("Go!")## output:Counting down...54321Go!
Nested for loop exercises: answers
1: Create code with a nested loop based on the list of lists [["apple", "orange"], ["carrot", "cabbage"], ["chicken", "beef"]]
which produces the output shown below:
for group in foods:for item in group:print(item)## output:appleorangecarrotcabbagechickenbeef
2: Create code with a nested loop based on the list of lists [["go", "went", "gone"], ["see", "saw", "seen"], ["take", "took", "taken"]]
that produces the output shown below:
conjugations = [["go", "went", "gone"], ["see", "saw", "seen"], ["take", "took", "taken"]]for group in conjugations:print("The conjugations of ", group[0], " are:")for conjugation in group:print(conjugation)## output:The conjugations of go are:gowentgoneThe conjugations of see are:seesawseenThe conjugations of take are:taketooktaken
3: Create code with a nested loop that searches the list of lists [[50, 48, -40], [57, 99, 80], [49, 40, 45]]
and prints out all the numbers greater than or equal to 50:
numbers=[[50, 48, -40], [57, 99, 80], [49, 40, 45]]for group in numbers:for number in group:if number >=50:print(number)## output:50579980
Break and continue exercises: answers
1: Create a loop to check whether the list [3, 5, 11, 12, 1]
contains at least one number higher than 10, and print “This list contains a number higher than 10” if it does. Include a break statement. The output should be as shown below.
numbers = [3, 5, 11, 12, 1]for number in numbers:if number > 10:print("This list contains a number higher than 10")break
2: Create a loop to check whether the list of lists [[1, 3, 9], [3, 2], [4, 2]]
contains any lists that a) contain exactly two items, and b) the sum of the items is not greater than 5. Include a continue statement. The output should be as shown below:
numbers = [[1, 3, 9], [3, 2], [4, 2, 1, 3]]for group in numbers:if len(group) != 2:continueelif sum(group) <= 5:print(group, "contains two items which have a sum no greater than 5")## output:[3, 2] contains two items which have a sum no greater than 5
Variable exercises: answers
1: Create code that includes a loop which iterates over the list [1, 5, 2, 6]
and prints “The sum of the numbers in the list is 14” at the end. Use the +=
operator, and a variable which is instantiated outside the loop, but modified inside it.
numbers = [1, 5, 2, 6]sum_of_numbers = 0for number in numbers:sum_of_numbers += numberprint("The sum of numbers in the list is", sum_of_numbers)## output:The sum of the numbers in the list is 14
2: Create code that includes a loop which iterates over the list [1, 5, 2, 6]
and prints “The highest number in this list is 6” at the end. Use a variable which is instantiated outside the loop, but modified inside it.
numbers = [1, 5, 2, 6]max_number = numbers[0]for number in numbers:if number > max_number:max_number = numberprint("The highest number in the list is", max_number)## output:The highest number in the list is 6
3:. Create code that includes a loop which iterates over the list [3, 6, 1, 2, 5]
and creates a new list called doubled
which holds the double of each number, i.e. [6, 12, 2, 4, 10]
and prints it. Use a variable which is instantiated outside the loop, but modified inside it.
numbers = [3, 6, 1, 2, 5]doubled = []for number in numbers:doubled.append(number *2)print(doubled)## output:[6, 12, 2, 4, 10]
4: Create code that includes a loop which iterates over the dictionary {"bread": 1.5, "jam": 2.75, "butter": 0.99, "sugar": 0.75}
and creates two lists which are printed as shown below. Use variables which are instantiated outside the loop, but modified inside it.
items = {"bread": 1.5, "jam": 2.75, "butter": 0.99, "sugar": 0.75}less_1 = []more_1 = []for item in items:if items.get(item) < 1:less_1.append(item)else:more_1.append(item)print("Items that cost less than 1 euro:", less_1)print("Items that cost more than (or exactly) 1 euro:", more_1)## output:Items that cost less than 1 euro: ['butter', 'sugar']Items that cost more than (or exactly) 1 euro: ['bread', 'jam']