Python For Loops
Learn how to use for loops in Python to iterate over sequences and collections.
Python For Loops
A for loop is used for iterating over a sequence (that is either a list, a tuple, a dictionary, a set, or a string).
This is less like the for keyword in other programming languages, and works more like an iterator method as found in other object-orientated programming languages.
With the for loop we can execute a set of statements, once for each item in a list, tuple, set etc.
Example
fruits = ["apple", "banana", "cherry"]
for x in fruits:
print(x)The for loop does not require an indexing variable to set beforehand.
Looping Through a String
Even strings are iterable objects, they contain a sequence of characters:
Example
for x in "banana":
print(x)The break Statement
With the break statement we can stop the loop before it has looped through all the items:
Example - Exit the loop when x is "banana":
fruits = ["apple", "banana", "cherry"]
for x in fruits:
print(x)
if x == "banana":
breakExample - Exit the loop when x is "banana", but this time the break comes before the print:
fruits = ["apple", "banana", "cherry"]
for x in fruits:
if x == "banana":
break
print(x)The continue Statement
With the continue statement we can stop the current iteration of the loop, and continue with the next:
Example - Do not print banana:
fruits = ["apple", "banana", "cherry"]
for x in fruits:
if x == "banana":
continue
print(x)The range() Function
To loop through a set of code a specified number of times, we can use the range() function,
The range() function returns a sequence of numbers, starting from 0 by default, and increments by 1 (by default), and ends at a specified number.
Example
for x in range(6):
print(x)Note that range(6) is not the values of 0 to 6, but the values 0 to 5.
The range() function defaults to 0 as a starting value, however it is possible to specify the starting value by adding a parameter: range(2, 6), which means values from 2 to 6 (but not including 6):
Example
for x in range(2, 6):
print(x)The range() function defaults to increment the sequence by 1, however it is possible to specify the increment value by adding a third parameter: range(2, 30, 3):
Example
for x in range(2, 30, 3):
print(x)Else in For Loop
The else keyword in a for loop specifies a block of code to be executed when the loop is finished:
Example
for x in range(6):
print(x)
else:
print("Finally finished!")Note: The else block will NOT be executed if the loop is stopped by a break statement.
Example - Break the loop when x is 3, and see what happens with the else block:
for x in range(6):
if x == 3: break
print(x)
else:
print("Finally finished!")Nested Loops
A nested loop is a loop inside a loop.
The "inner loop" will be executed one time for each iteration of the "outer loop":
Example
adj = ["red", "big", "tasty"]
fruits = ["apple", "banana", "cherry"]
for x in adj:
for y in fruits:
print(x, y)The pass Statement
for loops cannot be empty, but if you for some reason have a for loop with no content, put in the pass statement to avoid getting an error.
Example
for x in [0, 1, 2]:
passPractical Examples
Iterating Over Dictionary
student = {"name": "John", "age": 25, "grade": "A"}
# Iterate over keys
for key in student:
print(key)
# Iterate over values
for value in student.values():
print(value)
# Iterate over key-value pairs
for key, value in student.items():
print(f"{key}: {value}")List Comprehension
# Traditional for loop
squares = []
for x in range(10):
squares.append(x**2)
# List comprehension (more Pythonic)
squares = [x**2 for x in range(10)]
print(squares)Enumerate Function
fruits = ["apple", "banana", "cherry"]
# Get both index and value
for index, fruit in enumerate(fruits):
print(f"{index}: {fruit}")
# Start enumeration from a different number
for index, fruit in enumerate(fruits, start=1):
print(f"{index}: {fruit}")Zip Function
names = ["Alice", "Bob", "Charlie"]
ages = [25, 30, 35]
cities = ["New York", "London", "Tokyo"]
# Iterate over multiple lists simultaneously
for name, age, city in zip(names, ages, cities):
print(f"{name} is {age} years old and lives in {city}")enumerate, zip, and range
These three built-ins cover most looping needs cleanly — reach for them instead of manual index counters.
fruits = ["apple", "banana", "cherry"]
for i, fruit in enumerate(fruits): # index + value
print(i, fruit) # 0 apple ...
names = ["Ann", "Bob"]
ages = [30, 25]
for name, age in zip(names, ages): # loop two lists together
print(name, age) # Ann 30 ...
for n in range(2, 11, 2): # start, stop, step
print(n) # 2 4 6 8 10Avoid for i in range(len(items)) just to index — use enumerate(items), which gives the index and the item together.
Looping a Dictionary and the for-else
scores = {"math": 90, "science": 85}
for subject, mark in scores.items():
print(subject, mark)
# for-else: else runs only if no break happened
for x in [1, 3, 5]:
if x % 2 == 0:
print("found an even")
break
else:
print("all odd") # this runsTry It Yourself
Exercise 1: Print each fruit with its position number starting at 1.
Show solution
for i, fruit in enumerate(["apple", "pear"], start=1):
print(i, fruit) # 1 apple / 2 pearExercise 2: Sum the numbers 1 to 100 with a loop.
Show solution
total = 0
for n in range(1, 101):
total += n
print(total) # 5050Key Takeaways
foriterates directly over any iterable.- Use
enumeratefor indexes,zipfor parallel lists,rangefor numbers. - Loop dictionaries with
.items().
📘 Real-World Deep Dive
The <code>for</code> loop is Python's universal iter-anything — lists, tuples, dicts, files, generators, async iterables. Knowing <code>enumerate/zip/itertools</code> is the difference between 1-line loops and 50-line scaffolding.
Real-Life Scenario
Process two parallel streams (timestamps and values) and build a tidy CSV-ready table.
Real-Life Example
import csv
from itertools import zip_longest
import io
timestamps = ["2026-08-20T09:00", "2026-08-20T10:00", "2026-08-20T11:00"]
values = [12, 19, 7]
labels = ["EUR/USD", "USD/JPY", "EUR/GBP"]
buf = io.StringIO()
writer = csv.writer(buf)
writer.writerow(["ts", "label", "value"])
for i, (ts, val) in enumerate(zip(timestamps, values)):
writer.writerow([ts, labels[i % len(labels)], val])
# Tidy cells, padded for human reading
buf.seek(0)
for row in csv.reader(buf):
print(f"{row[0]:<22} {row[1]:<10} {row[2]:>6}")Expected Output
ts label value
2026-08-20T09:00 EUR/USD 12
2026-08-20T10:00 USD/JPY 19
2026-08-20T11:00 EUR/GBP 7Common mistakes
- Mutating a list while iterating it changes indices and causes skipped or repeated elements.
range(len(xs))is rarely needed; useenumerate(xs)instead.- Reading with
for line in fileconsumes the file; usewith open(...)to guarantee closure.
🚀 Performance & Best Practices
- Use
whileonly when there's no natural iterable. for ... elseruns theelseblock when the loop completes withoutbreak— handy for search loops.- Generator expressions avoid keeping the whole list in memory:
sum(x*x for x in xs).
🧪 Try It Yourself
- Replace the loop body with a list comprehension and benchmark both.
- Use
zip_longestto handle missing values and pad with"n/a". - Stream a 1 M-row CSV and compute moving-window means in a single pass.