考虑代码:
def test(data):
for row in data:
print("first loop")
for row in data:
print("second loop")
当 data
是 迭代器 时,例如列表迭代器或生成器表达式* ,这不起作用:
>>> test(iter([1, 2]))
first loop
first loop
>>> test((_ for _ in [1, 2]))
first loop
first loop
这会打印 first loop
几次,因为 data
是非空的。但是,它 不 打印 second loop
。 为什么迭代 data
第一次有效,但第二次无效?我怎样才能让它第二次工作?
除了 for
循环,同样的问题似乎发生在任何类型的迭代中:list/set/dict comprehensions, passing the iterator to list()
, sum()
or reduce()
等
另一方面,如果 data
是另一种 可迭代 的,例如 list
或 range
--- :
>>> test([1, 2])
first loop
first loop
second loop
second loop
>>> test(range(2))
first loop
first loop
second loop
second loop
\* 更多示例:
- 文件对象
- 从显式生成器函数创建的生成器
filter
,map
和zip
对象(在 3.x 中)enumerate
对象csv.reader
itertools
标准库中定义的各种迭代器
有关一般理论和术语解释,请参阅 什么是迭代器、可迭代和迭代? .
要 检测 输入是迭代器还是“可重用”可迭代对象,请参阅 确保参数可以迭代两次。
原文由 JSchwartz 发布,翻译遵循 CC BY-SA 4.0 许可协议
迭代器只能使用一次。例如:
当迭代器被提供给
for
循环时,最后一个StopIteration
将导致它第一次退出。尝试在另一个 for 循环中使用相同的迭代器将导致StopIteration
立即再次出现,因为迭代器已被消耗。解决这个问题的一个简单方法是将所有元素保存到一个列表中,可以根据需要多次遍历该列表。例如:
但是,如果迭代器将迭代许多元素,则最好使用
tee()
创建独立的迭代器:现在每个都可以依次迭代: