2011-06-06 76 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

你的代码示例非常习惯和简洁,没有必要也没有真正的机会进一步改进,特别是在可读性方面。