簡體   English   中英

了解 python 中的嵌套產量/回報

[英]Understanding nested yield / return in python

我在 python 中有一個 function ,其 output 是一個發電機:

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 用於重構代碼的用法。

你是對的; 最初的例子和 a) 做同樣的事情,因為兩者都返回一個生成器。

b) 不同:它返回一個生成單個元素的生成器(這是另一個生成器)。 要使用它,您需要兩個循環(一個在外部生成器上,一個在內部生成器上)。

本身沒有優勢,但有時,構建嵌套生成器可能很有用。

c) 可能會更糟,但我很確定[x for x in y]實際上也是作為生成器實現的。 所以它有點貴,但不是那么多。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM