2011-06-06 80 views
13

我有一個Python生成器,可以調用自己來獲得更多的元素。它看起來像這樣:Python生成器生成一切從另一個生成器調用

def gen(list): 
    # ... 
    if list: 
     for x in gen(list[1:]): 
      yield x 

我的問題是關於最後兩行:有沒有表達這種更簡潔的方式?我希望這樣的事情(理解這一點是不是有效的Python原樣):

def gen(list): 
    # ... 
    if list: 
     yield each in gen(list[1:]) 
+0

我不太明白這應該做什麼,我原本以爲這只是一個將列表轉換爲發生器的簡單方法,但我錯了。你能開導我嗎? – Davy8 2011-06-06 20:45:16

+0

糾正我,如果我錯了,但該代碼看起來像它總是會返回一個空列表。我認爲評論中必須有其他收益率? – Dunes 2011-06-06 21:25:11

+0

@Dunes:是的,評論中還有其他收益率。 – 2011-06-07 01:27:16

回答

17

有人呼籲yield from或類似的「通過」一個子生成器返回的所有值。請參閱PEP 380瞭解一些已被反彈的想法。但是,還沒有實施。你的第一個例子是正確的。

+4

注意:Python 3.3已經發布,與PEP 380(收益率)一起發佈。 – jomido 2012-09-30 12:34:53

+1

現在,這是兢兢業業! – kindall 2012-09-30 14:26:57

+2

...但不在Python 2.x中 – smci 2013-03-25 22:32:43

3

你的第一個例子是妥善解決。

5

你的代碼示例非常習慣和簡潔,沒有必要也沒有真正的機會進一步改進,特別是在可讀性方面。