模块的概念
模块就是一个包含 Python 代码的 .py 文件,用于将代码按功能组织成独立的单元
随着程序规模的增长,把所有代码写在一个文件里会变得难以维护。模块的出现解决了这个问题——将相关功能的代码组织在独立的文件中,通过导入机制在不同文件间共享使用。
模块的三大好处:
代码复用:将常用的函数、类写好放在模块里,多处在项目中复用
命名空间隔离:每个模块有自己独立的命名空间,同名的变量不会互相冲突
易于维护:按功能拆分文件,结构清晰,方便团队协作
一个最简单的模块:
1 2 3 4 5 6 7 8 def greet (name ): """一个简单的问候函数""" print (f"你好,{name} !" ) VERSION = "1.0"
模块的导入
通过 import 语句在一个 Python 文件中引入另一个模块,从而使用其定义的函数、类、变量
import 模块名
1 2 3 4 5 6 7 8 """ import 模块名 通过 模块名.函数名() 或 模块名.变量名 的方式来使用 """ import mymodulemymodule.greet("PyTs1n9" ) print (mymodule.VERSION)
from…import 导入
1 2 3 4 5 6 7 8 9 10 11 """ from 模块名 import 函数名/变量名 直接使用导入的名字,不需要 模块名. 前缀 """ from mymodule import greet, VERSIONgreet("study" ) print (VERSION) from mymodule import *
使用 as 起别名
1 2 3 4 5 6 7 8 9 10 11 """ import 模块名 as 别名 from 模块名 import 函数名 as 别名 给模块或导入的内容起一个简短的别名,方便使用 """ import mymodule as mmmm.greet("别名" ) from mymodule import greet as hellohello("kitty" )
导入与不导入的区别
1 2 3 4 5 6 7 8 9 10 11 12 """ 模块在被 import 时,其顶层代码会被执行一次 但再次 import 同一个模块时不会重复执行 """ import mymodule import mymodule
自定义模块
自己编写 .py 文件作为模块,在另一个 .py 文件中导入并使用
创建并使用自定义模块
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 """ 文件:utils.py """ def add (a, b ): return a + b def subtract (a, b ): return a - b PI = 3.14159 if __name__ == "__main__" : print (add(1 , 2 )) print (subtract(5 , 3 ))
1 2 3 4 5 6 7 8 9 """ 文件:main.py """ import utilsprint (utils.add(10 , 20 )) print (utils.subtract(10 , 5 )) print (utils.PI)
name 变量的作用
1 2 3 4 5 6 7 8 9 10 11 12 13 """ __name__ 是 Python 内置的特殊变量: - 当模块被直接运行时(python xxx.py),__name__ 的值为 "__main__" - 当模块被导入时(import xxx),__name__ 的值为模块名 "xxx" """ if __name__ == "__main__" : print ("这是测试代码,import 时不会显示" )
1 2 3 4 5 6 7 8 """ 文件:demo.py """ print (f"当前 __name__ 值:{__name__} " )
模块的搜索路径
当 import 一个模块时,Python 会按照特定顺序在指定位置搜索该模块
搜索顺序如下:
1. 当前目录(程序运行的目录)
2. PYTHONPATH 环境变量中指定的目录
3. Python 标准库目录
4. 第三方包安装目录(site-packages)
1 2 3 4 5 6 7 8 9 10 import sysfor path in sys.path: print (path)
1 2 3 4 5 import syssys.path.append("D:/my_modules" )
包的概念
包是一个包含多个模块的文件夹,通过 init .py 文件将其识别为 Python 包
当模块越来越多时,需要包(Package)来进一步组织代码。包本质上是一个包含 __init__.py 的文件夹,内部可以有多级子包和模块。
包的目录结构示例:
mypackage/ ← 包(文件夹)
__init__.py ← 包的标识文件(可以为空)
module_a.py ← 包内的模块
module_b.py ← 包内的模块
subpkg/ ← 子包
__init__.py
module_c.py
导入包中的模块
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 """ 三种方式导入包中的模块: """ import mypackage.module_amypackage.module_a.some_func() from mypackage import module_amodule_a.some_func() from mypackage.module_a import some_funcsome_func()
init .py 的作用
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 """ __init__.py 文件有三个作用: 1. 标识该文件夹是 Python 包(必须存在,即使为空) 2. 包被导入时,__init__.py 中的代码会自动执行 3. 可以在 __init__.py 中定义包的公共接口 """ """ 文件:mypackage/__init__.py """ print (f"包 mypackage 被导入了" )__version__ = "1.0.0" __all__ = ["module_a" , "module_b" ]
1 2 3 4 5 from mypackage import *
相对导入与绝对导入
1 2 3 4 5 6 7 8 9 10 11 12 13 14 """ 包内部的模块互相引用时,可以使用: - 绝对导入:从包根目录开始写完整路径(推荐,更清晰) - 相对导入:使用 . 表示当前包,.. 表示上级包 """ from mypackage.subpkg.module_c import helperfrom .subpkg.module_c import helper from . import module_b from .. import something
常用标准库模块
Python 自带丰富的标准库,内置了大量功能强大的模块,被称为"自带电池"
Python 安装后即可使用的内置模块:
os 操作系统相关功能(文件路径、环境变量等)
sys Python 解释器相关功能(命令行参数、搜索路径等)
math 数学计算(三角函数、对数、常数等)
random 生成随机数
datetime 日期和时间处理
time 时间相关的函数
json JSON 数据的编码和解码
re 正则表达式
collections 高级容器(namedtuple、defaultdict等)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 import osimport sysimport mathimport randomimport datetimeimport jsonprint (os.getcwd()) print (os.listdir("." )) print (os.path.join("a" , "b" )) print (sys.version) print (sys.argv) print (math.pi) print (math.sqrt(16 )) print (random.randint(1 , 10 )) print (random.choice(["a" ,"b" ])) now = datetime.datetime.now() print (now.strftime("%Y-%m-%d %H:%M:%S" )) data = {"name" : "PyTs1n9" , "age" : 18 } json_str = json.dumps(data, ensure_ascii=False ) print (json_str) parsed = json.loads(json_str) print (parsed["name" ])
安装第三方包
通过 pip 工具安装社区贡献的第三方包,极大扩展 Python 的功能边界
pip 是 Python 的官方包管理工具(Python 3.4+ 自带),用于安装、升级、卸载第三方包。
pip 常用命令
pip install 包名 安装指定的第三方包
pip install 包名==版本号 安装指定版本的包
pip uninstall 包名 卸载包
pip list 列出已安装的所有包
pip show 包名 查看某个包的详细信息
pip install --upgrade 包名 升级包到最新版本
使用第三方包
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 """ 安装第三方包后,就可以像导入标准库一样导入使用 以 requests 库为例: """ import requestsresponse = requests.get("https://www.baidu.com" ) print (response.status_code) print (len (response.text))
使用虚拟环境(推荐)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 """ 为什么需要虚拟环境? - 不同项目可能依赖同一个包的不同版本 - 虚拟环境可以隔离每个项目的依赖,互不影响 基本用法(终端中): # python -m venv venv 创建虚拟环境(生成 venv 文件夹) # venv\Scripts\activate 激活虚拟环境(Windows) # source venv/bin/activate 激活虚拟环境(Linux/Mac) # deactivate 退出虚拟环境 """
综合练习
将模块与包的知识融会贯通,通过实际案例巩固使用方法
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 """ 练习一:创建一个简单的计算器包 mycalc 目录结构: mycalc/ __init__.py basic.py 基本运算 advanced.py 高级运算 """ from .basic import add, subtract, multiply, dividefrom .advanced import power, square_rootdef add (a, b ): return a + b def subtract (a, b ): return a - b def multiply (a, b ): return a * b def divide (a, b ): if b == 0 : raise ValueError("除数不能为 0" ) return a / b def power (a, b ): return a ** b def square_root (a ): if a < 0 : raise ValueError("不能对负数开平方" ) return a ** 0.5 """ import mycalc print(mycalc.add(5, 3)) # 输出 8 print(mycalc.power(2, 10)) # 输出 1024 print(mycalc.square_root(25)) # 输出 5.0 """
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 """ 练习二:项目文件结构组织 一个典型的 Python 项目的目录结构: """
模块与包是 Python 项目组织代码的核心方式。掌握 import 的多种导入方式、理解 name 与 init .py 的作用、熟悉标准库与 pip 的使用,你就能从"写脚本"迈向"写项目"。合理划分模块是一项重要的工程能力,良好的代码组织能让项目随着规模增长仍然保持清晰可控。
Python Study Note 系列文章
Python Study Note Python 函数使用(四) Python 判断语句(二) Python 基础语法(一) Python 异常处理(七) Python 循环语句(三) Python 数据容器(五) Python 文件基础操作(六) Python 模块与包(八) Python 类型注解(十) Python 面向对象(九)重点 Python 高阶技巧(十一)