我是一名编程新手,在理解我的 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 element”如何实际执行?看起来“嵌套”要么是一个列表——在这种情况下会添加另一层递归——要么它是一个数字,你会得到一个类型错误。
对此的任何帮助将不胜感激......特别是,我很乐意了解事件链,因为 flatten() 处理一个简单的示例,例如:
list(flatten([[1,2],3]))