Python 3.10 中的新功能和变化
这篇文章主要为大家详细介绍了Python 3.10 中的新功能和变化,具有一定的参考价值,可以用来参考一下。
随着最后一个alpha版发布,Python 3.10 的功能更改全面敲定!
现在,正是体验Python 3.10 新功能的理想时间!正如标题所言,本文将给大家分享Python 3.10中所有重要的功能和更改。
新功能1:联合运算符
在过去, |符号用于 "算术或"运算,例如:
代码如下:
1 2 3 4 | <code> print (0 | 0) print (0 | 1) print ({1, 2} | {2, 3})</code> |
分析Python 3.10 中的新功能和变化
输出:
01{1, 2, 3}
在Python 3.10中, |符号有的新语法,可以表示x类型 或 Y类型,以取代之前的typing.Union 完成类型注解
举个栗子:
函数的参数应该是一个int 或 str类型
旧的写法:
代码如下:
1 2 3 4 5 6 | <code> from typing import Union def f(value: Union[int, str]) -> Union[int, str]: return value*2</code> |
分析Python 3.10 中的新功能和变化
新的写法:
代码如下:
1 2 3 | <code> def f(value: int | str) -> int | str: return value*2</code> |
分析Python 3.10 中的新功能和变化
这种新的语法也被作为isinstance() 和issubclass() 的第二个参数,用于类型判断
代码如下:
1 2 | <code> isinstance(1086, int | str) # 10086是否为 int型 或 str型</code> |
新功能2: 多行上下文管理器
在过去,上下文管理器一般用于资源的自动获取和自动释放,利用打开文件时使用上下文管理器:
代码如下:
1 2 3 | <code> with open( "test.txt" , "w" ) as f: # 自动打开和关闭文件 f.write( "hello, 我是三木" ) # 对文件进行读写</code> |
如果要复制文件的话,需要打开源文件和目标文件,那么就需要2个上下文管理器,代码会写成这个样子:
代码如下:
1 2 3 4 5 | <code> with open( "test.txt" , "r" ) as f: # 打开第一个文件 with open( "test_copy.txt" , "w" ) as f_copy: # 打开第二个文件 content = f.read() # 从第一个文件获取内容 f_copy.write(content) # 向第二个文件写入内容</code> |
在Python3.10中,可以将代码精简一下:
代码如下:
1 2 3 4 5 6 7 | <code> with ( open( "test.txt" , "r" ) as f, # 打开第一个文件 open( "test_copy.txt" , "w" ) as f_copy, # 打开第二个文件 ): content = f.read() # 从第一个文件获取内容 f_copy.write(content) # 向第二个文件写入内容</code> |
注意变化:
- with 只出现了1次
- 在同一个代码段,有2个上下文管理器f和 f_copy
- 这两个上下文管理可以交互
此外,还可以更加灵(sao)活(qi)的操作:
代码如下:
1 2 3 4 5 6 7 | <code> with ( open( "test.txt" , "r" , encoding= "utf-8" ) as f, # 打开第一个文件 open( "test_copy.txt" , "w" , encoding=f.encoding) as f_copy, # 打开第二个文件 ): content = f.read() # 从第一个文件获取内容 f_copy.write(content) # 向第二个文件写入内容</code> |
注意细节:在第2个open中,使用了第一个open的结果 :f
新功能3: 结构模式匹配 (Structural Pattern Matching)
如果你熟悉或使用过php,Java或JavaScript等语言,可能见到switch语句,例如这样:
代码如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 | <code> today = new Date ().getDay(); switch () { case 0: day = "星期天" ; break ; case 1: day = "星期一" ; break ; case 2: day = "星期二" ; break ; case 3: day = "星期三" ; break ; case 4: day = "星期四" ; break ; case 5: day = "星期五" ; break ; case 6: day = "星期六" ; } </code> |
分析Python 3.10 中的新功能和变化
简单来说:根据x的值,选择指定的case语句进行执行
过去,Python没有这样的语句,所以现在,有了!
代码如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | <code> today = 1 match today: case 0: day = "星期天" case 1: day = "星期一" case 2: day = "星期二" case 3: day = "星期三" case 4: day = "星期四" case 5: day = "星期五" case 6: day = "星期六" case _: day = "别闹...一个星期只有七天" print (day)</code> |
分析Python 3.10 中的新功能和变化
输出
星期一
如果将第一行改为today = 8,则输出
别闹...一个星期只有七天
注意:
- 匹配顺序是从上往下
- 找到一个匹配的case后,会停止,所以不需要向JavaScript一样写break语句
- 如果有多个符合条件的case,后面的case也不会有机会匹配到了
- 如果没有符合条件的匹配,则会执行case_,此_称之为通配符,通配符是可选的
关于结构匹配模式(Structural Pattern Matching),可以说是Python 3.10 重量级的新功能,它还有很多高级用法,值得专门一篇文章来进行介绍,这里就先不展开了。
总之,作为一个迟到了的“switch”,会在其他编程语言中的实践经验上进行改进,成符合Python一贯的风格:简单、灵活、强大。
新变化:性能改进
与所有最新的Python版本一样,Python 3.10也带来了一些性能改进。首先是str(),bytes()和bytearray()构造函数的优化,它们的速度应该提高30%~40%左右(来自 https://bugs.python.org/issue41334)
代码如下:
1 2 3 4 5 6 7 | <code> ~ $ ./python3.10 -m pyperf timeit -q --compare-to=python "str()" Mean +- std dev: [python] 81.9 ns +- 4.5 ns -> [python3.10] 60.0 ns +- 1.9 ns: 1.36x faster (-27%) ~ $ ./python3.10 -m pyperf timeit -q --compare-to=python "bytes()" Mean +- std dev: [python] 85.1 ns +- 2.2 ns -> [python3.10] 60.2 ns +- 2.3 ns: 1.41x faster (-29%) ~ $ ./python3.10 -m pyperf timeit -q --compare-to=python "bytearray()" Mean +- std dev: [python] 93.5 ns +- 2.1 ns -> [python3.10] 73.1 ns +- 1.8 ns: 1.28x faster (-22%)</code> |
分析Python 3.10 中的新功能和变化
此外,还有多个Python核心模块正在进行持续的优化,让我们继续期待吧
新变化:zip支持长度检查
PEP 618:zip()函数现在具有一个可选strict标志,用于要求所有可迭代对象具有相等的长度
首先回顾一下zip函数的用法:
在一个迭代中,同时向多个序列读取内容,
可以将行变成列,列变成行,这类似于转置矩阵。
代码如下:
1 2 3 4 5 6 | <code> name_list = [ '报警' , '急救' , '消防' ] number_list = [110, 120, 119] for i in zip(name_list, number_list): print (i)</code> |
分析Python 3.10 中的新功能和变化
输出
代码如下:
1 2 3 4 | <code> ( '报警' , 110) ( '急救' , 120) ( '消防' , 119)</code> |
分析Python 3.10 中的新功能和变化
上面的例子有一个特点:name_list 和 number_list 长度是相同的,如果长度不同会怎么样呢?
代码如下:
1 2 3 4 5 6 | <code> name_list = [ '报警' , '急救' , '消防' , '查号' ] number_list = [110, 120, 119] for i in zip(name_list, number_list): print (i)</code> |
分析Python 3.10 中的新功能和变化
输出
代码如下:
1 2 3 4 | <code> ( '报警' , 110) ( '急救' , 120) ( '消防' , 119)</code> |
分析Python 3.10 中的新功能和变化
注意:因为长度不同,所以最后一组结果查号是不会显示的,但是却没有任何提示,从结果来看,无法判断是否有遗漏的数据。
在Python 3.10,可以给zip()传递参数strict=True,对长度进行严格检查
代码如下:
1 2 3 | <code> for i in zip(name_list, number_list, strict=True): print (i)</code> |
输出
代码如下:
1 2 3 4 5 6 7 8 | <code> ( '报警' , 110) ( '急救' , 120) ( '消防' , 119) Traceback (most recent call last): File "C:\Users\san\PycharmProjects\py310\a.py" , line 4, in <module> for i in zip(name_list, number_list, strict=True): ValueError: zip() argument 2 is shorter than argument 1</code> |
注意: zip的第二个参数比第一个参数短,于是抛出异常
以上就是详解Python 3.10 中的新功能和变化的详细内容,更多关于Python 3.10 中的新功能和变化的资料请关注php教程其它相关文章!
注:关于Python 3.10 中的新功能和变化的内容就先介绍到这里,更多相关文章的可以留意