python - 迭代器只能迭代一次吗?

标签 python python-3.x 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/

相关文章:

python-3.x - 美丽的刮汤

python-3.x - 如何使用 Google Cloud Function 将文件从 Cloud Storage 存储桶推送到实例中?

c++ - 反向迭代器(第一个元素之前的一个)和未定义的行为?

scala - 如何合并迭代器解析器

python - 删除网格 python Tkinter 小部件之间的自动间隙

python - Django 接受一个整数到一个 CharField

python - 需要 py-upset 帮助吗?

python - Python 的 raw_input() 中的制表符补全

python - 困惑搞乱动画

c++ - 使用临时对象将迭代器获取到 STL 容器时出现细微错误 : how to avoid it?