【发布时间】:2012-07-07 19:09:29
【问题描述】:
我是一名编程新手,在理解我的 Python 教科书(Magnus Lie Hetland 的“Beginning Python”)中的一个示例时遇到了一些困难。该示例用于递归生成器,旨在展平嵌套列表的元素(具有任意深度):
def flatten(nested):
try:
for sublist in nested:
for element in flatten(sublist):
yield element
except TypeError:
yield nested
然后您将按如下方式输入嵌套列表:
>>> list(flatten([[[1],2],3,4,[5,[6,7]],8]))
[1,2,3,4,5,6,7,8]
我了解 flatten() 中的递归如何帮助减少到此列表的最里面的元素“1”,但我不明白的是当“1”实际上传递回 flatten() 时会发生什么作为“嵌套”。我认为这会导致 TypeError (不能迭代一个数字),并且异常处理实际上会为生成输出做繁重的工作......但是使用 flatten() 的修改版本进行测试让我确信事实并非如此。相反,'yield element' 行似乎是负责任的。
也就是说,我的问题是……“yield 元素”如何真正执行?看起来“嵌套”要么是一个列表——在这种情况下会添加另一层递归——或者它是一个数字,你会得到一个 TypeError。
对此的任何帮助将不胜感激...特别是,我很想了解事件链,因为 flatten() 处理了一个简单的示例,例如:
list(flatten([[1,2],3]))
【问题讨论】:
-
我建议阅读The Python yield keyword explained 的答案,以便很好地介绍所有相关概念。
-
@SvenMarnach:3.3 中的
yield from功能将使这成为小菜一碟:) -
附注:上面的代码不够通用,无法处理字符串。例如,list(flatten(['abc', 'def'])) 中断。