<分区>
考虑以下示例:
def foo(iterator):
return sum(iterator) / max(iterator)
重复使用同一个迭代器两次安全吗?
<分区>
考虑以下示例:
def foo(iterator):
return sum(iterator) / max(iterator)
重复使用同一个迭代器两次安全吗?
最佳答案
不,这不安全。迭代器不是序列。以下是使用生成器的 foo()
函数发生的情况,生成器本身就是一个迭代器:
>>> foo(x for x in range(10))
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "<stdin>", line 1, in foo
ValueError: max() arg is an empty sequence
这是因为当 sum()
完成它的工作时,迭代器已经结束,所以 max()
没有从中得到额外的项目。通常,不可能重置迭代器以使其可以再次循环。为了使 foo()
函数能够正确支持迭代器,必须重写它以便迭代器仅循环一次,例如将 iterator
中的项目保存到临时元组
或列表
:
def foo(iterator):
iterable = list(iterator)
return sum(iterable) / max(iterable)
或者,如果 iterator
产生大量项,则使用 for
循环小心处理它:
def foo(iterator):
# allows iterables like lists or tuples to be passed as arguments
iterator = iter(iterator)
try:
max_ = next(iterator)
sum_ = max_
except StopIteration:
# iterator yields no items, return some default value
return 0.0
for element in iterator:
sum_ += element
max_ = max(max_, element)
return sum_ / max_
这将产生正确的结果:
>>> foo(x for x in range(10))
5.0
关于python - 迭代器只能迭代一次吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42276993/