Python 零基础入门系列(十一):模块和包

发布时间:2026/5/27 1:25:43

Python 零基础入门系列(十一):模块和包 Python 零基础入门系列十一模块和包构建可复用的代码库告别“脚本小子”时代 系列说明在前九篇中我们掌握了基础语法第十篇深入了闭包和装饰器。随着代码量的增加将所有代码写在一个文件里会变得难以维护。本文将教你如何使用模块(Module)和包(Package)来组织代码让项目结构清晰、易于复用。 更新时间2026 年 3 月 28 日 本篇你将学到模块导入机制、__name__变量、包的创建与__init__.py、常用标准库模块⏱️ 预计阅读时间50-60 分钟 | 实践时间40-50 分钟 前置知识已完成前九篇特别是函数基础✍️ 作者书到用时方恨少! 前言为什么要模块化想象一下如果你要开发一个大型游戏所有的代码角色、地图、战斗、网络、UI都写在一个文件里这个文件可能会有几万行代码。这不仅难读而且修改一处代码可能会导致整个程序崩溃。模块化就是将一个大程序分解为多个独立的、功能单一的文件模块然后通过导入机制将它们组合起来。这就像组装电脑主板、CPU、内存条各司其职坏了哪个换哪个不需要重造整台电脑。1. 模块基础1.1 什么是模块在 Python 中一个.py文件就是一个模块。模块可以包含函数、类、变量和可执行代码。示例创建一个简单的模块# 文件名: my_module.pydefgreet(name):returnfHello,{name}!PI3.14159classCalculator:staticmethoddefadd(a,b):returnab1.2import语句详解使用import可以导入整个模块。导入后通过模块名.属性名的方式访问。# main.pyimportmy_moduleprint(my_module.greet(Alice))# Hello, Alice!print(my_module.PI)# 3.14159calcmy_module.Calculator()print(calc.add(5,3))# 81.3from ... import用法如果你只想使用模块中的某个特定函数或变量可以使用from ... import这样可以直接使用名称无需加模块前缀。# main.pyfrommy_moduleimportgreet,PIfrommy_moduleimportCalculatorprint(greet(Bob))# Hello, Bob! (无需 my_module.greet)print(PI)# 3.14159别名Alias如果模块名太长可以使用as设置别名。importmy_moduleasmmprint(mm.greet(Charlie))# 常见的第三方库别名importnumpyasnpimportpandasaspd1.4 模块搜索路径当你导入一个模块时Python 解释器会按照以下顺序查找模块当前目录首先在运行脚本的同一目录下查找。环境变量PYTHONPATH如果设置了该环境变量Python 会去这些目录查找。标准库目录Python 安装路径下的lib目录。第三方库目录site-packages通过 pip 安装的库通常在这里。你可以通过sys.path查看具体的搜索路径列表importsysforpathinsys.path:print(path)2. 模块进阶2.1__name__和__main__这是 Python 中一个非常重要的惯用法Idiom。__name__每个模块都有一个内置变量__name__。如果模块是被导入的__name__的值是模块的文件名不带.py。如果模块是被直接执行的__name__的值是字符串__main__。用途利用这个特性我们可以让一个模块既可以作为脚本独立运行也可以作为模块被导入。# script.pydefmain():print(这是主程序逻辑)defhelper():print(这是一个辅助函数)# 只有当直接运行此文件时才执行 main()if__name____main__:main()print(f__name__ 的值是:{__name__})else:print(f模块被导入__name__ 的值是:{__name__})运行效果python script.py输出 “这是主程序逻辑”。在另一个文件中import script不会输出 “这是主程序逻辑”只加载函数定义。2.2 模块的缓存与重新加载Python 为了提高效率导入过的模块会被缓存在sys.modules字典中。这意味着同一个模块在一个程序运行期间只会被导入和执行一次。如果你在交互式环境中修改了模块代码想重新加载可以使用importlib模块importimportlibimportmy_module importlib.reload(my_module)# 强制重新加载3. 包的概念当项目变得更大时仅仅使用模块还不够我们需要层级结构。包Package就是包含其他模块或子包的模块它本质上是一个目录。3.1 什么是包要成为一个包目录必须满足以下条件目录中必须包含一个名为__init__.py的文件在 Python 3.3 中这个文件可以省略称为“命名空间包”但显式定义它仍是最佳实践。目录中包含.py文件子模块。示例目录结构my_project/ ├── main.py └── utils/ # 这是一个包 ├── __init__.py ├── math_tools.py # 子模块 └── string_tools.py # 子模块3.2__init__.py的作用这个文件在导入包时会被自动执行它有三个主要作用标识包告诉 Python 这是一个包而不是普通文件夹。初始化代码可以在这里写包加载时的初始化逻辑。定义__all__控制from package import *时导入哪些模块。示例__init__.py# utils/__init__.pyprint(Utils 包被加载了)# 定义 __all__ 控制 * 导入__all__[math_tools,string_tools]3.3 包的导入方式相对导入 vs 绝对导入绝对导入推荐从项目根目录或 Python 路径开始导入。# 在 main.py 中fromutils.math_toolsimportaddfromutilsimportstring_tools相对导入在包内部使用.代表当前目录..代表上一级目录。# 在 utils/math_tools.py 中想导入同级的 string_toolsfrom.string_toolsimportprocess_string# 在 utils/subpackage/module.py 中想导入上级的 math_toolsfrom..math_toolsimportadd4. 常用标准库模块Python 有非常强大的“自带电池”Batteries Included以下是几个最常用的内置模块4.1os模块 - 操作系统接口用于处理文件和目录路径、环境变量等。importos# 获取当前工作目录print(os.getcwd())# 列出目录下的文件print(os.listdir(.))# 创建目录os.makedirs(new_folder,exist_okTrue)# 路径拼接跨平台兼容pathos.path.join(folder,subfolder,file.txt)print(path)4.2sys模块 - 系统相关提供访问解释器变量和函数的接口。importsys# 打印命令行参数print(命令行参数,sys.argv)# 退出程序# sys.exit(程序出错即将退出)# 查看 Python 版本print(sys.version)4.3json模块 - 数据序列化用于将 Python 对象字典、列表与 JSON 字符串互相转换常用于 Web 开发和配置文件。importjson# Python 对象转 JSON 字符串data{name:Tom,age:18}json_strjson.dumps(data)print(json_str)# {name: Tom, age: 18}# JSON 字符串转 Python 对象loaded_datajson.loads(json_str)print(loaded_data[name])# Tom# 读写文件withopen(data.json,w)asf:json.dump(data,f)# 直接写入文件4.4datetime模块 - 日期时间处理日期和时间。fromdatetimeimportdatetime,timedelta# 获取当前时间nowdatetime.now()print(now)# 格式化输出print(now.strftime(%Y-%m-%d %H:%M:%S))# 时间计算tomorrownowtimedelta(days1)print(明天,tomorrow)5. 综合实战5.1 创建自己的工具包让我们按照之前的目录结构创建一个简单的工具包。目录结构calculator_project/ ├── main.py └── calculator/ ├── __init__.py ├── basic.py └── advanced.py代码实现calculator/basic.pydefadd(a,b):returnabdefsubtract(a,b):returna-bcalculator/advanced.pyimportmathdefsqrt(x):returnmath.sqrt(x)defpower(base,exp):returnbase**expcalculator/__init__.py# 将子模块的内容导入到包的命名空间方便用户直接从包导入from.basicimportadd,subtractfrom.advancedimportsqrt,power# 定义 __all__ 方便 IDE 提示和 * 导入__all__[add,subtract,sqrt,power]main.py# 因为 __init__.py 的设计我们可以这样直接导入fromcalculatorimportadd,sqrtprint(add(10,5))# 15print(sqrt(16))# 4.05.2 发布和使用第三方包pip 基础虽然本篇主要讲内置模块但了解如何使用外部包是必要的。Python 有一个庞大的第三方库生态系统通过pip包管理器安装。常用命令# 安装包pipinstallrequests# 在代码中使用importrequests responserequests.get(https://httpbin.org/get)print(response.status_code)# 导出当前环境依赖pip freezerequirements.txt# 根据文件安装依赖pipinstall-rrequirements.txt 结语通过本篇的学习你已经掌握了 Python 项目组织的核心——模块和包。你学会了如何将代码拆分为.py文件模块。你理解了if __name__ __main__:的作用这是编写可复用脚本的关键。你掌握了如何构建目录结构包来管理大型项目。你熟悉了os,sys,json,datetime等常用“自带电池”。下一步建议尝试把你之前写的代码比如计算器、学生管理系统重构为模块化的结构。将功能函数放在一个模块中将主程序逻辑放在另一个模块中。 下一篇预告《Python 零基础入门系列十二文件操作详解》我们将学习如何读写硬盘上的文件这是数据持久化的基础。更新时间2026 年 3 月 29 日✍️作者书到用时方恨少!

相关新闻