递归呼叫被阻止

时间:2016-11-23 10:40:36

标签: python recursion

def getCategoriesAsList(element):
    try:
        print "I am {0}".format(element.getNodeID())
        if element.hasChilds():
            for value in element.getChildren().values():
                print "{0} added to list".format(value.getNodeID())
                return [value]+getCategoriesAsList(value)
        else:
            print "{0} added to list".format(element.getNodeID())
            return [element]
    except Exception as err:
        print err
早上好! 我试图在python中迭代我的树,我想将树转换为具有一些转换的元素列表。 问题是当元素不是子元素时,函数不执行递归调用。我做了一些调试信息,但我无法理解这种行为!

3 个答案:

答案 0 :(得分:0)

当您在for循环中返回时,它将无法继续。请考虑使用yield关键字而不是return

for value in element.getChildren().values():
    print "{0} added to list".format(value.getNodeID
    yield [value]+getCategoriesAsList(value)

<强>解释

当它从for循环返回时,它会停止对该函数的调用并返回变量value

yield关键字完全相同,但在当前函数调用中继续执行,因此它将遍历所有for循环。

答案 1 :(得分:0)

这是一个保留函数符号的更新版本:

def getCategoriesAsList(element):
    try:
        print "I am {0}".format(element.getNodeID())
        result = []
        if element.hasChilds():
            for value in element.getChildren().values():
                print "{0} added to list".format(value.getNodeID())
                result.append(value)
                result.extend(getCategoriesAsList(value))
        else:
            print "{0} added to list".format(element.getNodeID())
            result.append(element)
        return result
    except Exception as err:
        print err

另一种选择是使用yield。它为您提供以下解决方案:

def getCategoriesAsList(element):
    try:
        print "I am {0}".format(element.getNodeID())
        if element.hasChilds():
            for value in element.getChildren().values():
                print "{0} added to list".format(value.getNodeID())
                yield value
                for v in getCategoriesAsList(value):
                    yield v
        else:
            print "{0} added to list".format(element.getNodeID())
            yield element
    except Exception as err:
        print err

只需按以下方式调用该函数:

print list(getCategoriesAsList(root))

答案 2 :(得分:0)

假设您想要一个包含所有xml Element对象的最终列表,您可以使用不同的方法:

def getCategoriesAsList(element):
    i = element.iter()
    return [next(i) for _ in i]