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