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新特性详解](https://www.91yiqixue.com/wp-content/uploads/2022/01/py3.10.gif)
看完你是否和有我一样的感觉呢,最直观的感觉就是凶狠,这龇牙咧嘴形象估计能吓到小朋友晚上做噩梦,至于庆祝好像勉强为之,可能美帝觉得带个圣诞帽就是表示祝贺了,至于是否是暗黑系操就觉忽不计了吧,有时美帝的审美还真的不敢苟同。既然这么“凶狠”,接下来就看看它到底“狠”在什么下地方,我们将从六大方面对其进行讲解。
上下文管理器
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 更新日志 —> 点击前往。
- 最新
- 最热
只看作者