Python如何提取公共模块并避免代码重复

 更新时间:2025年02月23日 09:00:08   作者:Y11_推特同名  
模块化编程是提高代码重用性和可维护性的关键,这篇文章小编就来为大家详细介绍一下Python如何提取公共模块并避免代码重复,希望对大家有所帮助

模块化编程是提高代码重用性和可维护性的关键。在 Python 中,模块就是一个包含 Python 代码的文件(通常以 .py 结尾)。通过合理地组织代码到模块中,可以避免重复代码,让项目更易于管理和扩展。

1. 创建和使用模块

定义模块: 模块是包含函数、类或变量定义的文件。例如,创建一个 my_utils.py 文件:

# my_utils.py
def add(x, y):
  """
  将两个数字相加。
  """
  return x + y

def multiply(x, y):
  """
  将两个数字相乘。
  """
  return x * y

导入模块: 在其他 Python 文件中,使用 import 语句来使用模块中的功能:

# main.py
import my_utils

result_add = my_utils.add(5, 3)
result_multiply = my_utils.multiply(5, 3)

print(f"5 + 3 = {result_add}") # 输出:5 + 3 = 8
print(f"5 * 3 = {result_multiply}") # 输出:5 * 3 = 15

也可以使用 from ... import ... 语句导入模块中的特定函数或类:

# main.py
from my_utils import add

result = add(5, 3)
print(f"5 + 3 = {result}") # 输出:5 + 3 = 8

2. 组织模块结构

文件夹结构: 使用文件夹组织模块,使项目结构更清晰。例如:

my_project/
├── main.py
├── utils/
│   ├── __init__.py
│   ├── string_utils.py
│   └── math_utils.py

main.py: 主程序文件

utils/: 存放通用模块的文件夹

  • __init__.py: 让 utils 文件夹成为一个 Python 包 (package)。可以为空,或者包含一些初始化代码。
  • string_utils.py: 包含字符串处理函数的模块。
  • math_utils.py: 包含数学计算函数的模块。

避免循环依赖: 循环依赖是指两个或多个模块相互依赖,导致导入时出现问题。尽量避免这种情况。如果模块 A 和模块 B 都需要使用对方的功能,可以将公共部分提取到一个独立的模块 C 中,让 A 和 B 都依赖 C。

