Python模块:模块化的概念与import语句详解
Python模块模块化的概念与import语句详解一、开篇为什么需要模块想象一下你把所有的Python代码都写在一个文件里——几百个函数、几十个类、数千行代码。三个月后你想找一个函数得在这个巨大的文件中翻半天。更糟的是你想在另一个项目中复用某个功能——只能复制粘贴然后祈祷没有遗漏依赖。⌨️ 这就是模块化要解决的问题# 一个大文件糟糕的做法# my_big_app.py —— 5000行代码揉在一起defcalculate_tax():...defsend_email():...defquery_database():...defgenerate_report():...# ... 4000多行 ...# ✅ 模块化好的做法# tax_utils.py —— 税务计算相关的函数# email_service.py —— 邮件发送相关的函数# database.py —— 数据库操作相关的函数# report_generator.py —— 报表生成相关的函数# main.py —— 主程序导入各模块 模块就是一个.py文件。它是Python最基本的代码组织单元。模块化让代码更清晰、更可复用、更易维护。从这篇文章开始我们正式进入Python模块系统的学习。二、什么是模块2.1 .py文件即模块# 每个.py文件都是一个模块# 文件名 模块名去掉.py后缀# 例如有一个文件 utils.py# 那么模块名就是 utils# 在Python交互环境中# import utils # 导入utils模块# utils.calculate() # 使用模块中的函数2.2 import语句的基本用法# ⌨️ 最简单的导入importmath# 导入math模块print(math.pi)# 3.141592653589793print(math.sqrt(16))# 4.0# 使用模块中的内容模块名.函数名importrandomprint(random.randint(1,10))# 1到10的随机数print(random.choice([a,b,c]))# 随机选一个# import语句通常放在文件开头PEP 8建议# 但也可以放在任何位置函数内部、条件语句中2.3 import的底层执行过程# ⌨️ 当Python执行 import xxx 时发生了什么# 第1步查找# Python在sys.path中查找名为xxx的模块# 可能找到xxx.py普通模块或 xxx/__init__.py包# 第2步编译# 如果找到.py文件Python将其编译为字节码.pyc# 第3步执行# Python执行模块中的代码从上到下# 所有顶层代码都会被执行# 第4步创建模块对象# Python创建一个模块对象将执行结果变量、函数等作为其属性# 第5步缓存# 模块对象被存入sys.modules字典# 下次import同一个模块时直接返回缓存——不会重新执行importsys# 查看已导入的模块print(mathinsys.modules)# False还没导入importmathprint(mathinsys.modules)# True已缓存print(sys.modules[math])# module math ...# 再次import——直接从缓存返回模块代码不会再次执行importmath# 这次什么都不会发生三、模块的缓存机制3.1 模块只被执行一次# 创建测试模块# 模拟 import_demo.py 的内容import_demo_code print(模块被加载了) # 这行代码会在import时执行 data [] # 模块级变量 def add(item): 向data列表添加元素 data.append(item) print(f添加了: {item}, 当前数据: {data}) # 将代码写入文件仅演示实际由你来测试# with open(import_demo.py, w) as f:# f.write(import_demo_code)# 测试多次import# import import_demo# 模块被加载了 ← 第一次执行了print# import import_demo# ← 第二次什么也不打印模块被缓存了# import_demo.add(A)# 添加了: A, 当前数据: [A]# import import_demo # 第三次# ← 仍然什么也不打印# import_demo.add(B)# 添加了: B, 当前数据: [A, B]# ← 注意data保留了上次的状态因为模块对象是同一个3.2 强制重新加载模块importimportlib# 正常导入——使用缓存importmathprint(id(math))# 假设: 140234567890# 重新导入——还是同一个对象importmathprint(id(math))# 140234567890 —— 相同# 强制重新加载开发调试时有用mathimportlib.reload(math)# 重新执行模块代码# ⚠️ 但之前的引用不会更新# 例如如果你之前 from math import sqrt# reload(math) 不会更新sqrt变量四、模块的命名空间4.1 模块提供独立的命名空间# 不同模块中的同名变量不会冲突# 因为每个模块有自己的命名空间# module_a.py 中有# name 模块A# module_b.py 中有# name 模块B# main.py:# import module_a# import module_b# print(module_a.name) # 模块A# print(module_b.name) # 模块B# # 没有冲突因为通过模块名前缀访问4.2 import as 别名# 给模块起别名——简化代码、避免命名冲突# 长模块名简化importnumpyasnp arrnp.array([1,2,3])importpandasaspd dfpd.DataFrame({a:[1,2,3]})importmatplotlib.pyplotasplt# plt.plot([1, 2, 3], [1, 4, 9])# 避免冲突importjson# 如果你自己也有一个json变量# json {name: test} # 这会覆盖模块名# 用别名可以避免这个问题五、import语句的灵活性5.1 条件导入# import不是编译时语句——它是运行时执行的# 所以可以放在任何位置defprocess_json(data):处理JSON数据——在使用时才导入importjson# 延迟导入returnjson.loads(data)# 条件导入——根据环境选择不同的模块try:importujsonasjson_module# 更快的JSON库print(使用ujson)exceptImportError:importjsonasjson_module# 回退到标准库print(使用标准json)# 版本兼容importsysifsys.version_info(3,9):# Python 3.9的list[int]写法不需要typingpasselse:fromtypingimportList# 旧版本需要5.2 循环导入问题# ⚠️ 循环导入模块A导入模块B模块B又导入模块A# module_a.py:# import module_b# def func_a():# return module_b.func_b()# X 10# module_b.py:# import module_a# def func_b():# return module_a.X # 可能报错module_a还没完全加载# 解决办法# 1. 把import放在函数内部延迟导入# 2. 重构代码提取公共依赖到第三个模块# 3. 把互相依赖的功能合并到一个模块# ✅ 方案1延迟导入# module_b.py 修改为# def func_b():# import module_a # 在使用时才导入# return module_a.X六、总结模块是Python代码组织的基本单位。一个.py文件就是一个模块它是命名空间隔离和代码复用的基础。核心要点模块 .py文件——最基本的代码组织单元import执行模块代码——查找→编译→执行→缓存模块只执行一次——后续import使用sys.modules缓存命名空间隔离——模块名.函数名访问避免冲突import是运行时语句——可以条件导入、延迟导入✅ 模块化让代码结构清晰、便于复用。下一篇我们将学习import的四种导入方式——以及它们之间的本质区别。

