当前位置: 首页 > news >正文

2025-08-21 Python进阶3——模块

文章目录

  • 1 模块基础
    • 1.1 模块的创建与导入
    • 1.2 模块的执行特性
  • 2 模块的高级用法
    • 2.1 以脚本方式执行模块
    • 2.2 模块搜索路径
    • 2.3 已编译的 Python 文件
  • 3 标准模块
  • 4 dir () 函数
  • 5 包(Packages)
    • 5.1 包的结构
    • 5.2 包的导入
    • 5.3 控制包的导入行为
    • 5.4 相对导入
    • 5.5 包的路径扩展
  • 6 总结

1 模块基础

模块是包含 Python 定义和语句的文件,文件名即为模块名加 .py 后缀。使用模块可以:

  • 保存代码以便重复使用
  • 将代码组织成逻辑单元
  • 避免命名冲突

下面是一个使用 python 标准库中模块的例子。

#!/usr/bin/python3
# 文件名: using_sys.pyimport sysprint('命令行参数如下:')
for i in sys.argv:print(i)print('\n\nPython 路径为:', sys.path, '\n')

执行结果如下所示:

$ python using_sys.py 参数1 参数2
命令行参数如下:
using_sys.py
参数1
参数2Python 路径为: ['/root', '/usr/lib/python3.4', '/usr/lib/python3.4/plat-x86_64-linux-gnu', '/usr/lib/python3.4/lib-dynload', '/usr/local/lib/python3.4/dist-packages', '/usr/lib/python3/dist-packages'] 
  • import sys 引入 python 标准库中的 sys.py 模块;这是引入某一模块的方法。
  • sys.argv 是一个包含命令行参数的列表。
  • sys.path 包含了一个 Python 解释器自动查找所需模块的路径的列表。

1.1 模块的创建与导入

创建模块:创建一个 fibo.py 文件

# 斐波那契数列模块def fib(n):"""打印斐波那契数列直到n"""a, b = 0, 1while a < n:print(a, end=' ')a, b = b, a+bprint()def fib2(n):"""返回斐波那契数列直到n的列表"""result = []a, b = 0, 1while a < n:result.append(a)a, b = b, a+breturn result

导入模块

# 导入整个模块
import fibo# 使用模块中的函数
fibo.fib(1000)  # 0 1 1 2 3 5 8 ... 987
print(fibo.fib2(100))  # [0, 1, 1, 2, ..., 89]# 查看模块名称
print(fibo.__name__)  # 'fibo'# 为模块创建别名
import fibo as fib
fib.fib(500)  # 0 1 1 2 3 ... 377# 导入特定函数
from fibo import fib, fib2
fib(500)  # 直接使用函数名# 导入函数并指定别名
from fibo import fib as fibonacci
fibonacci(500)  # 使用别名调用

1.2 模块的执行特性

  • 模块中的代码仅在第一次被导入时执行
  • 每个模块有自己的命名空间,避免全局变量冲突
  • 可以通过 modname.itemname 访问模块中的元素

2 模块的高级用法

2.1 以脚本方式执行模块

在模块末尾添加判断,可以使模块既可以被导入,又可以作为脚本运行:

# 斐波那契数列模块def fib(n):"""打印斐波那契数列直到n"""a, b = 0, 1while a < n:print(a, end=' ')a, b = b, a+bprint()def fib2(n):"""返回斐波那契数列直到n的列表"""result = []a, b = 0, 1while a < n:result.append(a)a, b = b, a+breturn result# 当模块作为脚本运行时执行
if __name__ == "__main__":import sysif len(sys.argv) > 1:fib(int(sys.argv[1]))

运行方式

python fibo.py 50
# 输出: 0 1 1 2 3 5 8 13 21 34

说明:每个模块都有一个 name 属性。

  • 如果模块是被直接运行,__name__ 的值为 __main__
  • 如果模块是被导入的,__name__ 的值为模块名。

说明:namemain 底下是双下划线, _ _ 是这样去掉中间的那个空格。

2.2 模块搜索路径

Python 解释器按以下顺序搜索模块:

  1. 内置模块
  2. sys.path列表中的目录,包括:
    • 当前脚本所在目录
    • PYTHONPATH 环境变量指定的目录
    • 安装时默认的目录

查看和修改搜索路径

import sys# 查看当前搜索路径
print(sys.path)# 添加新的搜索路径
sys.path.append('/path/to/new/directory')

2.3 已编译的 Python 文件

