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

2024-07-02 12:58:36 发布

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

让我强调一下以下代码的问题:

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()中的所有值。为此,我将generator对象传回main()函数,然后再次将其传回middleman()。这是最好的方法还是有更好的方法?你知道吗


Tags: 方法函数idinputifvaluemaindef
1条回答
网友
1楼 · 发布于 2024-07-02 12:58:36

如果没有你的例子(可以理解为一个玩具例子)所指的更大的上下文,这就有点难说了。你知道吗

一般来说,从一个函数返回多个值是非常好的(尽管是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

客观上它更短,对我来说也更清晰。你知道吗

相关问题 更多 >