跳到主要内容

Python 迭代器

提示
  1. 迭代器基础:迭代器是遍历诸如列表和元组等集合的方法,必须实现__iter__()__next__()方法。
  2. 迭代器使用:可以使用next()函数或for循环来遍历迭代器,自动处理元素,直至迭代器用尽。
  3. 自定义与无限迭代器:自定义迭代器可以通过实现特定方法轻松创建;无限迭代器不断生成元素,适用于特殊情况。

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

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

通过迭代器进行迭代

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

让我们看一个例子,

# 定义一个列表
my_list = [4, 7, 0]

# 从列表创建一个迭代器
iterator = iter(my_list)

# 获取迭代器的第一个元素
print(next(iterator)) # 打印 4

# 获取迭代器的第二个元素
print(next(iterator)) # 打印 7

# 获取迭代器的第三个元素
print(next(iterator)) # 打印 0

输出

4
7
0

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

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

使用for循环

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

# 定义一个列表
my_list = [4, 7, 0]

for element in my_list:
print(element)

输出

4
7
0

for循环用于迭代器的工作原理

Python中的for循环用于迭代一系列元素,如列表、元组或字符串。

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

这是一个for循环如何与迭代器一起工作的例子,

# 创建一个整数列表
my_list = [1, 2, 3, 4, 5]

# 从列表创建一个迭代器
iterator = iter(my_list)

# 遍历迭代器的元素
for element in iterator:
# 打印每个元素
print(element)

在这个例子中,for循环遍历迭代器对象的元素。

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

直到迭代器用尽,此时for循环终止。

构建自定义迭代器

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

  • __iter__()返回迭代器对象本身。如果需要,可以进行一些初始化。

  • __next__()必须返回序列中的下一个项。在到达末尾时,在后续调用中,它必须引发StopIteration

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

class PowTwo:
"""类来实现两个幂的迭代器"""

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

# 创建一个对象
numbers = PowTwo(3)

# 从对象创建一个可迭代对象
i = iter(numbers)

# 使用next获取下一个迭代器元素
print(next(i)) # 打印 1
print(next(i)) # 打印 2
print(next(i)) # 打印 4
print(next(i)) # 打印 8
print(next(i)) # 引发StopIteration异常

输出

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无限迭代器

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

这是一个如何在Python中使用itertools模块的count()函数创建无限迭代器的例子,

from itertools import count

# 创建一个无限迭代器,从1开始,每次递增1
infinite_iterator = count(1)

# 打印无限迭代器的前5个元素
for i in range(5):
print(next(infinite_iterator))

输出

1
2
3
4
5

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

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