理解python中的嵌套yield / return

时间:2011-06-28 07:32:03

标签: python nested generator yield

我在python中有一个函数,其输出是一个生成器:

def main_function(x):
    r = get_range()
    for i in range(r):
        yield x+i

我想重构代码(我简化了用例,但实际计算可能很复杂而且更长。请参阅下面的编辑)。根据我的理解,这是我应该做的,以保持功能不变:

(a)与原始代码相同的界面

    def sub_function(x,r):
        for i in range(r):
            yield x+i    

    def main_function(x):
        r = get_range()
        return sub_function(x,r)

与其他方法相比:

(b)这会返回发电机的发电机(这种方法有什么优点吗?)

    def sub_function(x,r):
        for i in range(r):
            yield x+i    

    def main_function(x):
        r = get_range()
        yield sub_function(x,r)

(c)这会破坏发电机的目的(这是正确的吗?)

    def sub_function(x,r):
        return [x+i for i in range(r)]

    def main_function(x):
        r = get_range()
        for i in sub_function(x,r):
            yield(i)

编辑:评论指出正确答案取决于用例。我想补充一点,我的用例是解析XML文件以提取字段并将其写入数据库。这部分委托给sub_function()。我还问了这个问题,以便对重构代码的嵌套yield的使用有一个大致的了解。

1 个答案:

答案 0 :(得分:12)

你是对的;最初的例子和a)做同样的事情,因为它们都返回一个生成器。

b)是不同的:它返回一个生成单个元素(另一个生成器)的生成器。要使用它,您需要两个循环(一个在外部,一个在内部生成器上)。

本身没有任何优势,但有时候,构建嵌套生成器会很有用。

c)可能会更糟,但我很确定[x for x in y]实际上也是作为生成器实现的。所以它有点贵,但不是那么多。