"Functions that consume an entire iterable won't terminate"?

"Functions that consume an entire iterable won't terminate"?

David Beazley's talk on generators 中,他指出:

Functions that consume an entire iterable won't terminate(min, max, sum, set etc.)

这里是什么意思?

gen = (x*2 for x in [1,2,3,4,5])

sum(gen) 结束就好了。

如果你注意的话,你会注意到他在演示文稿的第 5 部分中写道,"Processing Infinite Data"。由于无限生成器会产生无限数量的项目,因此尝试使用整个生成器的函数永远不会 return.

无限生成器在消耗时不会终止:

def gen():
    while True:
        yield 1

sum(gen())

注意:不要实际执行最后一行。

他指的是 无限序列 的概念,如果你向 max 等人提供无限序列,他们根本无法 return一个值。

想要复制? 除了构建自定义无限序列,Python 有一个 built-in 集其中 itertools (namely repeat, count, cycle)。尝试并做:

from itertools import repeat

max(repeat(20))

看看会发生什么。实际上,不要那样做max 会继续大嚼,因为 repeat 会继续提供数字1。这是一场历久弥新的爱情,永不终止 :-)


1 -- 想象一下 Pac-Man 在一个永无止境的 straight-line 中;不断地吃那些黄色的小东西。 Pac-Man = max, repeat.

生成的黄色东西

在提供的文档中,注释针对第 39 页上的 follow 函数,该函数旨在锁定程序,直到文件被添加到其中,任何无限生成器在与以下函数一起使用时都不会终止使用可迭代对象。

他说的是无限迭代器,其中许多可以在 Python 的 itertools 中找到。如果您对它们使用无限迭代器,它们将不会 return.