生成器和屈服声明

时间:2013-10-01 22:10:03

标签: python generator

假设我想创建一个可迭代的函数。该iterable可能包含任何级别的其他迭代。我想创建一个按顺序遍历这些功能的函数。例如:

import collections
def it(l):
  for i in l:
    if isinstance(i, collections.Iterable):
      it(i) 
    else:
      print i


it([ [1, 2, 3], [[4, [5, 6]], 7], 8, [9, 10]])  

这会产生以下输出(如预期的那样): 1 2 3 4 五 6 7 8 9 10

不,我想用发电机做这件事。为什么以下工作不像我期望的那样(基本上用yield替换print语句):

import collections
def it(l):
  for i in l:
    if isinstance(i, collections.Iterable):
      it(i) 
    else:
      yield i

谢谢!

1 个答案:

答案 0 :(得分:5)

因为当你递归时,你会返回一个新的生成器 - 但是那个生成器永远不会产生任何东西,因为你没有迭代它。相反,做一些像:

def it(l):
  for i in l:
    if isinstance(i, collections.Iterable):
      for item in it(i):
        yield item
    else:
      yield i

或者,在python3.3中,您可以使用yield from关键字。