【Python高阶技巧】递归

2023-12-29 10:16:17

一、递归
二、递归找文件
三、os模块
四、os模块的3个基础方法
五、代码实现
六、总结

一、递归

递归是一种编程技术,其中一个函数在执行过程中调用自身。递归通常用于解决可以被拆分为更小且相似问题的问题。它是一种强大的工具,特别适用于问题的分治解决方案。

递归的基本思想包括两个关键部分:

  1. 基本情况(Base Case): 递归函数中的一个条件,当满足这个条件时,函数不再调用自身,而是返回一个确定的值。这是避免无限循环的关键。

  2. 递归步骤: 在函数内部调用自身,但问题规模更小。通过不断地调用自身来解决较小规模的问题,最终达到基本情况。

下面是一个简单的例子,计算阶乘的递归实现:

def factorial(n):
    # 基本情况:当n为0或1时,阶乘为1
    if n == 0 or n == 1:
        return 1
    # 递归步骤:n的阶乘等于n乘以(n-1)的阶乘
    else:
        return n * factorial(n - 1)

# 示例调用
result = factorial(5)
print("5的阶乘是:", result)

在这个例子中,当 n 不为0或1时,函数调用自身,并将问题规模减小为 (n-1)。递归的终止条件是 n 为0或1,此时直接返回1,不再继续递归。

递归是一种强大的编程技术,但在使用时需要小心处理基本情况,以防止无限递归。
在这里插入图片描述

二、递归找文件

递归查找文件是指通过一个函数调用自身的方式,在文件系统中逐层查找目标文件或目录。这通常用于深度优先搜索文件系统中的目录结构。下面是一个简单的 Python 脚本示例,演示了如何使用递归查找文件:

import os

def find_files(start_path, target_file):
    # 获取指定路径下的所有文件和目录
    items = os.listdir(start_path)

    for item in items:
        # 拼接完整路径
        item_path = os.path.join(start_path, item)

        # 判断是否为目标文件
        if os.path.isfile(item_path) and item == target_file:
            print("找到目标文件:", item_path)
        
        # 判断是否为目录,如果是则递归调用
        elif os.path.isdir(item_path):
            find_files(item_path, target_file)

# 示例调用
start_directory = "/path/to/search"  # 替换为实际的起始目录
target_filename = "example.txt"      # 替换为实际的目标文件名
find_files(start_directory, target_filename)

在这个示例中,find_files 函数接受起始路径和目标文件名作为参数。它首先获取指定路径下的所有文件和目录,然后遍历每个项目。如果项目是一个文件且文件名与目标文件名匹配,则输出找到的文件路径。如果项目是一个目录,则递归调用 find_files 函数,进一步查找该目录中的文件。

请替换示例中的 /path/to/searchexample.txt 为实际的起始目录和目标文件名。这是一个简单的演示,实际应用中可能需要考虑文件名匹配的规则、权限等因素。
在这里插入图片描述

三、os模块

os 模块是 Python 标准库中的一个模块,提供了与操作系统相关的功能。以下是 os 模块中一些常用的函数和属性:

  1. 文件和目录操作:

    • os.getcwd(): 获取当前工作目录。
    • os.chdir(path): 修改当前工作目录。
    • os.listdir(path='.'): 返回指定目录下的所有文件和目录的列表。
    • os.mkdir(path): 创建目录。
    • os.makedirs(path): 递归创建多层目录。
  2. 路径操作:

    • os.path.join(path1, path2, ...): 将多个路径组合成一个。
    • os.path.abspath(path): 返回规范化的绝对路径。
    • os.path.exists(path): 判断路径是否存在。
    • os.path.isdir(path): 判断是否为目录。
    • os.path.isfile(path): 判断是否为文件。
  3. 环境变量:

    • os.environ: 包含当前环境变量的字典。
    • os.getenv(name, default=None): 获取环境变量的值。
  4. 系统命令:

    • os.system(command): 在子shell中执行系统命令。
    • os.popen(command): 打开一个管道用于读取或写入。
    • os.spawnl(mode, path, ...)os.spawnv(mode, path, args): 在新进程中执行程序。
  5. 删除文件和目录:

    • os.remove(path): 删除文件。
    • os.rmdir(path): 删除目录。
    • os.removedirs(path): 递归删除目录。

