簡體   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