[Tutor] iterators

eryksun eryksun at gmail.com
Sat Jan 18 20:19:30 CET 2014


On Sat, Jan 18, 2014 at 4:22 AM, Chris “Kwpolska” Warrick
<kwpolska at gmail.com> wrote:
> For Python 2, use xrange() instead to get an iterator.  In Python 3,
> range() is already an iterator.

`xrange` and 3.x `range` aren't iterators. They're sequences. A
sequence implements `__len__` and `__getitem__`, which can be used to
implement an iterator, reversed iterator, and the `in` operator (i.e.
`__contains__`).

    class Sequence:

        def __len__(self):
            return 3

        def __getitem__(self, k):
            if k > 2:
                raise IndexError
            return k

    >>> seq = Sequence()
    >>> len(seq)
    3

    >>> type(iter(seq))
    <class 'iterator'>
    >>> list(seq)
    [0, 1, 2]

    >>> type(reversed(seq))
    <class 'reversed'>
    >>> list(reversed(seq))
    [2, 1, 0]

    >>> 0 in seq
    True
    >>> 3 in seq
    False

`xrange` and Py3 `range` both implement the following special methods:

    __len__
    __getitem__
    __iter__
    __reversed__

3.x `range` also implements:

    __contains__
    index
    count

Neither supports sequence concatenation or repetition. Both are
manually registered as a subclass of the abstract class
`collections.Sequence`.

    >>> issubclass(range, collections.Sequence)
    True

http://docs.python.org/3/library/collections.abc


More information about the Tutor mailing list