Loops

Let’s review the while loop:

  • while a test is True, keep doing a suite of things

>>> x = 4
>>> while x > 0:
...     print(x)
...     x = x - 1
...
4
3
2
1

We can imagine iterating over a list using the following:

>>> counts = [1, 2, 3, 4, 5]
>>> i = 0
>>> while i < len(counts):
...     count = counts[i]
...     print(count)
...     i = i + 1
...
1
2
3
4
5

But honestly, that’s a bit of a pain, because we are going to do this a lot, so we have a way of spelling that in a cleaner format:

>>> counts = [1, 2, 3, 4, 5]
>>> for count in counts:
...     print(count)
...
1
2
3
4
5

Suites of Commands

Python is one of only a small number of languages that uses indentation to control what is “inside” a loop or if-statement. Most languages use {} braces or pairs of words, such as do and done.

for var in a,b,c,d
do
    echo "Variable is ${var}"
    ls ${var}
done
#! /usr/bin/env python
# iterforxiny.py

from __future__ import print_function
measurements = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

print('Squares')
total = 0
for item in measurements:
    print(item, item ** 2)
    total += item **2
print('Sum of Squares:', total)
  • loops can “nest” further loops (or other structures)

#! /usr/bin/env python
# iternest.py

from __future__ import print_function
rows = [
    ['Lightseagreen Mole', 24.0, -0.906, 0.424, -2.13, 0.0, 'green'],
    ['Indigo Stork', 51.0, 0.67, 0.742, 0.9, 9.0, 'yellow'],
]

for i,row in enumerate( rows ):
    print('rows[{}]'.format( i ))
    for measurement in row[1:-1]:
        print('  {}'.format( measurement ))

Note

The enumerate function we use in the above sample can be thought of as doing this:

result = []
for i in range( len( rows )):
    result.append( (i,rows[i]))
return result

but is actually implemented in a more efficient manner.

#! /usr/bin/env python
# iterfilter.py

from __future__ import print_function
measurements = range( 30 )

print('Odd Triple Squares')
total = 0
rest = 0
for item in measurements:
    if item == 25:
        print('25 is cool, but not an odd triple')
    elif item % 2 and not item % 3:
        print(item, item ** 2)
        total += item **2
print('Sum of Odd Triple Squares:', total)

Exercise

  • construct lists by iterating over other lists

  • use conditions to only process certain items in a list

  • use conditions and a variable to track partial results

#! /usr/bin/env python
# iterexercise.py

rows = [
    ['Lightseagreen Mole', 24.0, -0.906, 0.424, -2.13, 0.0, 'green'],
    ['Springgreen Groundhog', 77.0, 1.0, -0.031, -32.27, 25.0, 'red'],
    ['Blue Marten', 100.0, -0.506, 0.862, -0.59, 16.0, 'yellow'],
    ['Red Bobcat', 94.0, -0.245, 0.969, -0.25, 36.0, 'green'],
    ['Ghostwhite Falcon', 31.0, -0.404, 0.915, -0.44, 49.0, 'green'],
    ['Indigo Stork', 51.0, 0.67, 0.742, 0.9, 9.0, 'yellow'],
]


# Create 2 lists holding the first two columns of *numeric* data 
# (second and third columns)

# Print those items in the second column which are greater than 20 and less than 90

# Print the largest value in the third column