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

Python 模块化编程全解析:模块、包与第三方库管理指南

模块与包

模块化编程是什么?用生活例子秒懂

想象你在搭乐高积木:

  • 每个小积木块都有特定功能(比如轮子、窗户、墙壁)—— 这就像模块(一个.py 文件,封装了函数或类)。
  • 把相关的积木块装进一个盒子里,方便分类和取用 —— 这就像(一个文件夹,里面装多个模块和子包,带__init__.py 标识)。

模块化编程的核心思想是:把复杂代码拆成小而独立的 "积木",需要时直接拿来用,不用重复造轮子

1.模块的概念

        模块就是一个.py为后缀的python文件,可以被其它Python程序导入和使用,也可以自己独立运行,里面存放着的是一组相关函数或者类。

1.1模块的导入

        模块的导入使用import关键字,配合from和as有以下几种用法:

导入方式语法示例适用场景
导入整个模块import math需要用模块里的多个功能,用模块名.功能调用
导入模块并取别名import numpy as np模块名太长(如 numpy→np),简化代码
导入模块中的特定功能from os import getcwd只需要模块里的 1-2 个功能,避免代码冗余
导入特定功能并取别名from datetime import datetime as dt功能名太长或避免冲突
导入模块中所有功能from random import *

        import会把整个文件都导入进来,而使用from后可以只导入某一个模块,节省空间

示例

# 1. 导入整个模块
import math
print(math.sqrt(16))  # 用模块名.功能调用 → 4.0# 2. 别名简化
import pandas as pd  # 约定俗成的别名,大家都这么用
df = pd.DataFrame({"name": ["Alice"]})  # 用别名调用# 3. 导入特定功能
from os import getcwd, chdir
print(getcwd())  # 直接用功能名 → 输出当前目录# 4. 功能取别名
from datetime import datetime as dt
print(dt.now())  # 用别名调用 → 输出当前时间# 5. 导入所有功能(谨慎使用)
from random import *
print(randint(1, 10))  # 直接用函数名 → 随机1-10的整数

1.2模块的作用

  • 令Python代码的编写不必从零开始,不要重复写‘造轮子’的过程。
  • 避免同意模块内的命令冲突
  • 方便代码的管理与维护,提高代码的可读性

1.3模块的分类:内置、第三方、自定义

1.3.1内置模块(系统模块)

        Python解释器自带的标准库模块,可以直接导入使用,比如 keyword、os等,这些模块可直接导入而不需要安装,在所有安装了Python 解释器的电脑上都可以运行且每个py文件都会自动导入builtins模块。

特点

  • 即用即导入:直接import即可使用。

  • 性能高效:通常使用 C 语言实现。

1.3.1.1常见模块
模块功能官方文档
math数学运算math --- 数学函数 — Python 3.12.10 文档
os操作系统接口os --- Miscellaneous operating system interfaces — Python 3.13.5 文档
os.path路径相关os.path --- Common pathname manipulations — Python 3.13.5 文档
datetime日期和时间datetime --- Basic date and time types — Python 3.13.5 文档
random随机数生成random --- Generate pseudo-random numbers — Python 3.13.5 文档
time时间time --- Time access and conversions — Python 3.13.5 文档
1.3.1.2方法示例 
  • random模块:
import random
random.randint(1, 6)  # random.randint(a,b) 生产 a~b的随机整数
random.randint(1, 6)
random.random()   # random.random  生成包含0 但不包含1 的浮点数
random.choice("ABCD")    # 从一个序列中,随机返回一个元素
random.choice("ABCD")
L = [1, 2, 3, 6, 9]
random.choice(L)
random.shuffle(L)   # random.shuffer(x)  # 把列表X 打乱
print(L)
  •  time模块
import timetime.time()  # 返回当前时间的时间戳
time.ctime()  #返回当前的UTC 时间的字符串
t1 = time.localtime()  # 返回当前的本地时间元组
time.sleep(3)  # 让程序睡眠 n 秒
time.strftime("%Y-%m-%d", t1)  # 格式化时间
time.strftime("%y-%m-%d", t1)
time.strftime('%Y-%m-%d %H:%M:%S', t1)
  •  os模块:
# 1. os.getcwd(): 获取当前工作目录
import os
current_directory = os.getcwd()
print("当前工作目录:", current_directory)# 2. os.chdir(path): 改变当前工作目录
new_directory = "F:\\01.AI07.深度学习框架\\00.上课课件"
os.chdir(new_directory)
print("工作目录已更改为:", os.getcwd())# 3. os.listdir(path='.'): 返回指定目录下的所有文件和目录列表
directory_path = "."
files_and_dirs = os.listdir(directory_path)
print("指定目录下的文件和目录列表:", files_and_dirs)# 4. os.mkdir(path): 创建目录
new_directory = "new_folder"
os.mkdir(new_directory)
print(f"目录 '{new_directory}' 已创建")# 5. os.rmdir(path): 删除目录
directory_to_remove = "new_folder"
os.rmdir(directory_to_remove)
print(f"目录 '{directory_to_remove}' 已删除")# 6. os.remove(path): 删除文件
file_to_remove = "example.txt"
os.remove(file_to_remove)
print(f"文件 '{file_to_remove}' 已删除")

