什么是迭代器,Python迭代器及其用法

如题所述

在之前的章节中,我们对列表、元组、字典和集合等序列容器进行了详细讲解。值得注意的是,这些容器都具备一个共同的特点,即支持使用 for 循环进行元素遍历,因此它们也被称为迭代器。

从字面上理解,迭代器是指支持迭代的容器,更准确地讲,是支持迭代的容器类对象。这里的容器可以是 Python 提供的基础容器,如列表、元组等,也可以是自定义的容器类对象,只要它们支持迭代即可。

在前一章节中,我们已经学会了如何自定义一个序列类,但该序列类对象并不支持迭代,因此不能称之为迭代器。若要自定义实现一个迭代器,类中必须实现以下两个方法:

next(self):返回容器的下一个元素。

iter(self):该方法返回一个迭代器。

例如,以下程序自定义了一个简单的列表容器迭代器,支持迭代:

程序执行结果为:

除此之外,Python 内置的 iter() 函数也会返回一个迭代器,其语法格式如下:

其中,obj 必须是一个可迭代的容器对象,而 sentinel 作为可选参数,如果使用此参数,则 obj 必须是一个可调用对象,具体功能将在后续章节介绍。

可调用对象指的是该类的实例对象可以像函数一样直接使用“对象名()”的形式。通过在类中添加 call() 方法,可以将该类的实例对象编程可调用对象。有关 call() 方法的介绍将在后续章节中进行。

我们常用的是只有一个参数的 iter() 函数,通过传入一个可迭代的容器对象,我们可以获得一个迭代器,然后通过调用迭代器中的 next() 方法实现迭代。例如:

运行结果为:

另外,也可以使用 next() 内置函数进行迭代,即 next(myIter),与 next() 方法作用相同。

从程序的执行结果可以看出,当迭代完存储的所有元素后,如果继续迭代,则 next() 方法会抛出 StopIteration 异常。

这里介绍 iter() 函数的第二个参数的作用。如果使用该参数,则要求第一个 obj 参数必须传入可调用对象(可以不支持迭代)。当使用返回的迭代器调用 next() 方法时,它会通过执行 obj() 调用 call() 方法。如果该方法的返回值与第二个参数值相同,则输出 StopIteration 异常;反之,则输出 call() 方法的返回值。

例如,修改 listDemo 类如下所示:

程序执行结果为:

输出结果中,最终抛出 StopIteration 异常,是因为这里原本要输出的元素 1 与 iter() 函数的第二个参数相同。

迭代器本身是一个底层的特性和概念,在程序中并不常用。然而,它为生成器这一更有趣的特性提供了基础。有关生成器的相关知识将在后续章节中介绍。
温馨提示:答案为网友推荐,仅供参考
相似回答
大家正在搜