这只是 os 模块的一小部分功能,还有其他一些方法和属性可供使用。这个模块对于处理文件、目录和系统级操作非常有用。

四、os模块的3个基础方法

os.listdir方法 返回指定目录下所有文件和目录的函数

os.listdir(path='.')os 模块中用于返回指定目录下所有文件和目录的函数。具体来说:

  • path: 可选参数,表示要列出内容的目录路径,默认为当前工作目录('.')。

该函数返回一个包含目录中所有文件和目录名称的列表。下面是一个简单的示例:

import os

# 获取当前工作目录下的所有文件和目录
files_and_dirs = os.listdir()

# 打印列表中的每个项
for item in files_and_dirs:
    print(item)

上述示例中,os.listdir() 返回当前工作目录下的所有文件和目录的列表,并通过 for 循环逐个打印出来。

你还可以指定一个特定的目录路径作为参数,例如:

import os

# 获取指定目录下的所有文件和目录
path = '/path/to/directory'
files_and_dirs = os.listdir(path)

# 打印列表中的每个项
for item in files_and_dirs:
    print(item)

请将 /path/to/directory 替换为实际的目录路径。这样,os.listdir() 将返回指定目录下的所有文件和目录。

os.path.isdir方法 判断指定路径是否为目录

os.path.isdir(path)os.path 模块中的一个函数,用于判断指定路径是否为目录。具体来说:

  • path: 要检查的路径。

该函数返回一个布尔值,如果指定的路径为目录,则返回 True;否则返回 False

下面是一个简单的示例:

import os

# 指定一个路径
path = '/path/to/directory'

# 检查路径是否为目录
if os.path.isdir(path):
    print(f"{path} 是一个目录。")
else:
    print(f"{path} 不是一个目录。")

在上述示例中,如果 /path/to/directory 是一个目录,则打印相应的信息。你可以根据实际情况替换路径。

这个函数在编写程序时非常有用,因为它允许你在操作文件系统时检查给定路径是文件还是目录。

os.path.exists方法 检查指定路径是否存在

os.path.exists(path)os.path 模块中的函数,用于检查指定路径是否存在。具体来说:

  • path: 要检查的路径。

该函数返回一个布尔值,如果指定的路径存在,则返回 True;否则返回 False

以下是一个简单的示例:

import os

# 指定一个路径
path = '/path/to/some/file.txt'

# 检查路径是否存在
if os.path.exists(path):
    print(f"{path} 存在。")
else:
    print(f"{path} 不存在。")

在这个示例中,如果 /path/to/some/file.txt 存在,则打印相应的信息。你可以根据实际情况替换路径。

这个函数常用于在进行文件或目录操作之前,先检查路径是否存在,以避免在不存在的路径上进行操作引发错误。

五、代码实现

"""
演示Python递归操作
需求:通过递归,找出一个指定文件夹内的全部文件

思路:写一个函数,列出文件夹内的全部内容,如果是文件就收集到list
如果是文件夹,就递归调用自己,再次判断。
"""

import os

def test_os():
    """演示os模块的3个基础方法"""
    print(os.listdir("D:/test"))          # 列出路径下的内容
    # print(os.path.isdir("D:/test/a"))   # 判断指定路径是不是文件夹
    # print(os.path.exists("D:/test"))    # 判断指定路径是否存在

def get_files_recursion_from_dir(path):
    """
    从指定的文件夹中使用递归的方式,获取全部的文件列表
    :param path: 被判断的文件夹
    :return: list,包含全部的文件,如果目录不存在或者无文件就返回一个空list
    """
    print(f"当前判断的文件夹是:{path}")
    file_list = []
    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__':
    print(get_files_recursion_from_dir("D:/test"))


def a():
    a()

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

六、总结

  1. 什么是递归
    在满足条件的情况下,函数自己调用自己的一种特殊编程技巧
  2. 递归需要注意什么?
    • 注意退出的条件,否则容易变成无限递归
    • 注意返回值的传递,确保从最内层,层层传递到最外层
  3. os模块的3个方法
    • os.listdir,列出指定目录下的内容
    • os.path.isdir,判断给定路径是否是文件夹,是返回True,否返回False
    • os.path.exists,判断给定路径是否存在,存在返回True,否则返回False

文章来源:https://blog.csdn.net/m0_62140641/article/details/135136200
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。