Python3.10更新
python3.10版本于2021年10月4日发布正式版,该版本带来了七大新特性。为了让大家对新版本有更好的认识,接下来的介绍会尽量添加python3.10版本和旧版本的代码进行对比。
带*号的为比较重要的特性。
*类型检查改进
Python3.10版本中,联合运算符使用“|”线来代替了旧版本中的Union[]方法,使得程序更加简洁,不仅如此,Python3.10在一些内置函数中,同样可以利用“|”线的联合运算符来提升程序的性能。
在函数中:
from typing import Union # 使用Union需要引入对应的包
# 旧版本
def oldFunc(para: Union[int, float]) -> Union[int, float]:
return para ** 2
# 新版本
def newFunc(para: int | float) -> int | float:
return para ** 2
print(newFunc(3))
在内置函数中使用联合运算符:
# 旧版本
print(isinstance("W3Cschool", (str, int)))
# 新版本
print(isinstance("W3Cschool", str | int))
*上下文管理器
python3.10 中,with 支持使用外层圆括号来使用多个上下文管理器,可以连续多行地书写。这允许将过长的上下文管理器集能够以与之前 import 语句类似的方式格式化为多行的形式。例如,以下这些示例写法现在都是有效的:
with (CtxManager() as example):
pass
with (CtxManager1(),
CtxManager2()):
pass
with (CtxManager1() as example,
CtxManager2()):
pass
with (CtxManager1(),
CtxManager2() as example):
pass
with (CtxManager1() as example1,
CtxManager2() as example2
):
pass
*模板匹配
Python 3.10 引入了结构化的模式匹配,通过match...case关键词来完成,可以匹配字典,类以及其他更复杂的结构。match...case的模式匹配,在使用的方式上与C++中的switch有很多的相似之处。
下面的函数中,case函数通过匹配grade,如果grade为'A',则匹配到第一个例子,如果grade为'B',则匹配到第二个例子...如果前面的案例都不满足时,则输出最后的默认结果。
grade = 'B'
match grade: # 看grade变量,并与下面的case做对比(类似其他语言的switch
case 'A': # 如果grade为'A',则执行该代码块
print("很棒")
case 'B': # 如果grade为'B',则执行该代码块
print("做得好")
case 'C': # 如果grade为'C',则执行该代码块
print("您通过了")
case "D":
print("最好再试一下")
case _: # 如果上面的所有case都未命中,则执行该代码块(类似于其他语言的default)
print("无效的成绩")
字典增加mapping属性
在Python3.10中,针对于字典的三个方法,items,keys和values都增加了一个新的“mapping”属性,通过上述的程序可以发现,对三个方法调用mapping属性后都会返回原字典数据。
mydict = {"W3Cschool": 1, "baidu": 2, "Google": 3}
# 旧版本
print(mydict.keys())
print(mydict.values())
print(mydict.items())
# 新版本
keys = mydict.keys()
values = mydict.values()
items = mydict.items()
print(keys.mapping)
print(values.mapping)
print(items.mapping)
# 可以理解为我们可以根据字典的keys,values,items反向推出这个字典
函数 zip() 增加 strict 参数
Python3.10中对于zip函数添加了strict参数,顾名思义,strict参数就是要严格的遵守参数长度的匹配原则,下面程序中,keys和values列表的长度并不一致。
旧版本的zip函数会根据长度最短的参数来创建字典。新版本的zip函数中,当设定strict参数设置为True时,则要求zip的输入参数必须要长度一致,否则就会报错。
keys = ['W3Cschool', 'Baidu', 'Google']
values = [1,2,3,4]
#旧版本
try:
print(dict(zip(keys,values)))
except:
print("字典创建失败")
try:
print(dict(zip(keys, values, strict=True)))
# 增加strict参数后,如果两个列表长度不等,创建的时候会报错
except:
print("字典创建失败")#报错后使用try-except语句捕获
二进制表示中的频率为1的数量统计
在Python3.10版本中,可以通过调用bit_count函数来统计二进制中数字“1”的个数,当然,在旧版本中,也可以通过很简单的代码实现这个功能。
value = 5
#旧版本
print(bin(value).count("1"))
#新版本
print(value.bit_count())
类型别名的更改
在旧版本中,可以直接通过不同类型的赋值操作来赋予类型新的名字,而在Python3.10版本中,则通过TypeAlias来规定了类型名字的替换。这样操作的优势在于能够让程序开发人员和Python编辑器更加清楚的知道newname是一个变量名还是一个类型的别名,提升程序开发的可靠性。
from typing import TypeAlias # 使用TypeAlias需要导入相关的包
#旧版本
oldname = str
def oldFunc(paran:olaname)->oldname:
return param+param
#新版本
newname:TypeAlias = str
def newFunc(param:newname)->newname:
return param+param
print(newFunc("W3Cschool"))
准备弃用Distutils 内置库
由于Distutils库的功能已经被此setuptools和package库取代了,所以本着简洁性的原则,Distutils在不久的将来(3.12版本)将会被完全的删除掉。
Distutils包为将待构建和安装的额外的模块,打包成 Python 安装包提供支持。新模块既可以是百分百的纯 Python,也可以是用 C 写的扩展模块,或者可以是一组包含了同时用 Python 和 C 编码的 Python 包。
大多数 Python 用户 不会 想要直接使用这个包,而是使用 Python 包官方维护的跨版本工具。特别地, setuptools 是一个对于 distutils 的增强选项,它能提供:
- 对声明项目依赖的支持
- 额外的用于配置哪些文件包含在源代码发布中的机制(包括与版本控制系统集成需要的插件)
- 生成项目“进入点”的能力,进入点可用作应用插件系统的基础
- 自动在安装时间生成 Windows 命令行可执行文件的能力,而不是需要预编译它们
- 跨所有受支持的 Python 版本上的一致的表现