37.递归

递归

递归在编程中是一种非常重要的算法

递归:即方法(函数)自己调用自己的一种特殊编程方法

如:def func():

  if .... :

    func()

  return ...

函数自己调用自己,即称之为递归调用

递归找文件

最典型的递归场景为找出一个文件夹中全部的文件

import os

def test_os():
    print(os.listdir("./bak"))   # 列出路径下的内容
    print(os.path.isdir("./bak/PySpark"))   # 判断指定路径是不是文件夹
    print(os.path.exists("./bak/PySpark"))   # 判断指定路径是否存在

def get_files_recursion_from_dir(path):
    """
    从指定的文件夹中使用递归的方式,获取全部的文件列表
    :param path: 被判断的文件夹
    :return: list, 包含全部的文件,如果目录不存在或者无文件就返回一个空list
    """
    file_list = []
    print(f"当前判断的文件夹是{path}")
    if os.path.exists(path):
        for f in os.listdir(path):
            new_path = path + "/" + f
            if os.path.isdir(new_path):
                # 进入到这里,表明这个目录是文件夹不是文件
                file_list += get_files_recursion_from_dir(new_path)
            else:
                file_list.append(new_path)

    else:
        print(f"指定的目录{path},不存在")
        return []
    return file_list

if __name__ == '__main__':
    test_os()
    print(get_files_recursion_from_dir("./bak"))
['1960-2019全球GDP数据.csv', 'GDP.html', 'hello.txt', 'orders.txt', 'PySpark', 'Python 常用命令备忘.txt', 'requirements.txt', 'search_log.txt', 'test.txt', '全国疫情地图.html', '全球GDP前八国家时间线柱状图.html', '基础时间线柱状图.html', '基础柱状图.html', '折线图数据', '数据分析案例', '河南省疫情地图.html', '测试地图.html', '疫情.txt', '疫情确症折线图.html']
True
True
当前判断的文件夹是./bak
当前判断的文件夹是./bak/PySpark
当前判断的文件夹是./bak/折线图数据
当前判断的文件夹是./bak/数据分析案例
当前判断的文件夹是./bak/数据分析案例/__pycache__
['./bak/1960-2019全球GDP数据.csv', './bak/GDP.html', './bak/hello.txt', './bak/orders.txt', './bak/PySpark/distinct.py', './bak/PySpark/filter.py', './bak/PySpark/flatMap.py', './bak/PySpark/hello.py', './bak/PySpark/map.py', './bak/PySpark/reduceByKey.py', './bak/PySpark/wordcount.py', './bak/PySpark/综合案例.py', './bak/Python 常用命令备忘.txt', './bak/requirements.txt', './bak/search_log.txt', './bak/test.txt', './bak/全国疫情地图.html', './bak/全球GDP前八国家时间线柱状图.html', './bak/基础时间线柱状图.html', './bak/基础柱状图.html', './bak/折线图数据/印度.txt', './bak/折线图数据/日本.txt', './bak/折线图数据/美国.txt', './bak/数据分析案例/2011年1月销售数据.txt', './bak/数据分析案例/2011年2月销售数据JSON.txt', './bak/数据分析案例/class_define.py', './bak/数据分析案例/file_define.py', './bak/数据分析案例/main.py', './bak/数据分析案例/new.txt', './bak/数据分析案例/__pycache__/class_define.cpython-312.pyc', './bak/数据分析案例/__pycache__/file_define.cpython-312.pyc', './bak/数据分析案例/每日销售额柱状图.html', './bak/河南省疫情地图.html', './bak/测试地图.html', './bak/疫情.txt', './bak/疫情确症折线图.html']