Python类的迭代器

Python的类有一个很有意思的属性:迭代器(Iterator)。迭代器是Python中的一个很方便的方法,它应用于所有可以迭代的对象,使用迭代的方法输出对象的内容。比较常见的对象如String、List、Set和tuple,都可以使用迭代器Iterator。甚至你还可以定义自己的可迭代对象。

一、迭代器的应用实例

List类是可迭代对象,我们看一下它是如何应用迭代器的。如下。
代码1:

>>> str
'Iteration'
>>> for e in str:
    print(e)
(下面是输出)
I
t
e
r
a
t
i
o
n

这个例子用的对象是String(“Iteration”),只使用一个for语句就可以逐个打印出类的内容,这里的内容就是一个个的单字符String。如果对象没有可以被迭代的内容了,他就会抛出一个“StopIteration”异常,for语句收到了这个异常就结束循环。

同样的,也可以对其他的几个基本类做迭代操作,步骤是类似的,您可以自己去实验。

二、在自定义类中用迭代器

以上几种Python的基本类,已经定义好了实现Iterator的函数,不需要做其他的设置就能直接使用。Python提供了2个成员函数,可以帮助我们实现自定义类的Iterator——他们分别是iter()和next()。在自定义类中增加这两个成员函数,iter()直接返回类self,next()实现检索并返回内容的逻辑。需要注意的是,如果按照next()中的逻辑,迭代到了最后一个返回值,之后再调用迭代器应该抛出异常:StopIteration,而这个异常需要在next()里由raise函数抛出。只要执行到了raise StopIteration,迭代就会终止。
如下是Python官网上的例子:

class Reverse:
    """Iterator for looping over a sequence backwards."""
    def __init__(self, data):
        self.data = data
        self.index = len(data)

    def __iter__(self):
        return self

    def __next__(self):
        if self.index == 0:
            raise StopIteration
        self.index = self.index - 1
        return self.data[self.index]

rev = Reverse(‘spam’)
>>> iter(rev)
<main.Reverse object at 0x00A1DB50>
>>> for char in rev:
… print(char)

m
a
p
s

在这里,有一个稍微复杂一点的迭代器,是我在遍历KD树时写的。遍历二叉树可以用递归法(前序、中序或后序遍历),也可以用队列来实现。而在我这个例子中使用了Python的迭代器,结果主流程显得异常简洁和漂亮。