创建一个生成器,该生成器从任意数量的内部生成器中产生值 [英] Create a generator that yields values from any number of inner generators

查看:88
本文介绍了创建一个生成器,该生成器从任意数量的内部生成器中产生值的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有一个生成器函数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:

  1. 单代生成,表示generate函数的单个输出
  2. 多次生成,这意味着generate的多次执行,并将所有结果作为单个(合并)流一起产生
  1. Single generation, which means a single output of generate function
  2. 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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