迭代器
在 Python 中,迭代器(Iterators)是一种提供顺序访问容器值元素的对象。迭代器抽象包含两个主要组件:一种机制用于检索序列中的下一个元素,另一种机制用于在序列结束时发出信号,表示没有更多元素可供访问。
迭代器的概念
迭代器是一个对象,它提供对值的顺序访问,一次一个。对于任何容器(如列表或范围),可以通过调用内置的 iter
函数来获取迭代器。迭代器的内容可以通过调用内置的 next
函数来访问。
示例:使用迭代器
下面是一个使用迭代器的示例:
primes = [2, 3, 5, 7]
iterator = iter(primes)
print(next(iterator)) # 2
print(next(iterator)) # 3
print(next(iterator)) # 5
print(next(iterator)) # 7
当没有更多值可供访问时,Python 会引发 StopIteration
异常。可以使用 try
语句来处理这个异常。
try:
print(next(iterator))
except StopIteration:
print('No more values')
迭代器的状态维护
迭代器维护本地状态以表示其在序列中的位置。每次调用 next
时,该位置会前进。两个独立的迭代器可以在同一个序列中跟踪不同的位置。然而,同一个迭代器的两个名称将共享一个位置,因为它们共享同一个值。
r = range(3, 13)
s = iter(r) # 第一个迭代器
print(next(s)) # 3
print(next(s)) # 4
t = iter(r) # 第二个迭代器
print(next(t)) # 3
print(next(t)) # 4
u = t # 第二个迭代器的别名
print(next(u)) # 5
print(next(u)) # 6
推进第二个迭代器不会影响第一个迭代器。由于第一个迭代器最后返回的值是 4,它将定位在下一个返回 5 的位置。另一方面,第二个迭代器将定位在下一个返回 7 的位置。
print(next(s)) # 5
print(next(t)) # 7
调用 iter
函数在迭代器上将返回该迭代器本身,而不是副本。这一行为使得程序员可以调用 iter
函数来获取迭代器,而不必担心它是一个迭代器还是一个容器。
v = iter(t) # 第二个迭代器的另一个别名
print(next(v)) # 8
print(next(u)) # 9
print(next(t)) # 10
迭代器的实用性
迭代器的实用性在于它们可以处理不显式存储在内存中的底层数据序列。迭代器提供了一种机制,可以依次考虑一系列值,而这些元素不需要同时存储。相反,当从迭代器请求下一个元素时,该元素可以在需要时计算,而不是从现有内存源中检索。
范围能够懒惰地计算序列的元素,因为序列表示是均匀的,并且任何元素都很容易从范围的起始和结束边界计算。迭代器允许懒惰地生成更广泛的底层顺序数据集,因为它们不需要提供对底层序列任意元素的访问。相反,迭代器只需要在每次请求另一个元素时按顺序计算序列的下一个元素。虽然不如访问序列的任意元素(称为随机访问)灵活,但对顺序数据的顺序访问通常足以满足数据处理应用的需求。