繁体   English   中英

python递归方法返回None

[英]python recursive method returns None

我正在使用sikuli(一种Jython语言,尽管它主要是python)来遍历xml树以查找特定元素。

如果我写这样的代码:

xmldoc = ('/ProgramData/XXXXX/XXXXX/XXXX/file.xml')
tree = ET.parse(xmldoc)
root = tree.getroot()
transverse(root)

def transverse(Root):
    for x in Root:
        if(x.tag=='ecuID'):
            if (x.get('id')=='16'):
                print x.get('corner')
        else:
            transverse(x)

控制台打印(5,105)(这是x.get('corner')的值)

如果代码是这样的

xmldoc = ('/ProgramData/XXXXX/XXXXX/XXXX/file.xml')
tree = ET.parse(xmldoc)
root = tree.getroot()
print transverse(root)

def transverse(Root):
    for x in Root:
        if(x.tag=='ecuID'):
            if (x.get('id')=='16'):
                return x.get('corner')
        else:
           return transverse(x)

日志打印无。 我觉得这两种方式的行为都应该相同,而我实际上需要它以第二种方式工作。

我认为代码是在第一次返回else语句时返回的,而不是等待结果被过滤回顶部,如果您理解我的意思的话。

为什么这些代码段的行为有所不同的任何帮助将不胜感激

如果对于Root所有xx.tag == 'ecuID'Truex.get('id') == '16' 不是 True ,则循环永远不会到达return语句,而是返回None

当“ Root为空序列时(例如节点树中的任何叶元素),也会发生这种情况。

如果遇到没有 node属性的任何<ecuID id="16">节点,则也将返回None ,因为x.get('corner')将返回默认值。

而不是递归,为什么不使用堆栈方法呢?

def traverse(node):
    stack = [node]
    while stack:
        next = stack.pop()
        for node in next:
            if node.tag == 'ecuID' and node.get('id') == '16':
                return node.get('corner')
            stack.append(node)

这也将遍历树,访问所有节点,直到找到您的节点,或者在没有匹配的节点时返回None

最好的办法就是使用getiterator()方法:

def traverse(root):
    for node in root.getiterator('ecuID'):
        if node.get('id') == '16':
            return node.get('corner')

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM