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

2024-04-26 12:51:01 发布

您现在位置:Python中文网/ 问答频道 /正文

我觉得应该有一个可爱的方法让以下(非工作)代码工作:

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)

但仍然有同样的问题需要计算。我知道这不是世界末日,但我觉得这应该是一个可以解决的问题!你知道吗


Tags: 对象方法代码in列表for模式generator
1条回答
网友
1楼 · 发布于 2024-04-26 12:51:01

一种详细的方法,它将无限生成器视为一个可以根据需要填充池的流,从中可以提取项目。错误处理会在分配尝试占用太多时间时填满池。你知道吗

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左边的变量数有多难?你知道吗

相关问题 更多 >