迭代器是一种用于遍历集合(如列表、元组等)的方法。通过使用迭代器方法,我们可以循环访问一个对象并返回其元素。
从技术上讲,一个 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 的下一个幂次方,幂指数从 0 开始,直到用户设定的最大值:
class PowTwo:
"""用于实现 2 的幂次方的迭代器类"""
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 无限迭代器
无限迭代器是指永远不会结束的迭代器,也就是说它会无限地生成元素。
下面是一个使用 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 个元素。