理解使用生成器的函数中的递归

时间:2013-06-07 12:01:13

标签: 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]]

我想要了解的是第一次调用函数flatten时 整个序列([[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):

这里调用flatten,它从列表元素[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]

之后

然后如何进行递归调用,我不清楚这件事。

4 个答案:

答案 0 :(得分:1)

def flatten(nested, depth=0):
    print "-> %d : %s" % (depth, nested)
    try:
        for sublist in nested:
            print " s %d : %s" % (depth, sublist)
            for element in flatten(sublist, depth+1):
                print " e %d : %s" % (depth, element)
                yield element
    except TypeError:
        print " y %d : %s" % (depth, nested)
        yield nested

您可以详细了解它如何使用上述...

答案 1 :(得分:1)

在第4行中,再次调用flatten。 到达某个元素时,会触发Type错误,并且会产生它。

否则再次调用flatten。

答案 2 :(得分:0)

我不是一个蟒蛇人,但在我看来,这个faltten的工作原理如下:

  1. 它将以递归方式尝试为每个元素调用自身,直到发生TypeError

  2. 当发生TypeError时,这意味着此元素不是集合,并且无法进一步展平,因此它将产生此元素。

  3. 示例: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]
    

    .... 等等。

答案 3 :(得分:0)

您始终可以添加日志记录以了解何时执行某些方法以及使用哪些参数:

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