Python 迭代器

迭代器是遍历列表元组等集合的方法。使用迭代器方法,我们可以循环遍历一个对象并返回其元素。

从技术上讲,Python 迭代器对象必须实现两个特殊方法,__iter__()__next__(),它们统称为迭代器协议


遍历迭代器

在 Python 中,我们可以使用 next() 函数返回序列中的下一个项。

让我们看一个例子,

# define a list
my_list = [4, 7, 0]

# create an iterator from the list
iterator = iter(my_list)

# get the first element of the iterator
print(next(iterator))  # prints 4

# get the second element of the iterator
print(next(iterator))  # prints 7

# get the third element of the iterator
print(next(iterator))  # prints 0

输出

4
7
0

这里,我们首先使用 iter() 方法从列表中创建了一个迭代器。然后使用 next() 函数按顺序检索迭代器的元素。

当我们到达末尾并且没有更多数据可返回时,我们将得到 StopIteration 异常。

使用 for 循环

一种更优雅的自动迭代方式是使用 for 循环。例如,

# define a list
my_list = [4, 7, 0]

for element in my_list:
    print(element)

输出

4
7
0

for 循环对迭代器的工作原理

Python 中的 for 循环用于遍历一系列元素,例如列表、元组或字符串

当我们使用 for 循环与迭代器时,循环将自动遍历迭代器的元素,直到迭代器耗尽。

以下是 for 循环与迭代器协同工作的示例:

# create a list of integers
my_list = [1, 2, 3, 4, 5]

# create an iterator from the list
iterator = iter(my_list)

# iterate through the elements of the iterator
for element in iterator:

    # Print each element
    print(element)

在此示例中,for 循环遍历迭代器对象的元素。

在每次迭代中,循环将下一个元素的值分配给变量 element,然后执行缩进的代码块。

此过程持续进行,直到迭代器耗尽,此时 for 循环终止。


构建自定义迭代器

在 Python 中从头开始构建迭代器很容易。我们只需实现 __iter__()__next__() 方法,

  • __iter__() 返回迭代器对象本身。如果需要,可以执行一些初始化。
  • __next__() 必须返回序列中的下一个项目。到达末尾后,以及在随后的调用中,它必须引发 StopIteration

让我们看一个示例,它将在每次迭代中为我们提供 2 的下一个幂。幂指数从零开始,直到用户设置的数字,

class PowTwo:
    """Class to implement an iterator
    of powers of two"""

    def __init__(self, max=0):
        self.max = max

    def __iter__(self):
        self.n = 0
        return self

    def __next__(self):
        if self.n <= self.max:
            result = 2 ** self.n
            self.n += 1
            return result
        else:
            raise StopIteration


# create an object
numbers = PowTwo(3)

# create an iterable from the object
i = iter(numbers)

# Using next to get to the next iterator element
print(next(i)) # prints 1
print(next(i)) # prints 2
print(next(i)) # prints 4
print(next(i)) # prints 8
print(next(i)) # raises StopIteration exception

输出

1
2
4
8
Traceback (most recent call last):
  File "<string>", line 32, in <module>
File "<string>", line 18, in __next__
StopIteration

我们还可以使用 for 循环遍历我们的迭代器类。

for i in PowTwo(3):
    print(i)

输出

1
2
4
8

要了解有关面向对象编程的更多信息,请访问 Python OOP


Python 无限迭代器

无限迭代器是一种永不结束的迭代器,这意味着它将无限期地生成元素。

以下是使用 itertools 模块中的 count() 函数在 Python 中创建无限迭代器的示例:

from itertools import count

# create an infinite iterator that starts at 1 and increments by 1 each time
infinite_iterator = count(1)

# print the first 5 elements of the infinite iterator
for i in range(5):
    print(next(infinite_iterator))

输出

1
2
3
4
5

这里,我们创建了一个无限迭代器,它从 1 开始,每次递增 1

然后我们使用 for 循环和 next() 方法打印了无限迭代器的前 5 个元素。

视频:Python 迭代器

你觉得这篇文章有帮助吗?

我们的高级学习平台,凭借十多年的经验和数千条反馈创建。

以前所未有的方式学习和提高您的编程技能。

试用 Programiz PRO
  • 交互式课程
  • 证书
  • AI 帮助
  • 2000+ 挑战