我正在读“开始python,从新手到专业人士”,其中有一个神奇的扁平化函数,这让我很困惑
def flatten(nested):
try:
for sublist in nested:
for element in flatten(sublist):
yield element
except TypeError:
yield nested
我知道收益率返回一个元素。假设我有一个列表L = [ 1, [[2]] ]
。
我用这个flatte()来称呼它,比如:
L = [ 1, [[2]] ]
for i in flatten(L):
print i
1
2
我真的很困惑,当我们调用for循环时,我们是否会触发flatte(),我们看到第一个元素1
,它无疑会导致try块中的TypeError
,except块中返回的nested
变量不应该是整个列表[1, [[2]] ]
?为什么它会返回1
我想我现在明白这里发生了什么
我们仍然有
L = [1, [[2]]]
,我们称之为flatten(L)
现在第一个元素是1,现在我们移动到
for element in flatten(1)
当我们调用flatte()并遇到TypeError时,我们将得到
nested
变量,在这里,它是1所以我们得到了
1
原来的L现在只剩下
[[2]]
正如我们所调用的for循环:
for i in flatten(L)
,事情将继续进行现在我们将转到
for element in flatten([[2]])
,是的,我们在它下面有一个yield element
,但是我们必须先执行for element in flatten([[2]])
,然后看看发生了什么现在我们将转到
for element in flatten([2])
,直接转到它下面的yield element
是一种诱惑。但是,等一下,我们下次再去找平现在我们移动到
flatten(2)
,它将像flatte(1)一样引发TypeError所以这次我们得到了
2
事情解释清楚了
输入一个打印语句来查看发生了什么是很有帮助的。例如
输出
也许不使用
yield
重写函数可以让您更容易理解:用最基本的术语来说,这就是
yield
所做的。它从函数一次“发送”一个值。有关更完整的解释,请参见What does the yield keyword do in Python?的答案相关问题 更多 >
编程相关推荐