为了加速模块加载,Python 会将模块编译为 .pyc 文件,存储在 __pycache__ 目录中:

  • 编译文件格式:module.version.pyc(如 fibo.cpython-39.pyc
  • 仅加快加载速度,不影响执行速度
  • 会自动检查源文件是否修改,必要时重新编译

编译优化

# 生成优化的编译文件(去除断言)
python -O -m compileall fibo.py# 生成更精简的编译文件(去除断言和文档字符串)
python -OO -m compileall fibo.py

3 标准模块

Python 自带丰富的标准模块库,例如:

  1. sys 模块:提供与 Python 解释器交互的功能
import sys# 命令行参数
print(sys.argv)# 退出程序
sys.exit(0)# 标准输入输出
sys.stdout.write("Hello\n")
  1. os 模块:提供与操作系统交互的功能
import os# 获取当前目录
print(os.getcwd())# 创建目录
os.mkdir("new_dir")# 列出目录内容
print(os.listdir("."))

4 dir () 函数

dir() 函数用于查看模块中定义的名称:

import fibo# 查看模块中定义的名称
print(dir(fibo))  # ['__name__', 'fib', 'fib2']# 无参数时,查看当前作用域中的名称
a = 1
print(dir())  # 包含 'a', 'fibo', 等# 查看内置函数和变量
import builtins
print(dir(builtins))  # 列出所有内置函数和类型

5 包(Packages)

包是模块的集合,用于组织多个相关模块,避免命名冲突。

5.1 包的结构

一个典型的包结构如下:

sound/                  # 顶层包__init__.py         # 包初始化文件formats/            # 子包:文件格式处理__init__.pywavread.pywavwrite.py...effects/            # 子包:音效处理__init__.pyecho.pyreverse.py...filters/            # 子包:过滤器__init__.pyequalizer.py...

__init__.py 文件的作用:

  • 标识该目录为 Python 包
  • 可以包含包的初始化代码
  • 定义 __all__ 变量,控制 from package import * 的行为

5.2 包的导入

# 导入子模块
import sound.effects.echo# 使用子模块中的函数
sound.effects.echo.echofilter(input, output)# 从包中导入子模块
from sound.effects import echo# 使用导入的子模块
echo.echofilter(input, output)# 直接导入函数
from sound.effects.echo import echofilter# 使用导入的函数
echofilter(input, output)

5.3 控制包的导入行为

__init__.py 中定义 __all__ 变量:

# 定义 from sound.effects import * 时要导入的模块
__all__ = ["echo", "surround", "reverse"]

这样,from sound.effects import * 会导入 echosurroundreverse 三个子模块。

5.4 相对导入

在包内部,可以使用相对导入引用其他模块:

# 在 sound/effects/surround.py 中
from . import echo  # 导入同级别模块
from .. import formats  # 导入上级包中的模块
from ..filters import equalizer  # 导入同级其他子包中的模块
  • . 表示当前包
  • .. 表示上级包
  • 主模块不能使用相对导入,必须使用绝对导入

5.5 包的路径扩展

包的 __path__ 属性可以修改,用于扩展包的搜索路径:

# 在 sound/__init__.py 中
import sys
from os.path import join, dirname# 添加额外的搜索路径
__path__.append(join(dirname(__file__), 'extra_modules'))

这使得包可以动态加载位于不同目录中的模块。

6 总结

  • 模块是包含 Python 代码的文件,扩展名为 .py
  • 包是组织多个相关模块的目录结构,包含 __init__.py 文件
  • 使用 importfrom ... import 语句导入模块和包
  • sys.path 控制模块搜索路径
  • dir() 函数用于查看模块中定义的名称
  • 模块可以作为脚本运行,通过 if __name__ == "__main__": 控制执行逻辑
http://www.dtcms.com/a/342163.html

相关文章:

  • 信创自主可控新标杆:RustFS如何用内存安全架构重构数据主权防线?
  • Binlog Server守护MySQL数据0丢失
  • RabbitMQ:技巧汇总
  • Windows下RabbitMQ完整安装指南
  • 云原生俱乐部-k8s知识点归纳(6)
  • 活到老学到老之vue-vben-admin项目添加简单页面
  • 从YOLOv5到RKNN:零冲突转换YOLOv5模型至RK3588 NPU全指南
  • AI创业公司简介:Pogo
  • 三大图计算框架深度对比
  • 机器学习--聚类算法、集成算法
  • 《前端功能开关SDK全景剖析:从远程配置到数据闭环,重构业务迭代底层逻辑》
  • 【Java集合】List,Map,Set-详细讲解
  • Android基建开发大纲
  • Android - 资源类型 MINE Type
  • Android15 AndroidV冻结和解冻的场景
  • Android URC 介绍及源码案例参考
  • vlc-android: 编译自己的libvlc
  • MySQL深分页慢问题及性能优化
  • thingsboard 通过Entities hierarchy部件实现左边菜单点击,右边的表格按左边的分类型进行过滤筛选数据源
  • 什么是Qoder?如何下载?如何体验?Qoder和其他 AI IDE 什么区别?
  • ZStack Zaku替代VMware Tanzu:六项对比、构建虚拟机+容器一体化架构
  • C# 编写一个XmlToDota的转换工具
  • 关于CentOS7无法使用使用
  • 在Java项目中去理解通用工具为什么能通用,以及如何写出类似的工具类
  • 实践题:智能化风控体系升级方案
  • 医疗器械注册证识别技术:实现从图像到结构化数据的智能转化,提升行业效率与准确性
  • 深度解析游戏引擎中的相机:视图矩阵
  • 【数据结构】深入解析选择排序与堆排序:从基础到高效实现的完全指南
  • 如何在Docker配置中启用实验性模式
  • 对实验室管理而言,LIMS系统究竟有无作用