当前位置: 首页 > news >正文

【Python语言基础】20、模块与包

文章目录

    • 1. 模块
      • 1.1 模块的作用
      • 1.1 模块的使用
      • 1.2 模块的优点
    • 2. 包
      • 2.1 包的概念
      • 2.2 包的作用
      • 2.3 包的创建
      • 2.4 包的使用
    • 3. 模块与包的区别
      • 3.1 定义与结构
      • 3.2 功能与用途
      • 3.3 导入方式

1. 模块

在 Python 里,模块就像是一个存放各种工具(函数、类、变量等)的盒子,方便我们把相关的代码组织在一起,让代码更有条理,也能提高代码的可复用性。

1.1 模块的作用

  • 组织代码:假如你要编写一个非常复杂的程序,比如开发一个游戏或者一个网站应用,里面会有很多不同功能的代码。如果把所有代码都写在一个文件里,就会变得杂乱无章,很难管理和理解。这时候就可以把不同功能的代码分别放到不同的模块中。比如,把处理游戏角色移动的代码放在一个 movement.py 模块里,把处理游戏画面显示的代码放在 graphics.py 模块里。这样,每个模块都有自己明确的职责,代码结构就清晰多了。

  • 代码复用:当你在一个模块中编写了一些有用的函数或类之后,在其他项目或者同一个项目的其他部分中,如果也需要用到这些功能,就可以直接导入这个模块来使用,而不需要重新编写代码。例如,你编写了一个用于计算各种数学公式的模块 math_utils.py,里面有计算圆面积、三角形面积等函数。那么在其他需要进行数学计算的项目中,都可以导入这个模块来使用这些函数,大大提高了开发效率。

1.1 模块的使用

  • 创建模块:创建模块非常简单,只需要创建一个以 .py 为后缀的文件,然后在文件里编写函数、类、变量等代码就可以了。例如,创建一个名为 my_module.py 的文件,内容如下:
# 定义一个函数
def say_hello():print("Hello, World!")# 定义一个变量
my_variable = 10# 定义一个类
class MyClass:def __init__(self, name):self.name = namedef say_name(self):print(f"My name is {self.name}")
  • 导入模块:在其他 Python 文件中,如果想要使用 my_module.py 中定义的函数、类或变量,就需要先导入这个模块。导入模块有多种方式,比如可以使用 import 语句直接导入整个模块:
import my_modulemy_module.say_hello()
print(my_module.my_variable)
obj = my_module.MyClass("Alice")
obj.say_name()

也可以使用 from…import… 语句只导入模块中的特定函数、类或变量:

from my_module import say_hello, MyClasssay_hello()
obj = MyClass("Bob")
obj.say_name()

这样,我们就可以方便地使用模块中定义的各种工具了,就好像这些工具是在当前文件中定义的一样。

模块是 Python 中非常重要的一个概念,它能帮助我们更好地组织和管理代码,提高代码的质量和可维护性,让我们能够更高效地开发各种复杂的程序。

1.2 模块的优点

  1. 提高代码复用性
    把通用的功能封装于模块里,在多个项目或者同一项目的不同部分重复使用,防止代码重复编写,从而提升开发效率。

例如,你可以创建一个数学计算模块,在不同项目里使用其中的函数进行数学运算

# math_utils.py
def add(a, b):return a + bdef subtract(a, b):return a - b

在其他 Python 文件中,可以这样使用这个模块:

from math_utils import add, subtractresult_add = add(5, 3)
result_subtract = subtract(5, 3)
  1. 增强代码可维护性
    把代码按照功能划分成不同的模块,每个模块负责特定的功能,这有助于降低代码的复杂度,使代码结构更加清晰。
    当需要修改或者扩展功能时,只需针对特定模块进行操作,不会对其他模块产生影响。

  2. 实现代码隔离
    模块可以对代码进行隔离,避免命名冲突。
    不同模块里可以使用相同的变量名或者函数名,而不会相互干扰。例如,在不同模块中可以有同名的函数,但它们的功能和作用范围是相互独立的。

  3. 便于团队协作开发
    在大型项目中,团队成员能够各自负责不同的模块开发,最后将这些模块整合在一起。这样能够提高开发效率,减少团队成员之间的代码冲突

  4. 方便代码管理
    模块可以作为独立的文件或者文件夹进行管理,方便版本控制和发布。你可以对模块进行单独的测试、部署和更新,而不会影响整个项目的稳定性

  5. 提高代码安全性
    通过模块的封装,能够隐藏内部实现细节,只对外提供必要的接口。
    这样可以防止外部代码对模块内部数据和函数的非法访问和修改,提高代码的安全性

2. 包

在 Python 里,包就像是一个装代码的 “大盒子”,它能把众多相关的模块组织到一起,让代码的管理和使用更加便利。

2.1 包的概念

可以把包想象成一个文件夹,而模块就是这个文件夹里的文件。

包里面除了模块文件,还可以有子文件夹(子包),子文件夹中又能包含自己的模块和子文件夹。例如,有一个名为 graphics 的包,它用于处理图形相关的功能,这个包下面可能有 shapes 子包用于处理各种图形形状,colors 子包用于处理颜色相关操作。

2.2 包的作用

  • 组织代码:当项目规模变大,代码文件增多时,把相关的模块放在同一个包中,能让代码结构更清晰。比如一个大型游戏项目,可能会有 audio 包来管理音频相关的模块,video 包来管理视频相关的模块。
  • 避免命名冲突:不同包中的模块可以使用相同的名称。例如,math 包和 graphics 包中都可以有一个名为 utils 的模块,因为它们处于不同的命名空间。

