Python 生成器和收益表

Python 生成器和收益表,python,generator,Python,Generator,假设我想创建一个函数,该函数采用iterable。该iterable可以包含任何级别的其他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]])

假设我想创建一个函数,该函数采用iterable。该iterable可以包含任何级别的其他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. 5. 6. 7. 8. 9 十,

不,我想用发电机来做这个。为什么下面的语句不能像我期望的那样工作(基本上用一个收益率代替print语句):


谢谢

因为当你递归时,你会返回一个新的生成器——但这个生成器永远不会产生任何结果,因为你没有对它进行迭代。相反,请执行以下操作:

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

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

只是关于使用
集合的一个快速警告。在您的类型检查中,Iterable
:字符串将破坏您的代码。它们是可编辑的,但其内容是其他字符串(原始字符串的字符)。这将导致在第一个字符上出现无限递归,除非您进行额外的检入以避免它。您可能还希望使用特殊情况字典(因为它们是可编辑的,但迭代只生成它们的键)。
def it(l):
  for i in l:
    if isinstance(i, collections.Iterable):
      for item in it(i):
        yield item
    else:
      yield i