For, what is it good for?
A basic for loop
numbers = [1, 2, 5, -4, 12]
for number in numbers:
print(number * number)
Calculate the squares of a list of numbers
You loop over iterators*
* An iterator is something you iterate over, one item at a time. Could be a list, dictionary, tuple, string, generator
1
4
25
16
144
numbers = [1, 2, 5, -4, 12]
for i in range(len(numbers)):
print(numbers[i] * numbers[i])
You generally dont do this
Why? It assumes that numbers is something you can get the length of and that it is something you can index into.
And it isn't Pythonic
1
4
25
16
144
numbers = [1, 2, 5, -4, 12]
for i, number in enumerate(numbers, start=5):
print(i, number * number)
Use enumerate if you want a counter
numbers = [1, 2, 5, -4, 12]
for i, number in enumerate(numbers):
print(i, number * number)
You don't have to start at zero
0 1
1 4
2 25
3 16
4 144
5 1
6 4
7 25
8 16
9 144
enumerate
break
numbers = [1, 2, 5, -4, 12]
all_good = True
for number in numbers:
print(number)
if number < 0:
all_good = False
break
print(number * number)
if all_good:
print("All numbers were good!")
break gets you out of the inner most loop
1
4
25
numbers = [1, 2, 5, -4, 12]
for number in numbers:
if number < 0:
break
print(number * number)
else:
print("All numbers were good!")
else blocks gets run if there wasnt a break
1
4
25
numbers = [1, 2, 5, 12]
for number in numbers:
if number < 0:
break
print(number * number)
else:
print("All numbers were good!")
1
4
25
144
All numbers were good!
else
Remember comprehensions
numbers = [1, 2, 5, -4, 12]
new_list = []
for number in numbers:
if number % 2 == 0:
new_list.append(number)
print(new_list)
numbers = [1, 2, 5, -4, 12]
new_list = [number for number in numbers if number % 2 == 0]
print(new_list)
Why? Well it is one line, but then splitting lines might make it more readable.
Is one quicker than other?
[2, -4, 12]
[2, -4, 12]
Dictionaries
Default iterator on dictionary are the keys
people = {
'Sue': 'Jones', 'Bob': 'Smith', 'Alice': 'Frank',
'Jack': 'Abox', 'Mary': 'Mary'
}
for first_name in people:
print(first_name)
Sue
Bob
Alice
Jack
Mary
Just remember these are views not lists
people = {'Sue': 'Jones', 'Bob': 'Smith', 'Alice': 'Frank',
'Jack': 'Abox', 'Mary': 'Mary'}
print(len(people.items()))
print(people.items()[2])
5
Traceback (most recent call last):
File "forbyfor.py", line 4, in <module>
print(people.items()[2])
TypeError: 'dict_items' object is not subscriptable
Have .keys(), .values() and .items()
people = {
'Sue': 'Jones', 'Bob': 'Smith', 'Alice': 'Frank',
'Jack': 'Abox', 'Mary': 'Mary'
}
for first_name, last_name in people.items():
print(first_name, last_name)
Sue Jones
Bob Smith
Alice Frank
Jack Abox
Mary Mary
Don't alter what you are looking at
names = ['Sue', 'Bob', 'Alice', 'Jack', 'Mary']
for i in range(len(names)):
print(i, names[i])
if names[i] == 'Alice':
del names[i]
0 Sue
1 Bob
2 Alice
3 Mary
Traceback (most recent call last):
File "forbyfor.py", line 4, in <module>
print(names[i])
IndexError: list index out of range
Build a new thing instead
names = ['Sue', 'Bob', 'Alice', 'Jack', 'Mary']
new_names = []
for name in names:
if name != 'Alice':
new_names.append(name)
print(new_names)
Or work on a copy
names = ['Sue', 'Bob', 'Alice', 'Jack', 'Mary']
for position, name in enumerate(names[:]):
if name == 'Jack':
del names[position]
print(names)
['Sue', 'Bob', 'Jack', 'Mary']
['Sue', 'Bob', 'Alice', 'Mary']
Conclusion
for, what is it good for?
Absolutely looping
and there is while
For, what is it good for?
By Patrick Morris
For, what is it good for?
A short introduction to for loops in Python
- 87