1.3.2第三方模块

        由其他开发者开发且需要通过包管理工具(pip)安装的模块,比如Numpy、Pandas等库,如果有代码需要放到别的电脑上运行,那么这个电脑也需要先安装用到的第三方库才可以正常运行。
1.3.2.1常见模块 
模块功能示例
numpy数值计算科学运算、矩阵操作
pandas数据分析数据清洗与处理
matplotlib数据可视化绘制图表
requestsHTTP请求处理爬取网页内容,调用API
flaskWeb应用框架快速搭建Web服务
1.3.2.2使用示例 

安装更新与卸载

安装
pip install  numpy  pandas requests
更新
pip install numpy  pandas requests
卸载
pip uninstall  numpy  pandas requests

使用

  • numpy 模块
import numpy as np
array = np.array([1, 2, 3])
print(array.mean())  # 输出: 平均值 2.0
  • pandas 模块
import pandas as pd
df = pd.DataFrame({"Name": ["Alice", "Bob"], "Age": [25, 30]})
print(df)
  •  requests 模块:用requests爬取网页内容
import requests# 发送请求获取网页内容
response = requests.get("https://api.github.com")  # 调用GitHub开放API# 打印结果(JSON格式)
print(response.json())  # 输出:GitHub API的返回数据(字典形式)

1.3.3自定义模块

        用户根据需求自己编写的.py文件。

1.3.3.1创建模块

        创建一个myutils.py文件:

# utils.py
def add(a, b):return a + bdef greet(name):return f"Hello, {name}!"
1.3.3.2 使用模块

        创建一个main.py文件,并导入自定义模块:

# main.py
import myutilsprint(myutils.add(3, 5))  # 输出: 8
print(myutils.greet("Alice"))  # 输出: Hello, Alice!
1.3.3.3 跨文件夹使用

        在main.py中:

'''
假设目录结构如下:
project/utils/__init__.pymath_utils.pymain.py
'''
from utils.math_utils import addprint(add(3, 5))  # 输出: 8

 

1.4模块内置变量

        可通过dir()查看模块的内置变量:
  • __name__:用于确定模块是被直接运行还是被导入到其他模块中。当一个模 块被直接运行时,__name__的值是”__main__”,否则为模块的名称。
  • __doc__:包含模块的说明性文档。
  • __file__:包含模块的文件路径。
  • __all__:定义一个模块中的哪些变量、函数或类可以通过from module import *导入时可以用。
  • __package__:包含模块所在的包的名称。
  • __dict__:包含模块的全局命名空间。

2.包的概念

        就是一个有层次的文件目录结构,用来更好的组织和管理模块。通俗的说就 是一个目录,里面存放python文件和新的包目录,并且每一个包目录都需要存在 一个__init__.py文件,__init__.py文件可以没有内容,但必须有这个文件。
  • 作用:用于组织模块的集合,形成层次化的结构,便于管理大型项目。

  • 结构:

    my_package/__init__.pymodule1.pymodule2.pysubpackage/__init__.pymodule3.py
        注意:__init__.py文件在Python3.3版本后其实就不用在创建了,但是为了不同 版本下的代码兼容,建议还是创建,且PyCharm会自动创建。

2.1__init__.py文件的主要作用:

  • 标识包目录:告诉Python解释器该文件所在的目录应被视为一个包而不是一 个普通的目录。如果没有这个文件,可能会无法正常导入包内的模块。
  • 执行初始化代码:在该文件中也可以存在代码,在调用该包里的模块时,该文 件里的代码也会被运行。
  • 控制包的导入行为:通过__all__来控制哪些模块可以被导入,从而限制包的公 开接口,防止不需要的模块导入。
  • 提供包级别的命名空间:在该文件中定义的变量和函数可以在包的其他模块中 共享。
  • 批量导入模块:在该文件中可以批量导入系统模块或其他模块。

示例:

# __init__.py 文件示例# 1. 批量导入系统模块
import os
import sys
import datetime# 2. 定义包级别的变量
package_variable = "This is a package variable"# 3. 控制包的导入行为
__all__ = ['module1', 'module2']# 4. 执行初始化代码
print("Initializing mypackage")# 注意:这个代码会在包被导入时执行# 5. 导入包内的模块
from . import module1
from . import module2

2.2导入包和子包

  • 使用import关键字可以导入包和子包,以访问其中的模块和内容。

    # 同模块的导入规则import 包名 [as 包别名]import  包名.模块名 [as 模块新名]import  包名.子包名.模块名 [as 模块新名]from 包名 import 模块名 [as 模块新名]from 包名.子包名 import 模块名 [as 模块新名]from 包名.子包名.模块名 import 属性名 [as 属性新名]# 导入包内的所有子包和模块from 包名 import *from 包名.模块名 import *

 示例:

