跨函数调用维护生成器对象

时间:2016-09-04 16:14:19

标签: python generator

让我用以下代码突出显示问题:

def genny():
    yield 1
    yield 2
    yield 3


def middleman(input_gen=None):
    if input_gen:
        gen = input_gen
    else:
        gen = genny()
    return [next(gen), gen]

if __name__ == '__main__':
    pro_list = middleman()
    pro_value = pro_list[0]
    print pro_value
    pro_gen_id = pro_list[1]
    for i in range(2):
        pro_list = middleman(pro_gen_id)
        pro_value = pro_list[0]
        print pro_value

我的限制是middleman()函数不能是生成器,但我需要显示生成器genny()中的所有值。我通过将生成器对象传递回main()函数然后再将其发送回middleman()来完成此操作。这是实现这一目标的最佳方式还是有更好的方法?

1 个答案:

答案 0 :(得分:1)

如果没有你的例子(可以理解为玩具的例子)所指的更大的上下文,那就很难说了。

一般来说,从函数中返回多个值是完全没问题的(尽管是tuple or namedtuple are a bit more common)。

在您的特定情况下,middelman函数只是next生成器(接收或内部构造),然后返回此值和生成器。我认为让middleman创建或返回生成器没有任何好处,让客户端代码执行next。以下代码与您的代码相同(请参阅ideone):

def genny():
    yield 1
    yield 2
    yield 3

def middleman(input_gen=None):
    return genny() if input_gen is None else input_gen

if __name__ == '__main__':
    pro = middleman()
    for e in pro:
        pro = middleman(pro)
        print e

它客观上更短,对我来说也更清晰。