首页
技术小册
AIGC
面试刷题
技术文章
MAGENTO
云计算
视频课程
源码下载
PDF书籍
「涨薪秘籍」
登录
注册
第 10章 编写高效的函数
10.1 函数名
10.2 函数大小的权衡
10.3 函数的形参和实参
10.3.1 默认参数
10.3.2 使用*和**向函数传参
10.3.3 使用*创建可变参数函数
10.3.4 使用**创建可变参数函数
10.3.5 使用*和**创建包装函数
10.4 函数式编程
10.4.1 副作用
10.4.2 高阶函数
10.4.3 lambda 函数
10.4.4 在列表推导式中进行映射和过滤
10.5 返回值的数据类型应该不变
10.6 抛出异常和返回错误码
第 11章 注释、文档字符串和类型提示
11.1 注释
11.1.1 注释风格
11.1.2 内联注释
11.1.3 说明性的注释
11.1.4 总结性的注释
11.1.5 “经验之谈”的注释
11.1.6 法律注释
11.1.7 注释的专业性
11.1.8 代码标签和TODO 注释
11.1.9 神奇的注释和源文件编码
11.2 文档字符串
11.3 类型提示
11.3.1 使用静态分析器
11.3.2 为多种类型设置类型提示
11.3.3 为列表、字典等设置类型提示
11.3.4 通过注释向后移植类型提示
第 12章 通过Git管理项目
12.1 Git 提交和仓库
12.2 使用Cookiecutter新建Python项目
12.3 安装Git
12.3.1 配置Git 用户名和电子邮件
12.3.2 安装GUI Git 工具
12.4 Git 的工作流程
12.4.1 Git 是如何追踪文件状态的
12.4.2 为什么要暂存文件
12.5 在计算机上创建Git 仓库
12.5.1 添加供Git 追踪的文件
12.5.2 忽略仓库中的文件
12.5.3 提交修改
12.5.4 从仓库中删除文件
12.5.5 重命名和移动仓库中的文件
12.6 查看提交日志
12.7 恢复历史修改
12.7.1 撤销未提交的本地修改
12.7.2 取消暂存的文件
12.7.3 回滚近期的提交
12.7.4 回滚到单个文件的某次提交
12.7.5 重写提交历史
12.8 GitHub 和git推送命令
12.8.1 将一个已存在的仓库推送到GitHub
12.8.2 克隆已存在的GitHub仓库
当前位置:
首页>>
技术小册>>
Python编程轻松进阶(四)
小册名称:Python编程轻松进阶(四)
### 10.4.1 副作用:深入理解Python编程中的双刃剑 在Python编程的广阔天地里,每一行代码都扮演着特定的角色,执行着预设的任务。然而,在某些情况下,代码的执行不仅仅产生了我们预期的结果,还可能对程序的其他部分或外部环境产生了影响,这种额外的影响被称为“副作用”(Side Effects)。理解并妥善管理副作用,是Python编程进阶过程中不可或缺的一环,它直接关系到程序的健壮性、可维护性和可预测性。 #### 1. 副作用的定义与分类 **定义**:副作用指的是函数或代码片段在执行过程中,除了返回预期结果外,还修改了程序状态(如全局变量、外部数据结构、文件、数据库、网络状态等)或产生了可观察的非预期行为(如打印输出、日志记录、异常抛出等)。 **分类**: - **状态修改**:最直接的形式是修改全局变量或外部数据结构。这种修改可能对其他部分的代码行为产生影响。 - **输入输出操作**:包括文件读写、网络请求、数据库操作等,这些操作不仅改变了外部资源,还可能引发并发问题或资源竞争。 - **时间相关操作**:如获取当前时间、等待特定时间等,这些操作虽然不直接修改程序状态,但会影响程序的执行流程和性能。 - **日志与打印**:虽然看似无害,但过多的日志和打印输出会干扰程序的正常输出,甚至在某些情况下泄露敏感信息。 - **异常抛出**:异常处理是Python中的重要机制,但异常的抛出也视为一种副作用,因为它改变了程序的正常控制流。 #### 2. 副作用的利与弊 **利**: - **提升效率**:在某些场景下,合理使用副作用(如直接修改全局状态)可以减少数据传递的复杂度,提高代码执行效率。 - **简化代码**:对于某些全局配置或状态的共享,通过副作用可以避免将这些状态作为参数显式传递,从而简化函数或方法的签名。 - **增强交互性**:输入输出操作是程序与外界交互的桥梁,是实现用户交互、日志记录等功能的基础。 **弊**: - **降低可预测性**:副作用使得函数的执行结果不再仅仅取决于其输入参数,还受到外部状态的影响,这增加了程序行为的不可预测性。 - **难以维护**:随着程序规模的扩大,副作用可能导致“蝴蝶效应”,即一处微小的修改引发全局性的错误。 - **测试困难**:副作用使得单元测试变得复杂,因为需要模拟或隔离外部依赖,以确保测试的准确性和可靠性。 #### 3. 管理副作用的策略 **1. 最小化原则**: - 尽量减少不必要的副作用,特别是在函数或方法内部,避免修改全局状态或执行输入输出操作。 - 对于必须修改的状态,考虑使用封装或依赖注入等方式来限制其影响范围。 **2. 显式化**: - 将副作用明确化,通过函数命名、文档注释等方式告知调用者该函数会产生的副作用。 - 对于可能抛出异常的函数,在文档中明确列出可能抛出的异常类型。 **3. 隔离与模拟**: - 在单元测试中,使用mocking(模拟)技术来隔离外部依赖,确保测试的独立性和稳定性。 - 对于输入输出操作,考虑使用临时文件、内存数据库等方式来避免对真实环境的修改。 **4. 纯函数与不可变数据结构**: - 尽可能使用纯函数(即输入相同则输出也相同的函数,不产生任何副作用)和不可变数据结构(一旦创建便不可修改的数据结构),以减少副作用的发生。 **5. 遵循设计原则**: - 遵循单一职责原则(SRP),确保每个函数或类只负责一项功能,减少副作用的发生源。 - 遵循开闭原则(OCP),对扩展开放,对修改关闭,通过增加新的类或函数来处理新的需求,而不是修改现有的代码。 #### 4. 案例分析 **案例一:全局变量的滥用** ```python # 滥用全局变量的示例 x = 0 def increment(): global x x += 1 increment() print(x) # 输出 1 ``` 在这个例子中,`increment` 函数通过修改全局变量 `x` 来实现其功能,这是典型的副作用。更好的做法是,将 `x` 作为参数传递给函数,并返回修改后的值: ```python def increment(x): return x + 1 x = 0 x = increment(x) print(x) # 输出 1 ``` **案例二:文件操作的副作用** ```python # 写入文件的函数,带有副作用 def write_to_file(filename, content): with open(filename, 'w') as file: file.write(content) write_to_file('important_data.txt', 'Hello, World!') ``` 此函数直接操作文件系统,是明显的副作用。在单元测试中,可以使用mocking库(如unittest.mock)来模拟文件操作,避免对真实文件的修改。 #### 5. 结论 副作用是Python编程中不可避免的一部分,它既是强大的工具,也是潜在的陷阱。通过深入理解副作用的本质,采取有效的管理策略,我们可以扬长避短,编写出既高效又可靠的Python代码。在《Python编程轻松进阶(四)》的后续章节中,我们将继续探索更多高级编程话题,帮助读者在Python编程的道路上不断前行。
上一篇:
10.4 函数式编程
下一篇:
10.4.2 高阶函数
该分类下的相关小册推荐:
Python编程轻松进阶(三)
Python面试指南
Python机器学习基础教程(下)
Python与办公-玩转PDF
Python与办公-玩转PPT
Python甚础Django与爬虫
Python合辑11-闭包函数
Python编程轻松进阶(一)
Python机器学习实战
Python合辑4-130个字符串操作示例
Python数据分析与挖掘实战(上)
Python合辑2-字符串常用方法