Python最新几个版本的特性
Table of Contents
平时使用 Python 基本上使用的都是 3.9 以下的版本,所以对于新版本的一些特性都不太了解,今天学习一下
Python 的主要版本列表及特性:
Python 1.x 系列
- Python 1.0:1994 年 1 月 26 日发布,包括了基础的数据类型如字符串、列表和字典,以及模块系统。
- Python 1.5:1997 年 12 月 31 日发布,引入了重要的改进,如包支持和增强的标准库。
Python 2.x 系列
- Python 2.0:2000 年 10 月 16 日发布,引入了列表解析、垃圾回收系统和 Unicode 支持。
- Python 2.2:2001 年发布,引入了新式类、迭代器和生成器。
- Python 2.7:2010 年 7 月 3 日发布,作为 2.x 系列的最后一个版本,包含了许多 3.x 的特性,例如字典理解、集合理解和新的字符串格式化方法。Python 2.7 的官方支持已于 2020 年 1 月 1 日结束。
Python 3.x 系列
- Python 3.0:2008 年 12 月 3 日发布,引入了许多重大变化,如 print 语句变为 print()函数、除法运算符/改为浮点除法,//用于整数除法、str 类型用于 Unicode 文本,bytes 类型用于二进制数据、标准库的重命名和重组等。
- Python 3.1:2009 年发布,主要集中在性能改进和 bug 修复上,引入了改进的垃圾回收机制,提高了内存管理的效率;多线程支持得到了改进,提供了更好的线程安全性和性能;还引入了一些新的标准库和模块,包括 unittest 模块的改进和添加了 fractions 模块等。
- Python 3.2:2011 年发布,引入了 concurrent.futures 模块,提供了一个高级的接口来处理并发任务;yield from 语法,简化了使用生成器的代码;functools.lru_cache 装饰器,提供了一个简单而有效的缓存机制。
- Python 3.3:2012 年发布,引入了 yield 表达式,yield 语句可以作为表达式使用,可以将值发送给生成器;venv 模块,用于创建和管理虚拟环境;还引入了一些新的语法特性,如 yield from 语句,以及更好的异常链式处理。
- Python 3.4:2014 年发布,引入了 asyncio 库,提供了一种基于协程的异步编程模型;enum 模块,用于定义枚举类型;pathlib 模块,提供了一种更简洁和面向对象的路径操作 API。
- Python 3.5:2015 年发布,引入了 async/await 语法,使得异步编程更加简洁和易于理解;开始支持类型提示,通过给函数和变量添加类型注解,可以提供更好的代码可读性和静态类型检查;还引入了一些新的标准库模块,如 typing 模块用于类型提示,以及 zipapp 模块用于创建可执行的 ZIP 应用。
- Python 3.6:2016 年发布,引入了格式化字符串字面值(f-strings),新的文件系统路径协议,以及更安全的哈希算法;字典保持插入顺序,使得字典的迭代顺序可预测;支持异常链式处理,可以在异常处理中显式地关联多个异常。
- Python 3.7:2018 年发布,引入了数据类,通过使用简单的语法,可以自动为类生成一些常见的方法,如 init 和 repr;异步生成器语法,用于更方便地处理异步编程中的迭代器;上下文变量绑定语法,使得在 with 语句中可以将上下文管理器的结果绑定到一个变量。
- Python 3.8:2019 年发布,引入了赋值表达式(海象操作符 :=),位置参数,和新的标准库模块 statistics;对 f-strings 进行了改进,支持在格式化字符串中使用等号和括号;对异步迭代器和异步生成器进行了改进,提供了更好的语法和性能。
- Python 3.9:2020 年发布,引入了联合类型提示(X | Y),字符串方法的新功能和删除了一些过时的特性;字典合并运算符(|),用于合并两个字典;对类型提示进行了改进,支持更多的类型注解语法和类型推断;引入了一些新的标准库模块,如 zoneinfo 模块用于处理时区信息,以及 graphlib 模块用于处理图形数据结构。
- Python 3.10:2021 年发布,引入了模式匹配(match-case 语句),改进了类型提示,和许多性能优化;对异常上下文进行了改进,使得异常的上下文信息更加结构化和易于访问;对 zoneinfo 模块进行了改进,提供了更好的时区支持和操作。
- Python 3.11:2022 年发布,进一步优化了性能,简化了错误消息,并引入了更多的标准库更新和新特性。
- Python 3.12:2023 年发布,包括进一步的性能改进、新的标准库模块和特性,以及更多的语法和类型提示更新。
新版特性详情
Python3.9
语法特性
- 字典合并与更新运算符:新增合并(|)与更新(|=)运算符,扩充了现有的 dict.update 和{**d1, **d2}字典合并方法,使字典操作更简洁直观。
- 标准多项集中的类型标注泛型:可以使用内置的多项集类型(如 list 和 dict)作为通用类型,不必再从 typing 导入对应的大写形式类型名,同时标准库中的一些其他类型也变为通用类型。
- 放宽对装饰器的语法限制:使装饰器的语法更加灵活,减少了一些不必要的限制,让代码编写更加自由。
内置特性
- 新增用于移除前缀和后缀的字符串方法:新增 str.removeprefix(prefix)和 str.removesuffix(suffix)方法,方便从字符串中移除不需要的前缀或后缀,同时 bytes、bytearray 和 collections.user 字符串也添加了相应方法。
- import()特性修改:import() 现在会引发 ImportError 而不是 ValueError,使得在相对导入超出其最高层级包时,错误提示更准确。
标准库特性
- 灵活的函数和变量标注:提供了更灵活的函数和变量标注方式,使类型提示更加方便和准确,增强了代码的可读性和可维护性。
- 新增 os.pidfd_open():允许不带竞争和信号的进程管理,提升了进程管理的效率和安全性。
解释器改进
- 从 C 扩展类型的方法快速访问模块状态:优化了从 C 扩展类型的方法访问模块状态的速度,提高了程序的运行效率。
- CPython 现在使用基于 PEG 的新解析器:新解析器的性能与旧解析器大致相当,但在设计新语言特性时更加灵活,为后续版本的功能扩展奠定了基础。
新库模块
- zoneinfo 模块:将 IANA 时区数据库包含于标准库的 zoneinfo 模块中,方便进行时区相关的操作和处理。
- graphlib 模块:提供了图的拓扑排序实现,为处理图数据结构提供了便利。
其他特性
- 对部分模块进行了改进:如 random.Random.randbytes 方法可用于生成随机字节串,concurrent.futures.Executor.shutdown()新增 cancel_futures 形参,可取消尚未开始运行的所有挂起的 Future。
- 内置类型性能优化:一些内置类型如 range、tuple、set、frozenset、list、dict 等使用 PEP 590 向量调用进行了速度优化。
- 垃圾回收机制改进:垃圾回收不再阻塞在复活的对象上,提高了垃圾回收的效率和程序的稳定性。
Python3.10
语法特性
- 带括号的上下文管理器:允许在
with
语句中使用括号来定义多个上下文管理器,方便在同一个with
块中初始化多个对象,使代码更简洁易读。 - 结构模式匹配:通过
match
和case
语句实现,类似于其他语言中的switch
语句,但更强大灵活,可用于对数据结构进行解构和模式匹配,根据不同的模式执行相应的操作。
类型系统特性
- 联合类型表示法简化:可以使用
x | y
的形式表示联合类型,取代之前的typing.Union
,使类型注解更加简洁直观,并且可以作为isinstance()
和issubclass()
的第二个参数用于类型判断。 - 参数规范变量:引入了参数规范变量,允许在函数签名中更灵活地指定参数类型和返回值类型。
- 显式类型别名:可以使用
TypeAlias
来定义显式的类型别名,提高代码的可读性和可维护性。 - 用户定义的类型守卫:允许用户定义自己的类型守卫函数,用于在运行时检查对象的类型。
标准库特性
- zip() 可选长度检查:
zip()
函数新增了一个可选的strict
参数,当设置为True
时,如果传入的可迭代对象长度不一致,将引发ValueError
,避免了潜在的错误。 - statistics 模块新增函数:
statistics
模块新增了一些用于计算多变量统计的函数,如multimode()
用于返回出现次数最多的元素列表等。
解释器改进
- 更精确的行号:调试和其他工具的行号更加精确,有助于更快速准确地定位问题。
- 性能优化:
str()
、bytes()
和bytearray()
构造函数的速度有了显著提升,大约提高 30%-40%左右。
其他特性
- 改进的语法错误提示:语法错误提示更加清晰和易懂,包含更多上下文信息,如错误发生的具体位置和错误类型,还会突出显示构成语法错误的整个表达式的错误范围。
- 要求使用较新的 OpenSSL:需要使用 OpenSSL 1.1.1 或更新版本,以提高安全性。
- 弃用 distutils 模块:建议使用
setuptools
等替代方案,为未来的模块管理和打包机制改进做准备。
Python3.11
语法特性
模式匹配增强:引入了模式匹配,可以简化复杂的条件逻辑,还能进行结构模式匹配,针对整个数据结构匹配模式,主要通过以下几种方式简化复杂的条件逻辑:
- 替代冗长的 if-elif-else 语句
- 基本值匹配:对于简单的条件判断,如根据不同的整数或字符串值执行不同的操作,使用
match
和case
语句可以使代码更加简洁直观。例如,判断一个整数是 0、1 还是其他值,传统的if-elif-else
语句可能需要多行代码,而使用模式匹配可以写成:
match num:
case 0:
print("输入是零")
case 1:
print("输入是一")
case _:
print("输入是其他值")
- 多条件判断:在需要判断多个条件的情况下,
match
语句可以更清晰地表达逻辑。例如,根据一天中的不同时间段输出相应的问候语,使用match
语句可以将多个时间范围的判断写得更加紧凑和易读:
match hour:
case 6 | 7 | 8 | 9 | 10 | 11:
print('Good morning!')
case 12 | 13 | 14 | 15 | 16 | 17 | 18:
print('Good afternoon!')
case 19 | 20 | 21 | 22 | 23 | 0 | 1 | 2 | 3 | 4 | 5:
print('Good evening!')
case _:
print('Invalid time')
- 解构复杂数据结构
- 列表和元组解构:可以直接解构列表或元组中的元素,并根据解构后的元素进行条件判断和处理,减少了额外的索引操作和条件判断。例如,处理一个包含两个元素的列表,使用模式匹配可以直接将元素解构出来并进行操作:
match my_list:
case (first, second):
print(f"列表有两个元素,分别是{first}和{second}")
case (_):
print("列表只有一个元素")
case (_ * rest):
print(f"列表第一个元素任意,其余元素有{len(rest)}个")
- 字典解构:能够根据字典的键值对进行匹配和提取,方便对特定结构的字典进行处理。例如,验证一个字典是否包含特定的键值对,并根据不同的情况进行处理:
match user:
case {"role": "admin", "active": True}:
print("active admin")
case {"role": "user", "active": False}:
print("inactive user")
case {"role": role}:
print(f"role: {role}")
case _:
print("unknown")
- 模式匹配与守卫语句结合
可以在
case
语句中添加守卫条件,进一步细化匹配的条件。当需要在匹配特定模式的基础上,再根据其他条件进行判断时,这种方式非常有用。例如,判断一个列表中的两个整数元素,只有在第一个元素大于第二个元素时才执行特定的操作:
match scores:
case (int(score1), int(score2)) if score1 > score2:
print(f'Score 1 ({score1}) is higher than Score 2 ({score2}).')
case (int(score1), int(score2)):
print(f'Score 1 ({score1}) and Score 2 ({score2}) have been recorded.')
case _:
print('Invalid scores format.')
- 处理嵌套结构 支持对嵌套的数据结构进行模式匹配,使处理复杂的嵌套数据变得更加容易。例如,处理一个包含字典和列表的嵌套数据结构,通过模式匹配可以直接访问和提取其中的关键信息:
match data:
case {"name": str(name), "details": {"age": int(age), "city": str(city)}}:
print(f"{name} is {age} years old and lives in {city}")
case _:
print("invalid data")
内置特性
- 异常处理改进:PEP 654 引入了异常组和 except *,允许程序同时引发和处理多个不相关的异常;PEP 678 添加了 add_note()方法,可用于为异常添加上下文信息。
- 新的调试断点函数:引入了内置断点函数 breakpoint(),提供了一种标准而方便的方法在代码中设置断点进行调试,取代了传统的导入 pdb;pdb.set_trace()方法。
标准库特性
- 新增 tomllib 模块:PEP 680 使得标准库中新增了 tomllib 模块,用于支持解析 TOML 格式。
解释器改进
- 细粒度错误位置:PEP 657 使得在打印回溯时,解释器会指向导致错误的确切表达式,而不仅仅是行,有助于更快速准确地定位问题。
- 性能提升:通过改进解释器的循环检测和调用机制等,Python 3.11 比 Python 3.10 快 10%-60%,平均在标准基准测试套件上测得了 1.25 倍的加速。
类型系统特性
- 可变参数泛型:PEP 646 引入了可变参数泛型,使类型提示更加灵活和强大。
- 标记 TypedDict 项目:PEP 655 可以将单个 TypedDict 项目标记为必需或非必需。
- Self 类型:PEP 673 新增了 Self 类型,方便在类方法中更简洁地标注返回值类型。
- 任意文本字符串类型:PEP 675 允许表示任意文本字符串类型,使得类型检查更加严格和准确。
- 数据类转换:PEP 681 添加了 typing.data_class_transform 装饰器,用于指示给定的函数、类或元类如何像数据类一样行为。
Python3.12
语法特性
- 类型参数语法和类型语句:PEP 695 引入了更紧凑和明确的方式来创建泛型类和函数,还可以使用
type
语句声明类型别名。 - 增强的 f-strings:PEP 701 对 f-strings 进行了改进,支持在花括号里写多行表达式,使字符串格式化更加灵活和强大。可以在花括号内进行条件判断等复杂操作,甚至可以在花括号内调用函数并传递参数。
解释器改进
- 每个子解释器一个 GIL:PEP 684 为每个子解释器配备独立的 GIL,提高了并发性能,使得在多线程或多子解释器环境下的程序运行更加高效。
- 低影响监控:PEP 669 实现了低影响监控,可在不显著影响性能的情况下对 Python 解释器进行监控和分析。
- 改进的异常处理:对异常处理机制进行了优化,性能提升高达 20%,还新增了更高效的异常组机制。
数据模型改进
- 不朽对象:PEP 683 引入了不朽对象,这些对象不参与引用计数,并且会一直存在直到 Python 解释器关闭,有助于提高 Python 的单进程并行性能。
- 使用缓冲协议:PEP 688 对使用缓冲协议进行了改进,使得在处理二进制数据时更加高效和灵活。
标准库更新
- pathlib 模块改进:
pathlib.Path
类现在支持子类化,使得开发者可以根据自己的需求定制路径类的行为。 - os 模块改进:对
os
模块进行了改进,特别是在 Windows 支持方面,使得文件系统操作更加稳定和高效。 - sqlite3 模块新增命令行界面:为
sqlite3
模块添加了命令行界面,方便开发者直接在命令行中操作 SQLite 数据库。 - uuid 模块新增命令行界面:为
uuid
模块添加了命令行界面,可方便地生成和操作 UUID。
类型系统特性
- 使用 TypedDict 标注:PEP 692 允许使用
TypedDict
来标注**kwargs
,使得在处理可变关键字参数时的类型检查更加准确和方便。 - typing.override()装饰器:PEP 698 增加了
@typing.override
装饰器,帮助开发者在重构使用方法重写的类继承层次结构时避免 bug,提高代码的可维护性。
性能优化
- 推导式内联:PEP 709 内联了所有的列表、字典和集合推导式,在最佳情况下可以提高两倍的性能。
- 更快的 super()调用:新的
LOAD_SUPER_ATTR
操作码优化了super().attr
和super().method(...)
形式的代码,减少了不必要的开销。 - asyncio 性能提升:实现了更快的 C 语言版本的
asyncio.current_task
,并对异步任务创建进行了优化,在asyncio
基准测试中显示了高达 5%的性能提升。
其他特性
- C API 改进:包括 PEP 697 的不稳定 C API 层和其他一些对 C API 的优化和调整,使得在使用 C 扩展模块时更加方便和稳定。
- Linux perf profiler 支持:Python 3.12 支持
linuxperfprofiler
,为性能分析提供了更多工具。 - 栈溢出保护:在支持的平台上实现了栈溢出保护,增强了程序的安全性和稳定性。
明天继续了解一下[[20250102-Raycast相见恨晚]]中提到的 Raycast 支持的几种脚本语言之一的 Ruby