【Python高阶技巧】递归

一、递归
二、递归找文件
三、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
  • 17
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
Python高级技术是指在Python编程语言中,具有一定难度和复杂性,并且需要较高水平的技能和经验才能掌握的一些技术。这些技术可以帮助程序员更好地开发复杂的应用程序、优化性能、实现高级功能等。一些常见的Python高级技术包括但不限于以下几个方面: 1. 函数式编程:Python支持函数式编程范式,其中包括高阶函数、闭包、lambda表达式、递归等技术。函数式编程可以提高代码的简洁性和可读性,并且可以实现一些高级的功能,如函数的柯里化、惰性求值等。 2. 迭代器和生成器:Python中的迭代器和生成器是处理大规模数据集合时非常有用的工具。迭代器和生成器可以逐个地处理元素,而不需要将整个数据集加载到内存中。这可以大大减少内存的使用,提高程序的效率。 3. 多线程和多进程:Python提供了多线程和多进程的支持,可以在同一个程序中同时执行多个任务或处理多个并发请求。使用多线程和多进程可以提高程序的并发性能,加快任务的执行速度。 4. 异步编程:Python中的异步编程可以通过使用协程、asyncio库等技术来实现。异步编程可以提高程序在IO密集型任务中的性能,并且可以实现非阻塞的并发操作。 5. 元编程:Python中的元编程是指在运行时动态地创建或修改代码的能力。通过使用元编程技术,可以实现一些高级的功能,如动态生成类、修改函数的行为等。 需要注意的是,掌握这些高级技术需要有一定的编程基础和经验,并且需要不断实践和深入学习。如果你想提升自己在Python编程中的高级技能,可以参考上述引用中提到的教程资源,以及其他相关的学习资料和实践项目。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* *3* [每个程序员都应该知道的高级 Python 技术(附零基础学习资料)](https://blog.csdn.net/SpringJavaMyBatis/article/details/127671918)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

咖喱年糕

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值