迭代器只能迭代一次吗?

时间:2017-02-16 14:38:17

标签: python python-3.x iterator

考虑以下示例:

def foo(iterator):
    return sum(iterator) / max(iterator)

两次重复使用相同的迭代器是否安全?

1 个答案:

答案 0 :(得分:2)

不,这不安全。迭代器不是序列。这里使用生成器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保存到临时tuplelist

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