创建一个生成器,该生成器从任意数量的内部生成器中产生值 [英] Create a generator that yields values from any number of inner generators
问题描述
我有一个生成器函数generate
,它一次生成5个随机数.我需要能够通过两种方式生成数字:
I have a generator function generate
which yields 5 random numbers one at a time. I need to be able to generate the numbers in two ways:
- 单代生成,表示
generate
函数的单个输出 - 多次生成,这意味着
generate
的多次执行,并将所有结果作为单个(合并)流一起产生
- Single generation, which means a single output of
generate
function - Multiple generation, which means multiple execution of
generate
and yielding all the results together as a single (merged) flow
为此,我编写了另一个函数get_resource
,该函数一次调用generate
或使用itertools.chain
一次又一次运行生成器,但对调用者透明.
For that I wrote another function get_resource
, which calls generate
either once or using itertools.chain
to run the generators one after another, but transparently to the caller.
我的目标是使用get_resource
函数并以相同的格式(一个数字列表)产生结果,而不管是单代还是多代.
My goal is to use get_resource
function and produce the results in the same format (one list of numbers), regardless of single/multiple generations.
import itertools
import random
def get_resource(values=None):
def resource_generator():
if values:
# run a generator for every value
return itertools.chain(generate(value) for value in values)
else:
return generate('meh')
return resource_generator()
def generate(value):
for _ in range(5):
yield random.randint(1, 101)
if __name__ == '__main__':
# list() is used for convenience only,
# I still need the values one by one
print list(get_resource())
print list(get_resource([1, 2, 3]))
它打印:
[63, 22, 87, 2, 54]
[<generator object generate at 0x1089f7640>, <generator object generate at 0x1089f7690>, <generator object generate at 0x1089f76e0>]
当我需要打印时:
[63, 22, 87, 2, 54]
[63, 22, 87, 2, 54, 1, 58, 79, 89, 77, 94, 99, 30, 30, 4]
我使用python2.7
推荐答案
您应使用 itertools.chain.from_iterable
return itertools.chain.from_iterable(generate(value) for value in values)
这篇关于创建一个生成器,该生成器从任意数量的内部生成器中产生值的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!