繁体   English   中英

找到变量python后在递归函数中中断循环

[英]Break loop in recursive function after finding variable python

我知道已经详细讨论了这个主题,但我的用例有些特殊。

问题描述:我正在尝试分析具有多层的树。 每层可能由元素组成,这些元素在访问时可能包含更多可扩展元素(列表)或只是一个简单元素(非列表)。 基本上它就像 Windows / Linux 文件夹和文件系统。 也许以下模式将有助于更好地理解我所指的内容:

[Parent_Element]
|
+ [Element 1]
  |
  + [Subelement 1.1]
    + Subsubelement 1.1.1
    |
    + [hello_world]
      |
      Subsubsubelement 1.1.2.1
      |
      Subsubsubelement 1.1.2.2
    |
    + Subsubelement 1.1.3
  |
  + [Subelement 1.2]
    |
    + Subsubelement 1.2.1
  |  
  + Subelement 1.3
|
+ [Element 2]
  |  
  + Subelement2.1
|
+ Element 3

我尝试使用以下代码,该代码部分按照我的意图工作。 问题是我的代码在找到所需的“hello_world”search_variable 后也继续运行。 能够在第一次找到这个变量时停止代码会很好。

def search_function(parent_element, search_variable = "hello_world"):
    # Get elements of parent_element
    elements = parent_element.get_elements()
    #
    # Check if Parent_Element has subelements
    # TRUE: Parent_Element is LIST
    # FALSE: Parent_Element is not a LIST
    if isinstance(elements, list):
        #
        # Loop over each elem of the parent_element and 
        for elem in elements:
            # Check if elem has the desired name
            # TRUE: Save elem
            if elem.get_display_name().to_string() == search_variable:
                print("Search Successful!")
                return elem
                break
            #
            # FALSE: Keep on looking in the sub-elements
            else:
                search_function(elem)
                break
    else:
        pass
#

'break' 永远不会在你的代码中执行。 您应该必须使用flag并将其设为global break是在return之后,这就是break永远不会执行的原因。

if elem.get_display_name().to_string() == search_variable:
    print("Search Successful!")
    return elem
    break

使用与前一个相同级别的另一个 if 语句来控制它。 您可以像这样编辑代码。

           
        for elem in elements:
            # Check if elem has the desired name
            # TRUE: Save elem
            if elem.get_display_name().to_string() == search_variable:
                print("Search Successful!")
                flag = 1
                return elem

            #
            # FALSE: Keep on looking in the sub-elements
            else:
                second_trial_function(elem)
                break
    
            if flag : 
                break

好的,感谢@KittoMi 的回应,我能够完成我的功能:

def search_function(input_node, search_variable = "hello_world"):
    global x
    global searched_elem
    #
    elements = input_node.get_children()
    #
    if isinstance(elements, list):
        for elem in elements:
            #
            print(elem)
            if elem.get_display_name().to_string() == search_variable:
                x = 1
                print("Found it!")
                print(elem)
                searched_elem = str(elem)
                return searched_elem
                #
            else:
                search_function(elem, search_variable=search_variable)
            if x:
                break
    else:
        pass
    #

但我必须承认,我仍然不完全理解为什么它没有全局 searched_elem就不起作用。

该函数正在查找搜索变量,它打印“找到它”消息,但随后它自己执行了进一步的 2-3 次计算,并且显示的结果是另一个预期的结果。 这是返回的打印(elem)的一个小例子:

hello_world
Found!
hello_world
other_elem
yet_another_elem

这就是为什么我不得不求助于全局 searched_elem 也许有人可以澄清这一点。

暂无
暂无

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

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