模块
模块就是 Python 中的“工具包”。
每一个 .py 文件都可以视为一个模块,可以包含:
- 函数
- 类
- 变量
- 可执行代码
模块的作用:
让功能拆分更明确,方便复用、管理和维护。
什么是模块
PDF 第 1 页原文说明:
一个 Python 文件,以 .py 结尾,就是一个模块。
模块内可以定义函数、类、变量,也可以包含可执行代码。
模块让我们可以在多个文件之间复用功能,避免重复开发。
模块的导入语法
PDF 展示了模块导入的 5 种常见写法:
import 模块名
from 模块名 import 功能
from 模块名 import *
import 模块名 as 别名
from 模块名 import 功能 as 别名
下面逐一解释每种方式。
用法一:import 模块名
语法:
import 模块名
使用模块内容:
模块名.功能名()
PDF 示例(导入 time 模块):
import time
print("开始")
time.sleep(10)
print("结束")
页面截图中(PDF 第 1 页)展示的是执行结果:
开始
(等待10秒)
结束
用法二:from 模块名 import 功能名
语法:
from 模块名 import 功能名
使用时无需写模块名前缀:
功能名()
PDF 示例(导入 sleep 方法):
from time import sleep
print("开始")
sleep(10)
print("结束")
效果与用法一一致。
用法三:import 模块名 as 别名 / from 模块名 import 功能 as 别名
语法:
import 模块名 as 别名
别名.功能名()
from 模块名 import 功能名 as 别名
别名()
PDF 示例:
import time as tt
tt.sleep(10)
from time import sleep as sl
sl(10)
别名通常用于:
- 模块名太长
- 避免与当前文件变量名冲突
**用法四:from 模块名 import ***(全部导入)
语法:
from 模块名 import *
表示导入该模块所有可用功能。
示例(PDF 第 2 页):
from time import *
sleep(10)
注意:
- 不推荐在大型项目中使用
*,容易造成命名冲突 - 后面会讲到使用
__all__控制可导入的功能
导入模块的小结(PDF 第 3 页)
PDF 总结:
- import 可以省略 as
- from 可以省略 as
- 通过
模块.功能()或直接功能()来使用 - 模块导入应写在文件开头位置(PEP8 规范)
自定义模块
PDF 第 3~4 页说明:
每一个 Python 文件本身就是一个模块,只要在另一个文件中 import 它,就能使用其内容。
示例:
test_3.py(自定义模块)
def add(x, y):
return x + y
def sub(x, y):
return x - y
test_04.py(使用模块)
import test_3
res_add = test_3.add(5, 3)
print(res_add)
res_sub = test_3.sub(5, 3)
print(res_sub)
PDF 截图(第 4 页)显示运行结果:
8
2
自定义模块的注意事项
在多个 Python 文件之间相互导入时,需要注意模块的命名问题、执行入口标识、以及限定可导入内容等事项。
PDF 提供了三个重点:入口判断 __main__、命名冲突、__all__ 控制导入功能。
自定义模块的执行入口:__main__
Python 中每个文件都可以直接运行,也可以作为模块被其他文件导入。
两种方式的区别:
- 直接运行文件 → 对应模块的
__name__ == "__main__" - 被其他文件 import → 对应模块的
__name__ == 文件名
因此,若想让某段代码只在“直接运行”时执行,而不在 import 时执行,可写:
if __name__ == "__main__":
print("此代码只会在直接运行本文件时执行")
PDF 示例(页面 4):
test_3.py:
def add(x, y):
print(f"{x} + {y} = {x + y}")
def sub(x, y):
print(f"{x} - {y} = {x - y}")
if __name__ == "__main__":
print("我是主执行入口")
add(5, 3)
sub(5, 3)
运行 test_3.py → 输出:
我是主执行入口
5 + 3 = 8
5 - 3 = 2
但当另一个文件 import test_3 时:
import test_3
test_3 中 if 块不会执行。
模块命名冲突问题
PDF 第 5 页特别强调:
自定义模块名不能与 Python 内置模块名相同,否则会造成覆盖。
例如:
如果你创建一个名为 time.py 的文件:
time.py ← 你写的
time 模块 ← Python 内置标准库
然后执行:
import time
Python 会优先导入你写的 time.py,而不是官方的 time 模块,导致各种功能无法使用。
PDF 图示的错误示例(文字化):
AttributeError: module 'time' has no attribute 'sleep'
解决方案:
- 不要使用 Python 标准库模块名命名你的文件
- 避免使用过于通用的名称(如 math、os、sys 等)
控制模块被导入的内容:__all__
当使用:
from 模块 import *
时,理论上模块中的所有“非下划线开头”的功能都会被导入。
但有时我们希望控制哪些内容可以被 * 导入。
可以在模块内定义:
__all__ = ["add", "sub"]
表示:
- 只允许 add、sub 被
from 模块 import *导入 - 其他功能不允许被导入
PDF 示例(页面 6):
test_3.py:
__all__ = ["add"]
def add(x, y):
print(f"{x} + {y} = {x + y}")
def sub(x, y):
print(f"{x} - {y} = {x - y}")
test_04.py:
from test_3 import *
add(5, 3)
sub(5, 3)
运行结果(PDF 截图文字化):
5 + 3 = 8
NameError: name 'sub' is not defined
原因:sub 不在 __all__ 中,所以不会被导入。
注意事项总结
__main__用于区分脚本运行 VS 模块被导入- 模块名不要与标准库冲突
- 使用
__all__控制通配符导入内容
内置模块与第三方模块
Python 为我们提供了三类模块:
- 内置模块(Python 自带)
- 第三方模块(需要安装)
- 自定义模块(我们自己写的 .py 文件)
本章介绍 PDF 中的前两类:内置模块与第三方模块。
内置模块
内置模块无需安装,Python 自带即可使用,例如:
- time
- random
- math
- os
- sys
直接 import 即可。
示例:random 模块
PDF 第 7 页示例:
# 随机整数
import random
num = random.randint(0, 10)
print(num)
输出的数字在 0~10 之间随机变化。
random.randint()
语法:
random.randint(a, b)
含义:
- 生成一个 a <= n <= b 的随机整数,可用于:
- 随机验证码
- 随机抽奖
- 随机取样
- 游戏随机事件
第三方模块
PDF 第 7~8 页对第三方模块进行了说明:
第三方模块不属于 Python 官方,需要通过
pip安装后才能使用。
第三方模块通常由社区、企业、个人开发,例如:
- requests(网络请求)
- numpy(科学运算)
- pandas(数据分析)
- matplotlib(绘图)
pip 安装模块
PDF 图示说明了 pip 的三种用法(完整文字化如下):
方式一(推荐):直接安装到当前 Python 环境
pip install 模块名
示例:
pip install requests
若成功,会出现提示:
Successfully installed requests-xxxx
方式二:指定版本安装
pip install 模块名==版本号
示例:
pip install requests==2.31.0
方式三:升级模块
pip install 模块名 --upgrade
示例:
pip install requests --upgrade
第三方模块的使用
安装完成后即可 import:
import requests
resp = requests.get("https://www.baidu.com")
print(resp.text)
PDF 截图中的解释:
- requests.get() 发送 HTTP GET 请求
- resp.text 获取响应内容
第三方模块放在哪里?(PDF 页面解释)
安装后的第三方模块会放在 site-packages 目录下:
示例路径(PDF 文字):
C:\Users\xxx\AppData\Local\Programs\Python\Python39\Lib\site-packages
注意:
- 不要在此目录中手动修改文件
- pip 会自动管理第三方模块的安装与卸载
包(package)
包是更大一级的代码组织结构,用于管理大量模块。
通俗理解:
包 = 文件夹(目录) + 一组相关模块(.py 文件) + 一个 init.py 文件
包的作用:
- 让 Python 项目的目录结构更清晰
- 更适合大型项目的模块化开发
- 管理多个模块的命名空间
- 支持从包中按层级导入模块和功能
包的目录结构(PDF 示例完整文字版)
PDF 第 8 页展示了一个典型包结构(图示文字化如下):
my_package/ ← 包的文件夹
│
├── __init__.py ← 包初始化文件(包的标识)
├── module1.py
├── module2.py
└── module3.py
重要说明:
- 一个目录只有包含
__init__.py文件,才会被 Python 识别为包。 - 包内可以继续嵌套子包。
包的导入方式
PDF 介绍了两种主要方式:
方式一:import 包名.模块名
import my_package.module1
my_package.module1.add(5, 3)
方式二:from 包名.模块名 import 功能名
from my_package.module1 import add
add(5, 3)
更简洁。
示例
目录:
my_package/
│
├── __init__.py
├── math_tool.py
└── string_tool.py
math_tool.py:
def add(x, y):
print(x + y)
string_tool.py:
def upper_case(s):
print(s.upper())
使用包(PDF 第 9 页示例):
from my_package.math_tool import add
from my_package.string_tool import upper_case
add(3, 5)
upper_case("guanzhi")
输出(PDF 中结果文字化):
8
GUANZHI
init.py 的作用
标识该目录为包
没有这个文件 → Python 不把它当包
有这个文件 → 可以 import 这个包
包的初始化(控制包的行为)
当包被 import 时,会自动执行 __init__.py 中的代码。
例如:
init.py:
print("包被初始化了")
执行:
import my_package
输出:
包被初始化了
控制包被 import * 时能导出的内容(使用 all)
与模块的 __all__ 用法相同。
例:
init.py:
__all__ = ["math_tool"]
意味着:
from my_package import *
只会导入:
my_package.math_tool
不会导入 string_tool 等其他模块。
包的嵌套
包内可以继续包含子包,例如:
project/
│
├── data/
│ ├── __init__.py
│ ├── reader.py
│ └── writer.py
│
└── utils/
├── __init__.py
└── time_tool.py
使用:
from project.data.reader import read_csv
from project.utils.time_tool import now
包的小结
- 包是“模块的集合”
- 目录中必须有
__init__.py才能成为包 - 包可以嵌套子包
- 从包中导入功能需使用完整路径(包名 → 模块名 → 功能名)
__init__.py用于初始化与导出控制
Python 模块搜索路径
当执行:
import xxx
Python 并不会盲目载入模块,而是按照一套固定的“搜索路径”规则去查找对应的模块或包。
理解模块搜索路径非常重要,它能帮助你解决:
- 为什么某个模块明明存在却提示找不到?
- 为什么导入的不是我写的模块,而是系统的?
- 为什么修改模块后 Python 不生效?
PDF 第 10~12 页完整解释了 Python 的 import 搜索机制。
Python 导入模块时的搜索顺序
当 import 一个模块时,Python 会按以下顺序查找:
1. 当前程序所在目录(当前工作路径)
首先查找运行脚本所在的目录。
这就是为什么自定义模块与主程序放在同级目录下可以直接导入。
2. 系统环境变量 PATH 指定的路径
若当前目录没有,再到系统环境变量指定的路径中查找。
常见路径如:
C:\Python39\
C:\Python39\DLLs\
3. Python 的第三方库安装目录(site-packages)
这里存放 pip 安装的第三方模块。
通常位置:
.../PythonXX/Lib/site-packages/
所有通过 pip install 的模块都在这里。
4. 内置模块目录
如:
.../PythonXX/Lib/
此处包含大量 Python 自带模块(os、sys、math 等)。
5. 如果全部找不到 → 报错
ModuleNotFoundError: No module named 'xxx'
sys.path 查看模块搜索路径
PDF 第 12 页示例(完整文字化):
你可以使用 sys.path 查看 Python 的搜索路径列表。
示例:
import sys
print(sys.path)
输出类似:
[
'C:\\code\\pythonDemo',
'C:\\Python39\\python39.zip',
'C:\\Python39\\DLLs',
'C:\\Python39\\lib',
'C:\\Python39',
'C:\\Python39\\Lib\\site-packages'
]
说明:
- sys.path 是一个列表
- 其中的每个路径都是 import 会去查找模块的位置
- 你也可以手动向 sys.path 追加目录,实现自定义模块路径管理
例如:
import sys
sys.path.append("C:/my_modules")
这会让 Python 能导入你放在 C:/my_modules 目录下的模块。
为什么 Python 会导入错模块?
如果你的文件名与内置模块同名,例如:
time.py
那么执行:
import time
Python 会优先加载当前目录中的文件,而不是系统内置模块,导致各种异常:
AttributeError: module 'time' has no attribute 'sleep'
原因就是模块搜索顺序决定的:
当前目录优先级最高。
模块搜索路径小结
- import 时 Python 会从 sys.path 中的路径依次查找模块
- 当前目录优先级最高
- pip 安装的模块位于 site-packages
- 文件名不要与系统模块冲突
- sys.path 可手动扩展模块搜索路径
模块(Module)
模块是一个 .py 文件,用于封装功能。
作用:
- 功能拆分
- 代码复用
- 提高可维护性
引入方式:
import 模块
from 模块 import 功能
from 模块 import *
import 模块 as 别名
from 模块 import 功能 as 别名
模块文件中可以包含:
- 变量
- 函数
- 类
- 可执行代码
自定义模块注意:
- 模块名不能与内置模块冲突(如 time.py)
- 使用
__main__区分直接运行与被导入 - 使用
__all__控制import *可导出的内容
内置模块 & 第三方模块
内置模块(无需安装)
如:time、random、math、os、sys…
示例:
import random
num = random.randint(0, 10)
第三方模块(需 pip 安装)
pip install 模块名
pip install 模块名==版本号
pip install 模块名 --upgrade
使用方式与内置模块一致:
import requests
requests.get(...)
包(Package)
包是模块的集合。
目录结构:
my_package/
│── __init__.py
│── module1.py
│── module2.py
init.py 的作用:
- 标识该目录是一个包
- 初始化包
- 控制包导出的内容(使用 all)
包的导入方式:
import 包名.模块名
from 包名.模块名 import 功能
包可以互相嵌套,支持多级导入。
Python 模块搜索路径(import 原理)
Python 导入模块时,会按顺序搜索:
- 当前程序运行目录
- 系统环境变量 PATH
- 第三方库目录 site-packages
- Python 内置模块路径
- 若仍未找到 → 报错
查看模块搜索路径:
import sys
print(sys.path)
可修改:
sys.path.append("自定义路径")
注意:当前目录优先级最高 → 文件名不能与内置模块重名。
整体总结(思维导图文字化)
模块:
- 提供功能
- 多种导入方式
- 注意命名
- 支持功能导出控制(all)
- 入口判断(main)
包:
- 模块集合
- 必须有 init.py
- 支持嵌套
- 按层级导入模块和功能
第三方模块:
- pip 安装
- 存放在 site-packages
模块搜索路径:
- import 搜索 sys.path
- 可自定义扩展路径
- 避免命名冲突
一句话总结:
模块让功能复用更方便;
包让项目结构更清晰;
import 机制让 Python 能在合适的位置找到你的模块。