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块中初始化多个对象,使代码更简洁易读。
  • 结构模式匹配:通过matchcase语句实现,类似于其他语言中的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

语法特性

模式匹配增强:引入了模式匹配,可以简化复杂的条件逻辑,还能进行结构模式匹配,针对整个数据结构匹配模式,主要通过以下几种方式简化复杂的条件逻辑:

  1. 替代冗长的 if-elif-else 语句
  • 基本值匹配:对于简单的条件判断,如根据不同的整数或字符串值执行不同的操作,使用matchcase语句可以使代码更加简洁直观。例如,判断一个整数是 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')
  1. 解构复杂数据结构
  • 列表和元组解构:可以直接解构列表或元组中的元素,并根据解构后的元素进行条件判断和处理,减少了额外的索引操作和条件判断。例如,处理一个包含两个元素的列表,使用模式匹配可以直接将元素解构出来并进行操作:
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")
  1. 模式匹配与守卫语句结合 可以在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.')
  1. 处理嵌套结构 支持对嵌套的数据结构进行模式匹配,使处理复杂的嵌套数据变得更加容易。例如,处理一个包含字典和列表的嵌套数据结构,通过模式匹配可以直接访问和提取其中的关键信息:
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().attrsuper().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