3. DRY 原则 (Don't Repeat Yourself)

DRY 原则的核心思想是避免代码重复。

封装通用功能: 将重复的代码块封装成函数或类。例如,在多个地方都需要进行数据清洗,可以创建一个 data_cleaning.py 模块:

# data_cleaning.py
def clean_data(data):
    """
    清洗数据,移除缺失值和异常值。
    """
    # 移除缺失值
    data = data.dropna()
    # 移除异常值(假设异常值是大于 100 的数据)
    data = data[data < 100]
    return data

然后在需要的地方导入并使用:

# main.py
import pandas as pd
from utils.data_cleaning import clean_data

# 示例数据
data = pd.Series([1, 5, 2, 105, 3, None, 88])
print(f"原始数据:\n{data}")

cleaned_data = clean_data(data)
print(f"清洗后的数据:\n{cleaned_data}")

输出结果:

原始数据:
0      1.0
1      5.0
2      2.0
3    105.0
4      3.0
5      NaN
6     88.0
dtype: float64
清洗后的数据:
0     1.0
1     5.0
2     2.0
4     3.0
6    88.0
dtype: float64

使用继承和组合: 在面向对象编程中,可以使用继承和组合来避免代码重复。

4. 其他最佳实践

  • 清晰的接口: 模块的公共函数和类放在文件的顶部,私有辅助函数放在底部,使用 _ 开头表示私有函数。
  • 一致的导入约定: 始终在文件顶部导入模块,使用绝对导入(例如 from my_project.utils import my_function)而不是相对导入(例如 from ..utils import my_function)。
  • 适当命名: 为模块、函数和变量使用具有描述性的名称,提高代码可读性。 例如,使用 calculate_average 而不是 calc_avg

5. 实际应用例子

Web 爬虫: 将爬虫的通用功能(如发送 HTTP 请求、解析 HTML)提取到独立的模块中,供不同的爬虫程序使用。

数据分析: 将数据预处理、特征工程、模型训练等通用功能提取到独立的模块中,方便在不同的数据分析项目中重用。

Web 开发: 将用户认证、权限管理、数据库操作等通用功能提取到独立的模块中,提高 Web 应用的开发效率。

6. 数值指标

通过模块化编程,可以提高代码的可维护性可测试性。 一些研究表明,良好的模块化设计可以减少高达 20% 的 bug 数量,并提高 15% 的开发效率。 此外,模块化还可以降低代码的耦合度,提高代码的内聚性。 一般而言,模块之间的耦合度越低越好,而模块内部的内聚性越高越好。 一些工具可以帮助评估代码的模块化程度,例如 SonarQube。

到此这篇关于Python如何提取公共模块并避免代码重复的文章就介绍到这了,更多相关Python提取公共模块内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Python参数传递实现过程及原理详解

    Python参数传递实现过程及原理详解

    这篇文章主要介绍了Python参数传递实现过程及原理详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-05-05
  • 给numpy.array增加维度的超简单方法

    给numpy.array增加维度的超简单方法

    这篇文章主要介绍了给numpy.array增加维度的超简单方法,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-06-06
  • Python基于opencv调用摄像头获取个人图片的实现方法

    Python基于opencv调用摄像头获取个人图片的实现方法

    今天小编就为大家分享一篇关于Python基于opencv调用摄像头获取个人图片的实现方法,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
    2019-02-02
  • Python图像处理之图片文字识别功能(OCR)

    Python图像处理之图片文字识别功能(OCR)

    Tesseract 是一个OCR 库,目前由Google 赞助(Google 也是一家以OCR 和机器学习技术闻名于世的公司)。这篇文章主要介绍了Python图像处理之图片文字识别功能 OCR的相关知识,需要的朋友可以参考下
    2019-07-07
  • 使用Python的Matplotlib绘制渐变的彩色曲线

    使用Python的Matplotlib绘制渐变的彩色曲线

    这篇文章主要介绍了使用Python的Matplotlib绘制渐变的彩色曲线,Matplotlib是Python生态圈中应用最为广泛的2D绘图库,通过扩展工具包mplot3d,也可以绘制简单的3D模型,需要的朋友可以参考下
    2023-08-08
  • Python安全传参给C函数的4种类型转换方法详解

    Python安全传参给C函数的4种类型转换方法详解

    这篇文章主要来带大家掌握Python调用C函数的安全传参技巧,被将详解C语言Python类型转换的4种核心方法,涵盖字符串、数值与指针转换场景,确保数据安全高效交互,感兴趣的小伙伴可以了解下
    2026-01-01
  • Jupyter Notebook/VSCode导出PDF中文不显示的解决

    Jupyter Notebook/VSCode导出PDF中文不显示的解决

    这篇文章主要介绍了Jupyter Notebook/VSCode导出PDF中文不显示的解决方案,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-06-06
  • Python爬虫之爬取我爱我家二手房数据

    Python爬虫之爬取我爱我家二手房数据

    我爱我家的数据相对来说抓取难度不大,基本无反爬措施. 但若按照规则构造页面链接进行抓取,会出现部分页面无法获取到数据的情况.在网上看了几个博客,基本上都是较为简单的获取数据,未解决这个问题,在实际应用中会出错,本文有非常详细的代码示例,需要的朋友可以参考下
    2021-05-05
  • Pytorch中的广播机制详解(Broadcast)

    Pytorch中的广播机制详解(Broadcast)

    这篇文章主要介绍了Pytorch中的广播机制详解(Broadcast),具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-01-01
  • python3里gbk编码的问题解决

    python3里gbk编码的问题解决

    本文主要介绍了python3里gbk编码的问题解决,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-08-08

最新评论