如何在递归函数python中使用列表



我正在编写一个递归遍历文件系统的函数,并返回使用.txt扩展名的所有文件列表。

pass_test_func参数只是可以运行和检查的函数(即文件大于100字节等) - nothing函数(将其设置为默认值),只需返回其参数即可。

我的实现:

def visit(dname, pass_test_func=nothing):           
    directory = os.listdir(dname)                   
    byte_list = []
    for file in directory:
        file_dir = os.path.join(dname, file)
        if os.path.isfile(file_dir) and file_dir.lower().endswith('.txt'):
            size = os.path.getsize(file_dir)
            if pass_test_func(size):
                byte_list.append(str(size) + ' ' + file_dir)
        elif os.path.isdir(file_dir):
            visit(file_dir, pass_test_func)
    return byte_list

我的问题是,当我在以下行中递归调用visit

elif os.path.isdir(file_dir):
                visit(file_dir, pass_test_func)

byte_list被清除以再次清空。我知道为什么会发生这种情况,但不知道该如何解决。该列表必须在visit的定义中定义,因此,每当我使用递归时,无论哪种权利,它都会始终重置吗?也许其他一些数据结构更适合,例如元组或词典?

您的函数返回byte_list,因此,当您进行递归呼叫时,只需附加返回的值,而不是像当前那样将其扔掉:

elif os.path.isdir(file_dir):    
    byte_list += visit(file_dir, pass_test_func)

添加一个可选的参数,可以在递归情况下使用:

# Using * makes byte_list keyword-only, so it can't be passed by normal callers by accident
def visit(dname, pass_test_func=nothing, *, byte_list=None):           
    directory = os.listdir(dname)           
    # When not passed explicitly, initialize as empty list
    if byte_list is None:
        byte_list = []
    for file in directory:
        file_dir = os.path.join(dname, file)
        if os.path.isfile(file_dir) and file_dir.lower().endswith('.txt'):
            size = os.path.getsize(file_dir)
            if pass_test_func(size):
                byte_list.append(str(size) + ' ' + file_dir)
        elif os.path.isdir(file_dir):
            # Pass explicitly to recursive call
            visit(file_dir, pass_test_func, byte_list=byte_list)
    return byte_list

作为Blorgbeard建议的替代方案,由于您返回byte_list,因此将其用于visit呼叫,仅更改原始代码中的一行:

        visit(file_dir, pass_test_func)

to:

        byte_list += visit(file_dir, pass_test_func)

这会创建其他临时list S,但这通常没什么大不了的。

最新更新