如何停止python递归

时间:2016-02-08 16:00:19

标签: python recursion

我创建了一个递归搜索文件的函数,我希望它在找到第一个文件时停止递归:

def search_file(path):
    for name in os.listdir(path):
        sub = os.path.join(path, name)
        if os.path.isfile(sub):
            return sub#And break recursion
        else:
            search_file(sub)

4 个答案:

答案 0 :(得分:2)

返回一个标志,指出是否找到了该文件。当您致电search_file时,如果返回值为True,则返回。

答案 1 :(得分:1)

你很亲密。当你找到文件时,你已经打破了递归,问题是你没有在链中一直推进这个结果。一份精心布置的印刷声明将显示出现了什么问题。

import os

def search_file(path):
    for name in os.listdir(path):
        sub = os.path.join(path, name)
        print('peek at: {}'.format(sub))
        if os.path.isfile(sub):
            return sub#And break recursion
        else:
            sub = search_file(sub)
            if sub:
                return sub  
print(search_file('a'))

答案 2 :(得分:0)

请注意,您需要能够返回false条目,以防它一直向下循环而不会发现任何内容。但是,如果在没有检查下一个子目录的情况下在一个子目录中找不到任何内容,则不希望中断for循环。返回将退出函数,返回结果而不必输入中断。

def search_file(path):
    Initialize results to no file found
    val = False
    sub = None
    for name in os.listdir(path):
        sub = os.path.join(path, name)
        val = os.path.isfile(sub):
        if val:
            return val, sub #And break recursion
        else:
            #check the subdirectory.
            val, sub = search_file(sub)
            # Break out if a valid file was found.
            if val:
                return val, sub
    # No files found for this directory, return a failure
    return val, sub

另一方面,如果您只想要一次退货,可以按如下方式使用中断

def search_file(path):
    Initialize results to No file found
    val = False
    sub = None
    for name in os.listdir(path):
        sub = os.path.join(path, name)
        val = os.path.isfile(sub):
        if val:
            break # break out of the for loop and return
        else:
            #check the subdirectory.
            val, sub = search_file(sub)
            # Break out if a valid file was found.
            if val:
                break
    # Return the True or False results
    return val, sub

答案 3 :(得分:0)

我发现一个问题是无法将None以外的值一次返回到else:语句中。您能否提供更详细的信息来描述您的目标?

完成任务时无法简单地退出递归。在继续之前必须关闭每个打开的递归步骤。该函数必须向其调用者返回一些内容(None或值)。

我想象这是一个将值设置为属性的类方法,因为一旦递归开始它就不会返回任何内容。 以下是我在实例中要做的事情,这是一个类方法

def search_file(self, path):
    for name in os.listdir(path):
        sub = os.path.join(path, name)
        if os.path.isfile(sub):
            self.random_attr = sub
            return True  #And break recursion
        elif search_file(sub):
            break