如何从无限生成器中清晰地捕获?

时间:2016-11-16 15:07:05

标签: python python-3.x syntax generator

我觉得应该有一种可爱的方式来使以下(非工作)代码工作:

a, b, c, d = generator()

其中生成器是无限的,并且生成的对象在某种程度上很有趣。这只是一个很好的说法,使所有这些变量与这个生成的模式不同(可能)。不幸的是,这是一个语法错误。我们可以这样做:

a, b, c, d, *_ = generator()

但不幸的是,这会尝试将_变成无限列表,这不是我想要的。我希望它能抓住发电机的残余物(供将来参考或者忽略)。

我也可以这样做:

gen = generator()
a, b, c, d = (gen.__next__() for _ in range(0, 4))

但是这需要我指定4,我不想这样做。 itertools islice符号看起来更好:

a, b, c, d = itertools.islice(generator(), 4)

但仍然存在需要计算的相同问题。我知道,这不是世界末日,但感觉这应该是一个可以解决的问题!

1 个答案:

答案 0 :(得分:1)

基于将无限生成器视为可以根据需要填充池的流的详细方法,可以从中获取项目。当作业试图占用太多时,错误处理可以填充池。

import itertools

poolSize = 1000

#example stream:
def generator():
    i = 1
    while True:
        yield i**2
        i+=1

def fill(pool,gen):
    pool += itertools.islice(gen, poolSize - len(pool))

gen = generator()

pool = []
fill(pool,gen)

try:
    a,b,c,d,*pool = pool
except ValueError:
    fill(pool,gen)
    a,b,c,d,*pool = pool

这样做之后,我觉得这不值得麻烦。计算islice左侧的变量数量有多难?