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/10/3 4:07:42 阅读更多 →
AI大模型版权案破纪录,5个Python代码级合规实操指南

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

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

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

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

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

2026/10/4 1:12:43 阅读更多 →

最新新闻

Java面向对象编程与泛型实战解析

Java面向对象编程与泛型实战解析

1. 面向对象编程核心概念解析面向对象编程(OOP)是Java语言的基石,理解其核心概念对开发者至关重要。在实际项目开发中,我发现很多初级开发者虽然能背诵OOP的四大特性(封装、继承、多态、抽象),但…

2026/10/13 8:40:58 阅读更多 →
储能调峰配置与经济性分析:Matlab复现实战指南

储能调峰配置与经济性分析:Matlab复现实战指南

最近在做一个“参与调峰的储能系统配置方案及经济性分析”的EI复现项目,目标很明确:把一篇储能调峰领域的经济性优化文献,用Matlab从模型到仿真完整跑通。所谓EI复现,不是拿别人现成代码跑一遍那么简单,而是根据论文里…

2026/10/13 8:40:58 阅读更多 →
GaussDB(for PostgreSQL)入门实战:从建库建表到SQL操作与避坑指南

GaussDB(for PostgreSQL)入门实战:从建库建表到SQL操作与避坑指南

前一阵因为一个模拟项目X需要搭一套数据库环境,明确要求兼容PostgreSQL生态、能免去自建主从和高可用运维负担,我就把目标放在了某云厂商的GaussDB(for PostgreSQL)上。起初我以为这就是个“带分布式外衣的PG”,真正上手才发现,它…

2026/10/13 8:40:58 阅读更多 →
免费IP库实战:从数据清洗到本地查询服务搭建

免费IP库实战:从数据清洗到本地查询服务搭建

给日志分析系统加过IP归属地解析的兄弟,应该都懂这种体验:调在线接口查一次IP,速度快慢先不说,账单涨得比日志涨得还快。尤其流量稍大一些,按次计费的第三方接口根本经不起用。所以我一直觉得,“免费好用的…

2026/10/13 8:40:58 阅读更多 →
乒乓球拾球机器人机械结构设计:滚刷参数、电机选型与装配避坑全解

乒乓球拾球机器人机械结构设计:滚刷参数、电机选型与装配避坑全解

简介:这份PDF资料围绕自动拾取乒乓球机器人的机械结构设计展开,面向机器人工程、机械设计与自动化专业的师生及研究人员,聚焦乒乓球训练场景中捡球、送球环节的自动化需求。内容涵盖总体方案设计、轮式行走系统、微型真空泵捡球机构、平面四连…

2026/10/13 8:40:58 阅读更多 →
Agent技能拆解与编排实战:从碎片化到体系化

Agent技能拆解与编排实战:从碎片化到体系化

1. 技能碎片化:Agent落地的头号瓶颈这段时间在折腾智能体项目,我最大的体会就是:真正卡住进度的往往不是模型选型,不是推理框架,而是“技能”这层皮。模型再聪明,碰到实际任务时还是靠一个个具体技能去接活…

2026/10/13 8:39:55 阅读更多 →

日新闻

物联网系统集成避坑指南:从选型到验收的关键要点

物联网系统集成避坑指南:从选型到验收的关键要点

做了这么多年物联网系统集成的项目,我最大的感受是,大部分坑不是出在技术前沿,而是出在一些看起来很平常的地方。设备选了便宜的、协议没问清楚、现场没摸透、验收标准写得含糊——这些细枝末节,最后都会变成延期、超支和扯皮的大…

2026/10/13 0:00:57 阅读更多 →
ESP32舵机控制全攻略:从PWM原理到高级玩法与常见故障排查

ESP32舵机控制全攻略:从PWM原理到高级玩法与常见故障排查

如果你玩ESP32有一阵子了,很难不碰到舵机控制这道坎。做智能小车要转方向,做机械臂要抬关节,做云台要偏航俯仰,背后都是同一个东西在干活:舵机。而我见过太多人卡在“代码能编译、舵机就是不听话”这个阶段&#xff0c…

2026/10/13 0:00:57 阅读更多 →
CAN总线原理与STM32实战:抗干扰、仲裁、错误处理全解析

CAN总线原理与STM32实战:抗干扰、仲裁、错误处理全解析

1. 为什么CAN总线至今仍是工业现场的“硬通货”?——从汽车底盘到智能温室的真实需求你有没有拆过一辆老款燃油车的中控台?或者调试过某高校实验室里那台跑着Modbus协议却频频丢帧的PLC控制柜?又或者,在某个农业物联网项目里&…

2026/10/13 0:00:57 阅读更多 →

周新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/13 2:54:56 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/12 0:16:38 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/13 1:58:08 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/12 21:05:09 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/12 14:48:49 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/12 18:11:17 阅读更多 →