阅读(2834) (17)

Python3.10更新

2021-11-04 11:57:18 更新

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 版本上的一致的表现