Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/python-2.7/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 理解使用生成器的函数中的递归_Python_Python 2.7_Recursion_Generator - Fatal编程技术网

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
  • 它将递归地尝试为每个元素调用自己,直到发生TypeError

  • 当TypeError发生时,这意味着此元素不是集合,无法进一步展平,因此它将生成此元素

  • 示例:
    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不是可用列表(示例)