相关新闻

为什么选择Arena?探索这款革命性Swift Playground生成工具的核心优势

为什么选择Arena?探索这款革命性Swift Playground生成工具的核心优势

为什么选择Arena?探索这款革命性Swift Playground生成工具的核心优势 【免费下载链接】Arena A command line tool to create Swift Playground projects with SPM package dependencies 项目地址: https://gitcode.com/gh_mirrors/arena/Arena Arena是一款专…

2026/7/26 14:47:47 阅读更多 →
AI大模型版权案破纪录,5个Python代码级合规实操指南

AI大模型版权案破纪录,5个Python代码级合规实操指南

近期美国多起涉及人工智能大模型的版权诉讼案件引发全球关注,从新闻机构诉科技巨头,到视觉艺术家起诉图像算法公司,索赔金额屡创纪录,最高可达数十亿美元。这些案件的核心争议在于大模型在预训练阶段未经授权使用了受版权保护的数…

2026/7/26 14:47:47 阅读更多 →
Unity音频处理实战:Lame-For-Unity插件实现MP3编码与录音管理

Unity音频处理实战:Lame-For-Unity插件实现MP3编码与录音管理

1. 项目概述:为什么Unity开发者需要Lame-For-Unity? 如果你是一个Unity开发者,并且你的项目需要处理音频,尤其是涉及到音频录制、语音聊天、或者需要将音频数据压缩成MP3格式进行网络传输或本地存储,那么你很可能遇到过…

2026/7/26 14:47:47 阅读更多 →

最新新闻

3分钟掌握QuickRecorder:macOS录屏终极指南

3分钟掌握QuickRecorder:macOS录屏终极指南

3分钟掌握QuickRecorder:macOS录屏终极指南 【免费下载链接】QuickRecorder A lightweight screen recorder based on ScreenCapture Kit for macOS / 基于 ScreenCapture Kit 的轻量化多功能 macOS 录屏工具 项目地址: https://gitcode.com/GitHub_Trending/qu/Q…

2026/7/26 15:01:54 阅读更多 →
深入解析TMS320C5x DSP主机端口接口(HPI)原理与应用

深入解析TMS320C5x DSP主机端口接口(HPI)原理与应用

