簡體   English   中英

如何停止python遞歸

[英]How to stop 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)

返回一個標志,指出是否找到了該文件。 當您調用search_file ,如果返回值為True則返回。

你很親密 當你找到文件時,你已經打破了遞歸,問題是你沒有在鏈中一直推進這個結果。 一個位置很好的打印聲明會顯示出錯的地方。

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'))

請注意,您需要能夠返回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

我看到一個問題是無法將一次除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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM