全网最详细:Python3.10版本新特性讲解

Python 版本的迭代可谓是快马加鞭,从最早的 Python1.x (1991年)到 Python 2.x(2001年) 然后又跨越到目前的 Python3.10 (2021.10月发布),Python 团队用了 30 年的时间,将 Python 从微末不起眼的编程语言,打造成了当今(2022年)独占鳌头的语言,30 年一代人的青春岁月全都注入到了 Python 的血液里,让这款语言的生命力越发茁壮。

Python 3.10发布

2021 年 10 月 4 日,正值我们欢度国庆之际,在经过了三个测试版本后,Python 官方终于布发布了 Python 3.10 版本,这瞬间让我慌得一批。

版本发布三个阶段

广义上对说一款软件的发布,需要经过三个测试版本:alpha、beta、gamma,它们分别用来标识测试的阶段和范围:

  • alpha: 是指内测,即 CB,指开发团队内部测试版本,有时也指定一些用户来体验测试版本;
  • beta:是指公测,即面对所有用户公开测试的版本;
  • gamma:经过 beat 版本后,团队再次对软件做一些修改,这时成为正式发布的候选版本,称其为 gamma,也称为 RC(即 Release Candidate 即“候选版本”)。

虽然如此,但我却仍在使用 Python 3.5 ,官方却不知不觉迭代了 5个版本了。记得每次 Python 的版本更新,我们都会习惯性的从 Python 官网浏览一下,但这次我决定细致的品味一下 3.10 版本,因为我只看了一眼 Python 官方网站放出的  Python 3.10 的 LOGO ,就瞬间让我内心一颤,见下图:

图片[1]|Python3.10新特性详解
Python 3.10 蟒蛇凶猛来袭

看完你是否和有我一样的感觉呢,最直观的感觉就是凶狠,这龇牙咧嘴形象估计能吓到小朋友晚上做噩梦,至于庆祝好像勉强为之,可能美帝觉得带个圣诞帽就是表示祝贺了,至于是否是暗黑系操就觉忽不计了吧,有时美帝的审美还真的不敢苟同。既然这么“凶狠”,接下来就看看它到底“狠”在什么下地方,我们将从六大方面对其进行讲解。

上下文管理器

Python 3.10 相较于之前版本,上下文管理器的语法发生了一些变化,但依然使用 with 关键字来处理,不过这次给 with 新增了一对括号,首先回忆一下之前打开一个文本对象的用法,如下所示:

with open('艾奇编程网.txt') as file
    pass

新增的上下文管理器的用法如下所示:

# 单一上下文管理器
with (CtxManager() as example):
    ...
# 同时打开两个上下文管理器
with (
    CtxManager1(),
    CtxManager2()
):
    ...
# 给其中一个上下文管理器起个别名
with (CtxManager1() as example,
      CtxManager2()):
    ...
# 给两个管理器分别起别名
with (
    CtxManager1() as example1,
    CtxManager2() as example2
):
    ...
# 同时打开三个上下文管理器
with (
    CtxManager1() as example1,
    CtxManager2() as example2,
    CtxManager3() as example3,
):
    ...

下面通过一个具体的实例应用看一下具体用法,如下所示:

# 新增上下文管理器功能
# 相对于 os 模块的 path 方法,Python3 .4版本开始建议使用标准库 pathlib 模块的 Path
import pathlib
# p 为当前路径对象
p = pathlib.Path()
# p1、p2 两个文件路径
p1 = p / "艾奇编程网01.txt"
p2 = p / "艾奇编程网02.txt"
# 使用上下文件管理器进行处理
with(
     p1.open(encoding="utf-8") as f1,
     p2.open(encoding='utf-8') as f2
):
    pass                      

简化Union Type表达

我们知道 Python 是一门弱类型语言,但是在  Python3 以后支持了指定传参的类型和返回值的类型,如下所示:

def mytest(a:int)->int:
    return a**2

同时还支持同时指定两种类型的参数和返回值类型,这在 C/C++、golang 类似于这种静语言中是不被允许的,但是 Python 可以,示例如下:

def mytest(a:str or int)->str or int:
    return a*2

但由于书写价较为麻烦,因此在 Python3.5 版本后引进了 Typing 模块,如下所示:

from typing import Union
def mytest(a:Union[str,int])->Union[str,int]:
    return a*2

在 Python 3.10 对其 Union 进行可进一步的简化,其简化后的表达式如所示:

from typing import Union
# 之前的版本
# a: Union[int, str] = 1
# Python 3.10 版本
a: str | int = 1

简化后的版本完全等价于先前的版本,如下所示:

Union[int, str] == int | str

更强大类型检查功能

Python3.10 提供可更强大的类型检查功能,通过增加 ParamSpec、TypeVar 可以让函数的类型检查再有装饰器的情况下正常工作,如下所示。

from typing import Awaitable, Callable, ParamSpec, TypeVar
# 自定义特殊参数
S = ParamSpec("S")
# 自定义变量类型
T = TypeVar("T")


def log_to_database():
    pass

def add_logging(f: Callable[S, T]) -> Callable[S, Awaitable[T]]:
  async def inner(*args: P.args, **kwargs: P.kwargs) -> T:
      pass
      
@add_logging
def takes_int_str(x: int, y: str) -> int:
    pass

 同时还增加 TypeAlias 来显示类型别名,防止类型过多让开发者混淆,如下所示:

# 改版前,容易混淆 x 的类型
x = int
def plus_int(a:x,b:x) -> x:
    return a+b


# 改版后,防止 x 发生混淆
from typing import TypeAlias
x : TypeAlias = int
def plus_int(a:x,b:x) -> x:
    return a+b

结构化模式匹配

Python 3.10 通过 match .. case 语句实现了结构化模式的匹配功能,类似于 JavaScript 中的 switch… case 功能,下面通过简单的实例进行说明:

person =int(input("请输入人数:"))

match person:
    # 当人数为2人时
    case 2:
        print("选择对打游戏")
    case 3|5:
        print("选择团战类游戏")
    case _:
        print("其他情况,则直接去旅游")

输出结果:

请输入人数:2
选择对打游戏

是不是非常强大,结构化模式匹配不仅可以匹配对象,还可以匹配字典。通过模式匹配大大增加了控制流的清晰度和表达能力,其语法格式如下:

match subject:
    case <pattern_1>:
        <action_1>
    case <pattern_2>:
        <action_2>
    case <pattern_3>:
        <action_3>
    case _:
        <action_wildcard>

更友好的报错提示

Python 3.10 对错误提升进行了升级,使得报错信息的更加显而易见,有助于我们快速定位 BUG,然后进行修改、调试,这一点应该是 Python 3.10中 最最受大家欢迎的改进,比如当您的括号、引号未闭合时,Python 会抛出更加明显的错误提示,如下所示:

name ="艾奇编程网
url = "www.91yiqixue.com"

报错提示如下:

File "D:\python\project\3.10test\test.py", line 73
   name ="艾奇编程网
          ^
SyntaxError: unterminated string literal (detected at line 73)
# 翻译为:未终止的字符串值(检测到第73行)  

在看一个简单示例:

print("hello,艾奇编程网:www.91yiqixue.com"

输出的报错信息:

File "D:\python\project\3.10test\test.py", line 73
  print("hello,艾奇编程网:www.91yiqixue.com"
         ^
SyntaxError: '(' was never closed # 括号没有关闭

改进zip函数

zip 函数新增可 strict 参数值,当该选型为 True 时,传入的 zip() 函数的两个参数值(即可迭代项)长度必须相等,否则会抛出 ValueError 异常,而旧版没有此参数,当发生上述情况时,以长度最小的为准。示例如下:

urls = ["www.baidu.com","www.91yiqixue.com","www.sina.com","www.123.com"]
names = ["百度", "艾奇编程网", "新浪微博"]
# 没有 strict 参数的情况
za = zip(urls,names)
for each in za:
    print(each)

输出结果:

('www.baidu.com', '百度')
('www.sina.com', '艾奇编程网')
('www.91yiqixue.com', '新浪微博')

使用 strict 参数,示例如下:

urls = ["www.baidu.com","www.91yiqixue.com","www.sina.com","www.123.com"]
names = ["百度", "艾奇编程网", "新浪微博"]
# 使用 strict
za = zip(urls,names,strict=True)
for each in za:
    print(each)

输出 ValueError 异常,结果如下所示:

Traceback (most recent call last):
  File "D:\python\project\3.10test\test.py", line 79, in <module>
    for each in za:
ValueError: zip() argument 2 is shorter than argument 1 

distutils被弃用

distutils 是 Python 的标准库模块,是用来打包、安装 Python 模块的,该模块在 Python3.10 版本中已被弃用,并计划在 Python 3.12 中移除,官方推荐使用 distutils 的增强版 setuptools 来构建和安装Python 模块。 

如果想了解更多精彩内容请参阅 Python 官方网站 3.10 更新日志 —> 点击前往

© 版权声明
THE END
喜欢就支持一下吧
点赞6赞赏
分享
评论 共2条
HarryPotter的头像|艾奇编程网

昵称

取消
昵称表情