[从0开始精通AI] Python基础06 模块与软件包

发布时间:2026/9/24 3:33:30
[从0开始精通AI] Python基础06 模块与软件包 摘要本文系统讲解Python模块与软件包的核心知识涵盖模块概念、五种导入方式、自定义模块中的__name__与__all__变量作用以及包的结构、__init__.py功能和绝对/相对导入区别。通过实例演示模块复用、代码组织与导入控制帮助开发者高效管理项目结构提升代码可维护性与可读性。目录一、模块概述1.1 什么是模块1.2 模块的分类1.3 模块的作用二、模块导入方式2.1 导入方式一览2.2 各导入方式详解三、自定义模块3.1 什么是自定义模块3.2 __name__ 特殊变量3.3 __all__ 特殊变量四、软件包Package4.1 什么是包4.2 包的导入方式一、模块概述1.1 什么是模块Python 模块Module一个.py文件就是一个模块模块是 Python 程序的基本组织单位。在模块中可以定义变量、函数、类以及可执行的代码。示例circle_fun.py就是一个模块其中定义了计算圆面积和周长的函数。# circle_fun.py 模块文件 # 根据半径计算圆的面积 def circle_area(r): pi 3.14 area pi * r * r return area # 根据半径计算圆的周长 def circle_len(r): pi 3.14 length 2 * pi * r return length# main.py 主程序文件 # 从自定义模块 circle_fun 中导入需要的函数 from circle_fun import circle_area print( 披萨成本计算 ) # 披萨尺寸半径厘米 s_radius 10 # 小号披萨 m_radius 15 # 中号披萨 l_radius 20 # 大号披萨 # 计算面积 small_area circle_area(s_radius) medium_area circle_area(m_radius) large_area circle_area(l_radius) # 成本计算面饼配料0.05元/平方厘米 small_cost small_area * 0.05 medium_cost medium_area * 0.05 large_cost large_area * 0.05 print(f小号披萨成本{small_cost:.2f}元) print(f中号披萨成本{medium_cost:.2f}元) print(f大号披萨成本{large_cost:.2f}元)1.2 模块的分类分类说明示例内置模块Python 自带的模块math数学计算、random随机数、os操作系统、sys系统参数、datetime日期时间、time时间访问、re正则、csvCSV 文件操作自定义模块开发者自己编写的.py文件如circle_fun.py、config.py、session.py1.3 模块的作用提高代码复用性将通用功能封装为模块多处调用降低开发门槛使用现成模块无需重复造轮子避免命名冲突不同模块中的同名变量/函数互不影响小结什么是模块有什么用模块一个 Python 文件.py其中包含变量、函数、类以及可执行的代码作用提高代码复用性降低开发门槛避免命名冲突导入模块的常用语法import 模块名 [as 别名]from 模块名 import 功能名 [as 别名]from 模块名 import *二、模块导入方式使用模块中提供的功能之前必须先导入再使用导入语句一般放在文件开头。2.1 导入方式一览导入形式代码样例调用方式import 模块名import random模块名.功能名→random.randint(1, 100)import 模块名 as 别名import random as rd别名.功能名→rd.randint(1, 100)from 模块名 import 功能名from random import randint功能名→randint(1, 100)from 模块名 import 功能名 as 别名from random import randint as rint别名→rint(1, 100)from 模块名 import *from random import *功能名→randint(1, 100)2.2 各导入方式详解1import 模块名import random # randint(1, 100)生成 1~100 之间的随机整数包含 1 和 100 两端 num random.randint(1, 100) print(num)调用时需使用模块名.功能名的形式。2import 模块名 as 别名import random as rd num rd.randint(1, 100) print(num)适用于模块名较长或避免命名冲突时。注意起了别名后原名不能再使用只能用rd不能用random。3from 模块名 import 功能名from random import randint, choice num randint(1, 100) print(num) item choice([A, B, C]) print(item)直接使用功能名调用无需加模块名前缀。4from 模块名 import 功能名 as 别名from random import randint as rint num rint(1, 100) print(num)5from 模块名 import *from random import * num randint(1, 100) print(num)导入模块中的所有功能受模块内__all__变量的控制见 3.3。课堂练习三种写法各打印 10 个随机数# 方式一import 模块名 import random for i in range(10): print(random.randint(1, 100)) # 包含 1 和 100 两端 # 方式二/三from 导入具体功能 或 功能别名 from random import randint from random import randint as rint for i in range(10): # print(randint(1, 100)) print(rint(1, 100))三、自定义模块3.1 什么是自定义模块开发复杂项目时为了让项目结构更清晰、便于维护管理和代码复用可以把项目拆分为若干个模块。示例将一个大型项目拆分为多个模块文件项目/ ├── config.py # 配置模块 ├── session.py # 会话管理模块 ├── ai_partner.py # 主程序模块 └── utils/ # 工具包 ├── my_fun.py ├── my_var.py └── my_config.pyconfig.py配置模块# 基础配置项常量不会发生变化的数据命名全部大写 PAGE_TITLE AI 树洞 # 页面标题 PAGE_ICON # 页面 icon LAYOUT wide # 页面布局 INITIAL_SIDEBAR_STATE expanded # 侧边栏初始状态 HELP_URL https://www.itheima.com/help # 帮助地址 SESSION_LOCATION sessions/ # 会话数据存储位置session.py会话管理模块import os import streamlit as st # st 是第三方库 streamlit 的引用此处仅作示例 # 加载会话列表 def load_session(): sessions [] if os.path.exists(sessions): for filename in os.listdir(sessions): if filename.endswith(.json): sessions.append(filename[:-5]) # 去掉 .json 后缀作为会话名 return sorted(sessions, reverseTrue) # 保存当前会话 def save_session(session_name): if session_name: session_data { messages: st.session_state.messages, name: st.session_state.session_name, temperature: st.session_state.temperature, model: st.session_state.model, } # ... 保存逻辑ai_partner.py主程序模块# 导入自定义模块 from session import load_session, save_session # 新建会话按钮 if st.button(新建会话, icon, use_container_widthTrue): # 保存当前会话如果有 if st.session_state.current_session: save_session(st.session_state.current_session) # 创建新会话 new_session_name generate_new_session_name() st.session_state.current_session new_session_name st.session_state.messages [] save_session(new_session_name) st.session_state.sessions load_session() st.rerun()注意每一个 Python 文件都可以作为一个模块模块名就是文件名建议用合法的 Python 标识符规范命名不要用中文、空格或与内置模块重名。3.2__name__特殊变量__name__是 Python 中非常重要的内置变量表示当前模块的名称。场景__name__的值模块直接运行时python my_fun.py__main__模块被导入时import my_fun模块的文件名不含.py后缀如my_fun注意拼写判断语句必须写if __name__ __main__:——两侧都是双下划线。写成_main_单下划线条件永远不成立测试代码不会被执行。为什么需要它详细过程if __name__ __main__:里的代码叫测试代码只在直接运行本模块时才需要执行的代码。它的执行逻辑是# my_fun.py PI 3.1415926 def log_separator1(): print(- * 30) def log_separator2(): print( * 30) # 测试代码写在本模块 if 判断之下 if __name__ __main__: log_separator1() # 直接运行 my_fun.py 时会执行被导入时不会执行直接运行python my_fun.py此时 Python 把 my_fun 当作主程序__name__的值为__main__条件成立 → 测试代码执行如打印一条分隔线方便自测函数。被其他文件导入import my_fun此时__name__的值为my_fun条件不成立 → 测试代码跳过但函数定义照常加载供导入方调用。好处一个文件既可以作为程序直接运行跑测试又可以作为模块被导入只提供功能、不执行测试互不干扰。PyCharm 小技巧在函数体if 判断之外输入main后按 Tab可快速补全if __name__ __main__:模板Ctrl Y可快速删除当前行。另外def log_separator4(): print(* * 30)写在同一行虽然语法允许但不符合规范建议换行缩进。典型用法# my_module.py def main(): print(执行主逻辑) if __name__ __main__: main()说明if __name__ __main__:用于判断当前模块是作为主程序直接运行还是被其他模块导入。3.3__all__特殊变量__all__是一个模块级别的特殊变量用于指定from 模块名 import *时会导入哪些功能*通配了哪些功能。示例my.py# 只有用列表中的名字写了 __all__import * 时才会被导入 __all__ [log_separator1, log_separator3, PI] PI 3.1415926 NAME lulu def log_separator1(): print(- * 30) def log_separator2(): print( * 30) def log_separator3(): print(# * 30) def log_separator4(): print(* * 30)test.pyfrom my import * log_separator1() # ✅ 正常调用在 __all__ 中 log_separator3() # ✅ 正常调用在 __all__ 中 print(PI) # ✅ 正常访问在 __all__ 中 log_separator2() # ❌ NameError不在 __all__ 中import * 没有导入它 log_separator4() # ❌ NameError同上 print(NAME) # ❌ NameError同上__all__并不会影响直接导入具体的功能是什么意思__all__只对from 模块名 import *这一种写法生效。如果导入时明确写出功能名就不受__all__限制from my import log_separator2, NAME log_separator2() # ✅ 完全可以调用 print(NAME) # ✅ 完全可以访问__all__是给import *划的白名单——它不删除、不隐藏模块里的任何功能只决定批量全拿时拿哪些。想用白名单之外的功能指名道姓地导入即可。小结__name__与__all__的作用__name__内置变量表示当前模块的名称直接运行时为__main__被导入时为模块文件名不含.py__all__控制from 模块名 import *时导入哪些功能不影响指名导入四、软件包Package4.1 什么是包包本质是一个文件夹其中可以包含若干 Python 模块.py文件并且文件夹下包含一个__init__.py文件。作用模块文件较多时用来管理、归类多个模块。包的本质也是一个模块包的结构示例utils/ ├── __init__.py # 包的初始化文件描述当前包的信息 ├── my_fun.py # 功能模块 ├── my_var.py # 变量模块 └── my_config.py # 配置模块创建包的两种方式手动创建新建一个普通文件夹在文件夹下新建__init__.py文件该文件夹即成为软件包PyCharm 创建右键项目 →New→Python Package输入英文包名如utilsPyCharm 会自动创建文件夹并带上__init__.py推荐__init__.py的作用标识这是一个包而不是普通的文件夹可以编写包的描述信息版本号、作者等通过__all__变量控制from 包名 import *时导入的模块列表__init__.py示例# utils/__init__.py # 包的描述信息 __version__ 1.0.0 __author__ lili # 控制 from utils import * 时导入的模块 __all__ [my_fun, my_var]4.2 包的导入方式导入形式代码样例调用方式import 包名.模块名import utils.my_fun包名.模块名.功能名→utils.my_fun.log_separator1()from 包名 import 模块名from utils import my_fun模块名.功能名→my_fun.log_separator1()from 包名 import *from utils import *模块名.功能名→my_fun.log_separator1()from 包名.模块名 import 功能名from utils.my_fun import log_separator1功能名→log_separator1()from 包名.模块名 import *from utils.my_fun import *功能名→log_separator1()各导入方式详解设utils/my_fun.py中定义了log_separator1~log_separator4等功能1import 包名.模块名import utils.my_fun utils.my_fun.log_separator1()2from 包名 import 模块名from utils import my_fun my_fun.log_separator1()3from 包名 import *from utils import * my_fun.log_separator1() # 能导入哪些模块受 __init__.py 中 __all__ 的控制4from 包名.模块名 import 功能名from utils.my_fun import log_separator1 log_separator1()5from 包名.模块名 import *from utils.my_fun import * log_separator1() # 受 my_fun.py 中 __all__ 的控制补充绝对导入与相对导入上面的写法都是绝对导入从项目根目录的包开始写出完整路径如from utils.my_fun import ...。相对导入则用.当前包和..上一级包描述位置写在包内部的模块中用于包内模块之间互相导入# utils/my_var.py 中需要用到同包的 my_fun from . import my_fun # . 表示当前包utils from .my_fun import log_separator1 # 从当前包的 my_fun 模块导入功能 # 如果是包中包utils/sub/my.py从上一级包导入 from .. import my_var # .. 表示上一级包utils绝对导入像从项目根开始的完整地址相对导入像以我为中心的相对位置。注意包含相对导入的模块不能直接运行python my_var.py会报ImportError: attempted relative import with no known parent package它只能被导入使用。小结什么是包有什么作用包就是一个文件夹里面可以存储很多 Python 模块.py文件通过包可以对模块进行归类管理__init__.py文件的作用标识这是一个包而不是普通的文件夹可以编写包的描述信息版本、作者等通过__all__控制from 包名 import *时导入的模块列表导入包的方式import 包名.模块名from 包名 import 模块名from 包名 import *from 包名.模块名 import 功能名from 包名.模块名 import *补充导入路径分绝对导入完整路径与相对导入.当前包、..上一级包相对导入只能用于包内部模块之间。

关于本文作者

来自尧图内容编辑团队

尧图内容编辑团队 内容团队

尧图内容编辑团队

本文由尧图网络内容编辑团队执笔。团队由资深项目经理、前端工程师与设计师组成,所有内容均来自亲手交付的真实项目,先讲清问题、再给出可落地的解法。尧图深耕北京网站建设十年,服务过京华建材集团、智造科技等各行业客户,把一线经验沉淀为可复用的行业观察。

  • 十年建站经验,覆盖建材、制造、服务、文创等
  • 项目经理把关选题与事实准确性
  • 工程师与设计师联合撰写专业细节
  • 统一编辑规范,保证文风与排版一致
  • 每月复盘转化数据,迭代选题方向

延伸阅读

相关资讯与近期热门内容

深度阅读推荐

建站决策前值得细读的三篇

网站改版的5个关键决策
2024-08-12

网站改版的5个关键决策

什么时候该改版、改到什么程度、如何避免流量掉光,京华建材集团改版复盘给出答案。

获取专属建站方案

看完文章,把您的行业与预算告诉我们,免费获取一份量身定制的官网建设方案与报价。

立即免费咨询