Python 官方教程总结
以 Python 3.12 为基础。
官方文档: https://docs.python.org/zh-cn/3.12/tutorial/index.html
以下是对官方文档的总结。
Python 3.12 解释器的启动、使用和环境配置方法:
- Unix/Linux系统:通常安装在
/usr/local/bin/python3.12,可通过python3.12命令启动 - Windows系统:可通过 Microsoft Store 安装的
python3.12命令或py命令启动 - 退出方式:使用 Ctrl+D(Unix)或 Ctrl+Z(Windows),或输入
quit()
- 交互模式:在终端中直接输入 Python 代码,主提示符为
>>>,连续行提示符为... - 脚本模式:执行文件中的 Python 代码
- 命令行执行:使用
python -c command执行单行命令 - 模块执行:使用
python -m module执行模块
- 参数存储在
sys.argv列表中 - 该列表最少有一个元素
- 无参数:
sys.argv[0]是空字符串 - 有参数:
sys.argv[0]脚本名,后续元素是传入的参数 - 不同启动方式对
sys.argv[0]的处理不同
- 默认使用 UTF-8 编码,支持多种语言字符
- 可通过特殊注释声明其他编码格式
- 编码声明需放在文件第一行(shebang行除外)
- 支持行编辑功能(基于 GNU Readline 库)
- 可通过环境变量配置 Python 运行环境
介绍 Python 作为计算器的基本用法和核心概念:
- 注释:以
#开头,用于解释代码但不被执行 - 交互式使用:区分输入(
>>>提示符)和输出(无提示符)
- 基本运算:支持
+、-、*、/等算术运算符 - 数据类型:整数(int)和浮点数(float)
- 除法运算 (
/) 总是返回浮点数 - Python 全面支持浮点数;混合类型运算数的运算会把整数转换为浮点数
- 除法运算 (
- 特殊运算:
//整除、%取余、**幂运算 - 变量赋值:使用
=操作符 - 交互式变量:
_变量保存上次计算结果 - 分组:圆括号
()
- 定义方式:单引号或双引号包围
- 转义字符:使用
\处理特殊字符 - 原始字符串:
r前缀避免转义 - 多行字符串:三重引号支持
- 字符串操作:支持
+连接、*重复 - 索引和切片:
[0]访问单字符,[0:2]获取子串 - 不可变性:字符串内容不可修改
- 定义:方括号
[]包围,逗号分隔 - 可变性:与字符串不同,列表内容可修改
- 操作方法:支持索引、切片、追加(append)
- 嵌套:可创建包含其他列表的列表
- 赋值注意:简单赋值不复制数据,而是引用
- 循环结构:
while循环配合缩进组织代码 - 多重赋值:
a, b = 0, 1同时赋值多个变量 - 输出函数:
print()函数格式化输出 - 缩进规则:Python 使用缩进表示代码块
介绍 Python 的控制流语句和函数定义的高级特性
- if语句:支持 elif 和 else,可替代其他语言的 switch 语句
- for语句:在序列元素上迭代,而非算术递增
- range()函数:生成等差数列,支持起始值、步长参数
- break和continue:分别用于跳出循环和跳到下次迭代
- 循环的else子句:当循环正常结束(无break)时执行
- pass语句:空操作,用作占位符
- Python 3.10+ 的新特性
- 类似模式匹配,比传统 switch 语句更强大
- 支持字面值匹配、解包赋值、类模式匹配等
- 可使用通配符和约束条件
- 基本语法:使用 def 关键字定义
- 文档字符串:函数首行的字符串作为文档
- 返回值:使用 return 语句,无返回值时默认返回 None
- 局部/全局作用域:函数内部变量不影响外部
- 默认值参数:参数可设置默认值
- 关键字参数:按参数名传递
- 特殊参数类型:
- 仅限位置参数(/前)
- 位置或关键字参数(/和*之间)
- 仅限关键字参数(*后)
- 可变参数:
*args接收任意数量位置参数,**kwargs接收关键字参数
- 参数解包:使用
*和**操作符解包列表/字典参数 - Lambda表达式:创建匿名函数
- 函数注解:为参数和返回值添加类型信息
- 文档字符串格式:遵循 PEP 257 约定
- 遵循 PEP 8 风格指南
- 使用 4 个空格缩进
- 每行不超过 79 个字符
- 合理使用空行分隔
- 保持命名一致性
介绍 Python 的核心数据结构及其操作方法
- 列表方法:包含 append、extend、insert、remove、pop、clear、index、count、sort、reverse、copy 等
- 栈操作:使用
append()和pop()实现后进先出 - 队列操作:推荐使用
collections.deque实现先进先出- 导入:
from collections import deque - 创建队列:
queue = deque(["Eric", "John", "Michael"]) - 进队列:
queue.append("Terry") - 出队列:
queue.popleft(),Eric先出,列表剩余["John", "Michael", "Terry"]
- 导入:
- 列表推导式:简洁的列表创建方式,如
[x**2 for x in range(10)] - 嵌套列表推导式:支持复杂的多层嵌套操作
- 按索引删除列表元素
- 支持删除切片或整个变量
- 元组:不可变序列,用逗号分隔值创建
- 元组打包和解包:支持值的批量赋值
- 与列表的区别:不可变、异质元素、通过索引或解包访问
- 创建:用 花括号 或
set()函数- 注意:创建 空集合 只能用
set(),不能用{},{}创建的是空字典
- 注意:创建 空集合 只能用
- 特点:不重复元素的无序容器
- 基本操作:成员检测、去重
- 集合运算:支持合集(
|)、交集(&)、差集(-)、对称差分(^) - 集合推导式:类似列表推导式
- 键值对存储:以键索引的映射类型
- 操作方法:添加、删除、查找键值对
- 创建方式:花括号、
dict()构造函数、字典推导式 - 键的限制:必须是不可变类型
- 字典循环:使用
items()同时获取键值 - enumerate():同时获取索引和值
- zip():同时遍历多个序列
- reversed():逆向循环
- sorted():排序后循环
- 比较运算符:in、not in、is、is not
- 链式比较:如
a < b == c - 短路运算:
and、or运算符的短路特性 - 海象运算符:
:=用于表达式内赋值
- 字典式顺序:逐元素比较
- 类型比较:相同类型序列可比较,不同类型需适当方法
介绍 Python 的模块系统和包管理机制
- 模块定义:包含 Python 定义和语句的文件,以 .py 为后缀
- 导入方式:
import module:导入整个模块from module import function:导入特定函数from module import *:导入所有公共名称- 使用
as关键字进行别名导入
- 模块命名空间:每个模块有独立的私有命名空间
- 脚本模式:模块可作为脚本执行,
__name__设为"__main__" - 条件执行:使用
if __name__ == "__main__":实现模块的双重用途
- 搜索顺序:内置模块 -> sys.path 中的目录
- 路径组成:脚本目录、PYTHONPATH、标准库路径
- 路径修改:可动态修改 sys.path
- 缓存机制:Python 将编译版本缓存在
__pycache__目录 - 文件命名:
module.version.pyc格式 - 优化选项:使用 -O 或 -OO 开关减少文件大小
- 内置模块:如 sys,提供解释器接口
- 库模块:Python 自带的标准库
- 平台依赖:某些模块仅在特定平台上可用
- 功能:列出模块中定义的名称
- 使用方式:
dir(module)或无参数列出当前命名空间 - 内置名称:标准模块 builtins 包含所有内置函数和变量
- 包结构:使用点号模块名构建命名空间层次
__init__.py:使目录成为包的必需文件- 子包导入:支持多级包结构的导入
- 绝对导入:使用完整包路径
- 相对导入:使用点号表示相对位置( . 当前包,.. 上级包)
- 包导入:支持
__all__列表控制*导入的内容
- 避免使用
from package import *(除非明确定义__all__) - 推荐使用绝对导入
- 合理组织包结构以避免命名冲突
介绍 Python 中的输入输出操作,包括格式化输出和文件处理
- f-字符串:使用f前缀的格式化字符串,如
f'Results of the {year} {event}' - str.format()方法:使用
{}标记替换位置,支持位置和关键字参数 - 手动格式化:使用字符串方法如
rjust()、ljust()、center()进行对齐 - 旧式格式化:使用
%运算符进行字符串插值 - repr()和str()函数:用于将值转换为字符串表示
- 在字符串前加 f 或 F 前缀
- 支持格式说明符,如
{:.3f}控制小数位数 - 支持字段宽度设置,如
{:10}用于列对齐 - 支持转换修饰符:
!a(ascii)、!s(str)、!r(repr) =说明符用于自说明型表达式
- 位置参数:
{0}、{1}等 - 关键字参数:
{name}形式 - 支持字典参数:使用
**操作符 - 可组合使用位置和关键字参数
- open()函数:基本语法
open(filename, mode, encoding) - 模式参数:
'r'读取、'w'写入、'a'追加、'r+'读写 - 编码参数:推荐使用
encoding="utf-8" - 文本/二进制模式:文本模式自动处理换行符转换
- 推荐使用 with 关键字管理文件
- 自动处理文件关闭,即使发生异常
- 简化代码结构
- read():读取文件内容
- readline():读取单行
- write():写入内容
- tell():获取当前位置
- seek():改变文件位置
- 支持迭代遍历文件行
- json模块:用于序列化复杂数据结构
- dumps()/dump():序列化对象为 JSON 字符串/文件
- loads()/load():从 JSON 字符串/文件反序列化
- 支持列表、字典等复杂数据类型
- 与 pickle 模块对比:JSON 更安全但功能有限
介绍 Python 的错误处理机制,包括语法错误和异常处理:
- 语法错误:解析错误,最常见的错误类型
- 异常:语法正确但执行时出错,如 ZeroDivisionError、NameError、TypeError 等
- try-except语句:基本异常处理结构
- 多except子句:可为不同异常指定不同处理程序
- 异常匹配:支持基类和派生类的异常匹配
- 异常参数:异常可携带相关参数信息
- else子句:在没有异常时执行的代码块
- raise语句:强制触发指定异常
- 异常链:使用 from 子句显示异常的因果关系
- 禁用异常链:使用 from None 禁用自动异常链
- 从 Exception 类派生自定义异常类
- 通常以 “Error” 结尾命名
- 保持简单,主要用于错误信息提取
- finally子句:无论是否异常都执行的清理代码
- with语句:预定义清理操作,自动处理资源释放
- finally 子句中的 return 语句会覆盖 try 中的返回值
- ExceptionGroup:打包多个异常实例
- except*语句:选择性处理异常组中的特定类型异常
- 嵌套异常组:支持复杂的异常层次结构
- add_note()方法:为异常添加额外信息
- 注释按添加顺序显示在标准回溯中
- 尽可能具体地指定要处理的异常类型
- 使用 Exception 作为通配符时要谨慎
- 打印或记录异常后重新引发,允许调用者处理
- 使用 with 语句管理资源自动清理
介绍 Python 的类机制和面向对象编程特性:
- 类定义:使用 class 关键字创建新对象类型
- 实例化:类对象支持实例化操作,创建该类型的新实例
- 初始化方法:
__init__()方法用于实例的初始化和定制 - 属性访问:支持数据属性和方法属性
- 命名空间:从名称到对象的映射(如全局、局部命名空间)
- 作用域规则:LEGB规则(局部->嵌套->全局->内置)
- global和nonlocal:用于修改外层作用域变量
- 类命名空间:类定义创建新的命名空间
- 数据属性:实例的变量,无需声明,首次赋值时创建
- 方法对象:绑定到实例的函数
- self参数:方法的第一个参数代表实例本身
- 实例vs类变量:实例变量为每个实例独有,类变量被所有实例共享
- 单继承:
class Derived(Base):语法 - 多重继承:
class Derived(Base1, Base2, Base3):语法 - 方法重写:派生类可重写基类方法
- 方法解析顺序:MRO(Method Resolution Order)处理多重继承
- isinstance()和issubclass():类型检查函数
- 命名约定:单下划线
_name表示非公有API - 名称改写:双下划线
__name触发名称改写机制 - 实际私有性:Python中没有真正的私有变量,主要靠约定
- 数据类:使用
@dataclass装饰器简化数据结构定义 - 迭代器协议:实现
__iter__()和__next__()方法 - 生成器:使用 yield 语句的简单迭代器创建方式
- 生成器表达式:类似列表推导式的简洁语法
- 方法调用:支持通过实例调用其他方法
- 全局作用域:方法可访问包含模块的全局变量
- 动态特性:运行时创建和修改类
- 别名机制:多个名称可绑定到同一对象
- 使用实例变量而非类变量处理可变对象
- 遵循命名约定避免意外冲突
- 合理使用继承和组合
- 注意方法解析顺序的复杂性
介绍 Python 标准库中常用的重要模块和功能
- os模块:提供与操作系统交互的函数(获取/更改工作目录、执行系统命令)
- shutil模块:提供高级文件和目录管理功能(复制、移动文件)
- glob模块:使用通配符搜索文件
- sys.argv:访问命令行参数
- argparse模块:处理复杂的命令行参数
- sys.stdin/stdout/stderr:标准输入输出流,stderr 用于错误输出
- sys.exit():终止程序
- re模块:正则表达式处理高级字符串操作
- 字符串方法:简单操作的首选
- math模块:访问数学函数(三角函数、对数等)
- random模块:随机数生成和随机选择
- statistics模块:基本统计计算(均值、中位数、方差)
- SciPy项目:更多数值计算模块
- urllib.request:从URL获取数据
- smtplib:发送邮件
- datetime模块:日期和时间操作,支持时区和日历运算
- zlib、gzip、bz2等:支持多种压缩格式
- timeit模块:测量代码执行时间
- profile/pstats模块:分析代码性能
- doctest模块:从文档字符串中提取和运行测试
- unittest模块:全面的单元测试框架
- xmlrpc模块:远程过程调用
- email包:邮件处理
- json/csv模块:数据格式处理
- xml包:XML处理
- sqlite3模块:数据库操作
- 国际化模块:gettext、locale 等
介绍 Python 标准库中更高级、专业化的模块:
- reprlib模块:提供定制化的
repr()函数,用于缩略显示大型容器对象 - pprint模块:提供复杂的打印控制,美化输出复杂数据结构
- textwrap模块:格式化文本段落,适应指定宽度
- locale模块:处理地域文化相关的数据格式化
- string.Template类:提供简化的字符串替换语法
- 支持
$占位符和安全替换机制 - 可自定义分隔符,适用于用户自定义应用
- struct模块:提供 pack/unpack 函数处理二进制记录格式
- 支持不同字节序和数据类型
- threading模块:支持后台任务执行
- 提供多种同步原语(锁、事件、条件变量等)
- 推荐使用 queue 模块进行线程间通信
- logging模块:功能完整的日志系统
- 支持不同优先级(DEBUG 到 CRITICAL)
- 可输出到文件、网络等多种目标
- weakref模块:跟踪对象而不创建强引用
- 避免循环引用,支持缓存等应用场景
- array模块:高效的一致类型数组
- collections.deque:高效队列操作
- bisect模块:有序列表操作
- heapq模块:堆数据结构实现
- decimal模块:精确的十进制浮点运算
- 适用于财务计算等需要精确精度的场景
- 避免二进制浮点数的精度问题
- 支持精度控制和四舍五入规则
介绍 Python 虚拟环境的概念、创建方法和包管理
- 虚拟环境和 pip 包管理是 Python 开发的重要工具,确保项目依赖的隔离和可重现性。
- 问题背景:不同应用程序可能需要同一库的不同版本,导致版本冲突
- 解决方案:虚拟环境是一个独立的目录,包含特定 Python 版本和包
- 优势:不同应用可使用不同虚拟环境,避免版本冲突
- venv模块:用于创建和管理虚拟环境
- 创建命令:
python -m venv 目录名 - 常用位置:
.venv目录(隐藏目录) - 激活环境:
- Windows:
tutorial-env\Scripts\activate - Unix/MacOS:
source tutorial-env/bin/activate
- Windows:
- 停用环境:
deactivate命令
- pip功能:安装、升级、移除软件包
- 包来源:Python Package Index
- 安装命令:
- 最新版本:
python -m pip install 包名 - 特定版本:
python -m pip install 包名==版本号
- 最新版本:
- 升级包:
python -m pip install --upgrade 包名 - 卸载包:
python -m pip uninstall 包名
- pip show:显示包的详细信息
- pip list:列出所有已安装的包
- pip freeze:生成包列表,用于 requirements.txt 文件
- 从文件安装:
python -m pip install -r requirements.txt
解释计算机中浮点数表示和运算的固有限制
- 二进制表示:计算机使用二进制(基数为2)小数表示浮点数
- 精度限制:大多数十进制小数无法精确表示为二进制小数(如0.1)
- 近似存储:浮点数只能近似存储,不是精确值
- 根本原因:二进制无法精确表示某些十进制分数
- IEEE 754标准:大多数系统使用此标准,提供53位精度
- 存储值:
0.1实际存储为3602879701896397 / 2**55,而非精确的1/10
- 显示问题:Python 显示近似值而非完整精度值
- 计算误差:
0.1 + 0.1 + 0.1 != 0.3 - 舍入无效:
round()无法解决根本的精度问题
- 比较函数:使用
math.isclose()进行近似比较 - 精确算术:
decimal模块:十进制精确运算fractions模块:基于有理数的运算
- 求和精度:使用
sum()和math.fsum()减少累积误差
- as_integer_ratio():返回精确分数表示
- hex():十六进制精确表示
- 科学计算:NumPy 和 SciPy 包提供更专业的数值计算
- 这是硬件层面的固有限制,不是 Python 的 bug
- 对大多数应用足够精确
- 需要精确十进制计算时应使用专门的模块
- 输出格式化只是显示层面的处理,不改变存储精度