2.3 包的创建

创建一个包很简单,只需要创建一个文件夹,并且在这个文件夹中添加一个名为 init.py 的文件(Python 3.3 及以后的版本,init.py 文件不是必需的,但为了兼容性,通常还是会添加)。

例如,要创建一个名为 my_package 的包,可以这样操作

my_package/__init__.pymodule1.pymodule2.py

2.4 包的使用

在使用包中的模块时,需要使用特定的导入语句。假设 module1.py 中有一个函数 func1,可以这样导入和使用:

from my_package import module1module1.func1()

也可以直接导入模块中的函数:

from my_package.module1 import func1func1()

通过使用包,可以更好地组织和管理 Python 代码,提高代码的可读性和可维护性。

3. 模块与包的区别

在 Python 里,模块和包都是用于组织代码的方式,但它们在规模和结构上有所不同

3.1 定义与结构

  • 模块
    模块是一个单独的 Python 文件,也就是以 .py 为后缀的文件。它就像一个工具箱,里面装着各种工具(函数、类、变量等),这些工具可以被其他 Python 代码使用。例如,有一个名为 math_utils.py 的模块文件,其内容可能如下:
# 定义一个计算圆面积的函数
import mathdef calculate_circle_area(radius):return math.pi * radius ** 2

  • 包是一个包含多个模块的文件夹。为了让 Python 把一个文件夹视为包,该文件夹下必须有一个特殊的文件 __init__.py(在 Python 3.3 及以后的版本中,init.py 文件不是必需的,但为了兼容性和清晰性,通常还是会保留)。包可以包含子包和多个模块,形成一个层次化的结构。比如,有一个名为 my_package 的包,其结构可能如下:
my_package/
├── __init__.py
├── module1.py
├── module2.py
└── sub_package/├── __init__.py└── sub_module.py

3.2 功能与用途

  • 模块
    模块主要用于将相关的代码组织在一起,实现单一或一组相关的功能。它的功能相对较为集中和独立,便于代码的管理和复用。例如,上述的 math_utils.py 模块专门用于进行数学计算,其他程序可以导入这个模块来使用其中的 calculate_circle_area 函数


  • 包则用于组织多个相关的模块,将它们按照功能或逻辑进行分组,形成一个更大的代码库。包可以帮助开发者更好地管理大型项目中的代码,避免命名冲突,提高代码的可维护性和可读性。比如,在一个 Web 开发项目中,可以创建一个名为 web_app 的包,其中包含用于处理路由的 routes 子包、用于数据库操作的 database 子包等。

3.3 导入方式

  • 模块
    导入模块时,使用 import 语句后面直接跟模块名(不包含 .py 后缀)。例如,要导入 math_utils.py 模块,可以这样写:
import math_utilsarea = math_utils.calculate_circle_area(5)
print(area)

也可以使用 from…import… 语句导入模块中的特定对象:

from math_utils import calculate_circle_areaarea = calculate_circle_area(5)
print(area)

  • 导入包时,同样使用 import 语句,但需要指定包名和模块名,用点号分隔。例如,要导入 my_package 包中的 module1.py 模块,可以这样写:
import my_package.module1my_package.module1.some_function()

也可以使用 from…import… 语句更灵活地导入包中的模块或对象:

from my_package import module1
from my_package.module2 import some_variablemodule1.some_function()
print(some_variable)

综上所述,模块是 Python 代码组织的基本单位,是单个的 Python 文件;

而包是多个模块的集合,通过文件夹的形式来组织代码,形成层次化的结构,它们在不同的场景下发挥着各自的作用

相关文章:

  • 用 Vue 3 + OpenAI API 实现一个智能对话助手(支持上下文、多角色)
  • fastjson2 使用bug
  • 每日算法-链表(2.两数相加、24.两两交换链表中的节点、143.重排链表)
  • 怎么通过OPPO手机进行图片编辑?图片编辑攻略,打造专业级照片
  • vscode格式化为什么失效?自动保存和格式化(Prettier - Code formatter,vue-format)
  • MySQL入门:数据表的创建
  • HTTP HTTPS RSA
  • AI核心概念之“结构化输出(Structured Output)” - 来自DeepSeek
  • Terraform - 理解 Count 和 For_Each 循环
  • 力扣 283 移动零的两种高效解法详解
  • 深度学习--神经网络的构造
  • AI核心概念之“提示(Prompt)” - 来自DeepSeek
  • Python字符串操作全解析:从基础到高阶应用
  • mysql关联查询语句
  • C/C++条件判断
  • 混合开发部署实战:PyInstaller + .NET 8 + Docker全链路配置
  • flutter doctor 信号号超时
  • CCF CSP 第36次(2024.12)(1_移动_C++)
  • 基于STM32、HAL库的TCA9555PWR I/O扩展器驱动程序设计
  • linux如何用关键字搜索日志
  • CSR周刊:李宁打造世界地球日特别活动,珀莱雅发布2024年度可持续发展报告
  • 一回合摘下“狮心”,张名扬霸气回应观众:再嘘一个我听听
  • 俄联邦安全局:俄军高级官员汽车爆炸案嫌疑人已被捕
  • 建投读书会·东西汇流|全球物品:跨文化交流视域下的明清外销瓷
  • 观察|上海算力生态蓬勃发展,如何助力千行百业数智化转型升级
  • 一年吸引30多万人次打卡,江苏这个渔村是怎么做到的?