Python Iterators

From NovaOrdis Knowledge Base
Jump to navigation Jump to search

External

Internal

TODO

TO PROCESS PyOOP "The Iterator Pattern" + "Iterators" + "The iterator protocol"

Overview

An iterator instance represents a stream of data.

The iterator instances are created from iterable objects with the built-in function iter():

l = ['a', 'b', 'c']
i = iter(l)

Once created, repeated invocations of the iterator's __next__() method, or by passing it to the built-in function next(), return successive items in the stream:

assert next(i) == 'a'
assert next(i) == 'b'
assert next(i) == 'c'

When no more data are available a StopIteration exception is raised instead. At this point, the iterator object is exhausted and any further calls to its __next__() method just raise StopIteration again. There's no has_next() method that tests the availability of a next item without consuming it. Unavailability of a next item is tested by checking the StopIteration exception.

try:
    while True:
        arg = next(i)
        print(arg)
except StopIteration:
    pass

If you are OK to always consume the next item, the end of the iterator can be tested with:

...
next(i, None) is not None

Iterators and Dictionaries

Applying iter() to a dictionary returns a key iterator.

d = {'k1': 'v1', 'k2': 'v2'}
i = iter(d)
keys = set()
keys.add(next(i))
keys.add(next(i))
assert len(keys) == 2
assert 'k1' in keys
assert 'k2' in keys

Removing an Element while Iterating

It does not seem that Python iterators can remove elements while iterating, similar to Java's Iterator.remove(). To achieve the same behavior, use a list and remove an element while iterating the list.

itertools

The Standard Library itertools module has a collection of generators for many common data algorithms. TODO:

The Iterator Protocol