python - 生成器和 yield 语句

标签 python generator

假设我想创建一个接受可迭代对象的函数。该可迭代对象可能包含任何级别的其他可迭代对象。我想创建一个按顺序处理这些的函数。例如:

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 10

不应该我想用发电机来做这件事。为什么下面的代码没有像我期望的那样工作(本质上是用 yield 替换 print 语句):

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

谢谢!

最佳答案

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

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关键字。

关于python - 生成器和 yield 语句,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19126845/

相关文章:

python - SymPy 矩阵参数不可比较

python - 如何在 Pandas 中使用生成器

c - 如何将随机整数的范围从1-10扩大到1-200

python - 如何在 Python 中使用 matplotlib 创建子图

python - 从两个给定的 pd.Series 创建 pandas 系列

python - random.choice 的加权版本

python - 如何在 Python 中打印字符串中递增的 int 标识符

python - 为什么我在 Python 类定义中的生成器中得到这个 NameError?

python - 如何在 Python 中从多个文件创建行生成器

python - 从集合中选择单个项目 : Python