# 导入包中的模块
import matplotlib.pyplot as plt# 导入子包中的模块
from sklearn.linear_model import LinearRegression

2.3第三方包的相关操作:

安装
pip install package-name==version
更新
pip install –upgrade package-name
卸载
pip uninstall package-name

2.4包的创建

        新建一个Python软件包,就是创建了一个包,里面自带__init__.py文 件,只需要将写好的模块或包放入进去或直接在里面创建模块或即可。

3.模块与包的区别

模块
一个Python文件一个包含__init__.py的文件夹
提供基本功能单元用于组织多个模块
文件名为.py目录名

 

4. 解析顺序

        在使用 import module_name时,Python 会按照特定顺序搜索并加载模块。

4.1 模块解析顺序

查找优先级查找位置说明
1️⃣ 内置 C 扩展模块sys.builtin_module_namesmath, sys, time, os
2️⃣ sys.modules 缓存sys.modules避免重复加载
3️⃣ 当前目录os.getcwd()同名文件或目录
4️⃣ PYTHONPATH 变量sys.path环境变量指定的路径
5️⃣ Python 标准库/usr/lib/python3.x/Lib/标准 Python 库
6️⃣ site-packages(第三方库)site.getsitepackages()pip install 安装的模块
7️⃣ __pycache__/*.pyc__pycache__/预编译字节码

 

4.2 内置C扩展模块

        最高优先级,Python 直接加载,不查找文件

4.3 sys.modules

        如果模块已加载,则直接返回,避免重复导入

import sys
print(sys.modules.keys())  # 查看已加载的模块

4.4 当前目录

        如果 C 扩展模块中找不到,就查找当前目录下是否有 module_name.py 或 module_name 目录

import os
print(os.getcwd())  # 查看当前目录

4.5 PYTHONPATH

        如果当前目录没有该模块,则检查 $PYTHONPATH$ 环境变量中的目录

import sys
print(sys.path)  # 列出所有可能的搜索路径sys.path.insert(0, "/custom/path/")  # 添加路径

4.6 标准库

如果前面路径都找不到,会查找标准库中的模块。

4.7 第三方模块

最后,进入 site-packages 目录查找安装的第三方模块。

import site
print(site.getsitepackages())

4.8 __pycache__/

        从__pycache__/目录中加载 .pyc 文件,而不是重新解析 .py 文件。

        你可以删除 __pycache__/ 让 Python 重新编译 .py。

5.总结:模块化编程的核心价值

        模块化编程让Python代码从"一团乱麻"变成"井然有序的积木":  

  • - 代码复用:写一次功能,到处调用,不用重复劳动。  
  • - 易于维护:模块独立,改一处不影响其他部分。  
  • - 团队协作:多人分工写不同模块,最后像拼积木一样组合。  

        记住:学好模块和包,是从"写脚本"到"开发项目"的关键一步。下次写代码时,试试把常用功能拆成模块——你会发现代码变得清爽又好维护!

http://www.xdnf.cn/news/15783.html

相关文章:

  • [Raspberry Pi]如何將無頭虛擬顯示器服務(headless display)建置在樹莓派的Ubuntu桌面作業系統中?
  • SGMD辛几何模态分解 直接替换Excel运行包含频谱图相关系数图 Matlab语言!
  • 微信小程序列表数据上拉加载,下拉刷新
  • 7.事务操作
  • 手机兼容测试服务提供商对比分析:如何选择最合适的测试平台
  • 分层图最短路径算法详解
  • Spring整合MyBatis详解
  • 通过轮询方式使用LoRa DTU有什么缺点?
  • Trae IDE:打造完美Java开发环境的实战指南
  • JUnit5 实操
  • 系统设计时平衡超时时间与多因素认证(MFA)带来的用户体验下降
  • istio如何自定义重试状态码
  • 【Jmeter】报错:An error occured:Unknown arg
  • FreeRTOS—中断管理
  • 基于pytorch深度学习笔记:2.VGGNet介绍
  • 腾讯会议本地录屏转存失败解决办法
  • 支付宝小程序 MAU(月活跃用户数)是衡量用户粘性与生态影响力的核心指标
  • 【深度学习新浪潮】AI在finTech领域有哪些值得关注的进展?
  • 专业职业评估工具,多维度数据分析
  • 【人工智能agent】--dify版本更新(通用)
  • 无线调制的几种方式
  • Oracle数据泵详解——让数据迁移像“点外卖”一样简单​
  • ESLint 完整功能介绍和完整使用示例演示
  • QT 交叉编译环境下,嵌入式设备显示字体大小和QT Creator 桌面显示不一致问题解决
  • 【赵渝强老师】Redis的主从复制集群
  • AAC音频格式
  • 新安装的ubuntu 20.04缺少wifi图标 [已解决]
  • Python类型转换,深浅拷贝
  • oracle rac自动表空间自动扩展脚本
  • 基于 Electron + Vue 3 的桌面小说写作软件架构设计