我觉得应该有一种可爱的方式来使以下(非工作)代码工作:
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)
但仍然存在需要计算的相同问题。我知道,这不是世界末日,但感觉这应该是一个可以解决的问题!
答案 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
左侧的变量数量有多难?