Python 理解使用生成器的函数中的递归
这里有一个函数Python 理解使用生成器的函数中的递归,python,python-2.7,recursion,generator,Python,Python 2.7,Recursion,Generator,这里有一个函数 def flatten(nested): try: for sublist in nested: for element in flatten(sublist): yield element except TypeError: yield nested 和nested=[[1,2],[3,4],[5]] 我想了解的是函数flatte是何时第一次被调用的 整个序列([[1,2],[3
def flatten(nested):
try:
for sublist in nested:
for element in flatten(sublist):
yield element
except TypeError:
yield nested
和nested=[[1,2],[3,4],[5]]
我想了解的是函数flatte是何时第一次被调用的
整个序列([[1,2],[3,4],[5]])
被传递给它,下面是我理解的执行序列
flatten([[1, 2], [3, 4], [5]]):
try:
for sublist in ([[1, 2], [3, 4], [5]]):
for element in flatten(sublist):
这里调用flatte,它从嵌套的列表元素[1,2]开始[0]
现在,在这个用于展平的递归调用中,它按照以下方式进行
flatten([1, 2]):
try:
for sublist in ([1, 2]):
for element in flatten(sublist):
但在最后一种情况下[5]
事情是这样的
for sublist in ([5]):
for element in flatten(sublist):
现在在递归调用中,扁平化是如何工作的?我也不清楚如果,
输入不是一个定义良好的列表。输入如下列表[[1],2],3,4,[5,[6,7]],8]
那么递归调用是如何发生的,我不清楚这件事。我不是python迷,但在我看来,这个falten的工作原理如下:
[[[1], 2], 3, 4, [5, [6, 7]], 8]
[[1], 2]
[1]
1
2
3
4
[5, [6, 7]]
5
[6, 7]
6
7
8
flatten[[1],2],3,4,5,6,7]],8]
:
1st call 1st step: sublist = [[1],2]
2nd call 1st step: sublist = [1]
3nd call 1st step: type error | yield : [1]
2nd call 2nd step: type error | yield : [1,2]
1st call 2nd step: type error | yield : [1,2,3]
。。。。
依此类推。您可以随时添加日志记录,以了解何时执行某些方法以及使用哪些参数:
def flatten(nested):
print(nested)
try:
for sublist in nested:
for element in flatten(sublist):
yield element
except TypeError:
yield nested
呼叫顺序如下所示:
[[[1], 2], 3, 4, [5, [6, 7]], 8]
[[1], 2]
[1]
1
2
3
4
[5, [6, 7]]
5
[6, 7]
6
7
8
您可以精确地跟踪它是如何处理上述内容的…在第4行中,再次调用flatte。 当到达某个元素时,将触发类型错误,并生成该错误
否则,将再次调用展平。您可以看到try…except块,就好像(type(nested)=list)…else#type(nested)=integeries,因为“for sublist in(5):”抛出错误,5不是可用列表(示例)