1. 项目概述与核心价值在嵌入式系统,尤其是那些需要强大实时信号处理能力的复杂设备里,我们常常会遇到一个经典架构:一个通用型的主机处理器(比如ARM、PowerPC或者x86)搭配一个或多个专用的数字信号处理器(…

2026/7/26 15:01:54 阅读更多 →
嵌入式网络路由机制深度解析:TI NDK路由对象设计与实战应用

嵌入式网络路由机制深度解析:TI NDK路由对象设计与实战应用

1. 项目概述与核心价值 在嵌入式设备开发中,网络通信功能的实现往往依赖于一个精简而高效的协议栈。与通用操作系统(如Linux)中庞大复杂的网络子系统不同,嵌入式协议栈需要在有限的资源(内存、CPU)下&#…

2026/7/26 15:01:54 阅读更多 →
Cortex-M4中断与异常处理机制解析及CC32xx实战应用

Cortex-M4中断与异常处理机制解析及CC32xx实战应用

1. 项目概述与核心价值 在嵌入式开发,尤其是物联网和实时控制领域,中断与异常处理机制是决定系统能否“活”起来的关键。它就像是系统的“神经系统”,能让一个看似静止的芯片,瞬间对外部敲门(按键)、内部警…

2026/7/26 15:01:54 阅读更多 →
终极PDF差异检测工具:diff-pdf视觉对比完整指南

终极PDF差异检测工具:diff-pdf视觉对比完整指南

终极PDF差异检测工具:diff-pdf视觉对比完整指南 【免费下载链接】diff-pdf A simple tool for visually comparing two PDF files 项目地址: https://gitcode.com/gh_mirrors/di/diff-pdf diff-pdf是一款基于视觉对比的PDF文件差异检测工具,能够精…

2026/7/26 15:01:54 阅读更多 →
Boilerform核心组件详解:从按钮到输入框的完整样式方案

Boilerform核心组件详解:从按钮到输入框的完整样式方案

Boilerform核心组件详解:从按钮到输入框的完整样式方案 【免费下载链接】boilerform Boilerform is a little HTML and CSS boilerplate to take the pain away from working with forms. 项目地址: https://gitcode.com/gh_mirrors/bo/boilerform Boilerfor…

2026/7/26 15:00:52 阅读更多 →

日新闻

深度学习道路桥梁裂缝检测系统 道路桥梁裂缝检测数据集 道路桥梁病害识别检测数据集

深度学习道路桥梁裂缝检测系统 道路桥梁裂缝检测数据集 道路桥梁病害识别检测数据集

深度学习道路桥梁裂缝检测系统 数据集6000张 完整源码已标注数据集训练好的模型环境配置教程程序运行说明文档,可以直接使用!系统支持图片、视频、摄像头等多种方式检测裂缝,功能强大实用。 1数据集6000张 8各类别

2026/7/26 0:00:31 阅读更多 →
深度学习YOLO模型如何训练 PUBG 绝地求生目标检测数据集

深度学习YOLO模型如何训练 PUBG 绝地求生目标检测数据集

pubg数据集 精选原图1.42万数据 1.49万标签 无任何重复、算法增强或冗余图像! pubg绝地求生目标检测数据集 1分类:e_body,14905个标签,txt格式 共计14244张图,99%为640*640尺寸图像 适合yolo目标检测、AI训练关键词&am…

2026/7/26 0:00:31 阅读更多 →
Apex英雄目标检测数据集 深度学习框架YOLO如何训练APEX数据集

Apex英雄目标检测数据集 深度学习框架YOLO如何训练APEX数据集

Apex检测数据集数据集详情检测类别: allies enemy tag图片总量:7247张训练集:5139张验证集:1425张测试集:683张标注状态:全部已标注,即拿即用数据格式:支持YOLO格式及其他格式&#…

2026/7/26 0:00:31 阅读更多 →

周新闻

深度学习道路桥梁裂缝检测系统 道路桥梁裂缝检测数据集 道路桥梁病害识别检测数据集

深度学习道路桥梁裂缝检测系统 道路桥梁裂缝检测数据集 道路桥梁病害识别检测数据集

深度学习道路桥梁裂缝检测系统 数据集6000张 完整源码已标注数据集训练好的模型环境配置教程程序运行说明文档,可以直接使用!系统支持图片、视频、摄像头等多种方式检测裂缝,功能强大实用。 1数据集6000张 8各类别

2026/7/26 0:00:31 阅读更多 →
深度学习YOLO模型如何训练 PUBG 绝地求生目标检测数据集

深度学习YOLO模型如何训练 PUBG 绝地求生目标检测数据集

pubg数据集 精选原图1.42万数据 1.49万标签 无任何重复、算法增强或冗余图像! pubg绝地求生目标检测数据集 1分类:e_body,14905个标签,txt格式 共计14244张图,99%为640*640尺寸图像 适合yolo目标检测、AI训练关键词&am…

2026/7/26 0:00:31 阅读更多 →
Apex英雄目标检测数据集 深度学习框架YOLO如何训练APEX数据集

Apex英雄目标检测数据集 深度学习框架YOLO如何训练APEX数据集

Apex检测数据集数据集详情检测类别: allies enemy tag图片总量:7247张训练集:5139张验证集:1425张测试集:683张标注状态:全部已标注,即拿即用数据格式:支持YOLO格式及其他格式&#…

2026/7/26 0:00:31 阅读更多 →

月新闻