gpt4 book ai didi

详解Python 3.10 中的新功能和变化

转载 作者:qq735679552 更新时间:2022-09-29 22:32:09 25 4
gpt4 key购买 nike

CFSDN坚持开源创造价值,我们致力于搭建一个资源共享平台,让每一个IT人在这里找到属于你的精彩世界.

这篇CFSDN的博客文章详解Python 3.10 中的新功能和变化由作者收集整理,如果你对这篇文章有兴趣,记得点赞哟.

随着最后一个alpha版发布,Python 3.10 的功能更改全面敲定! 。

现在,正是体验Python 3.10 新功能的理想时间!正如标题所言,本文将给大家分享Python 3.10中所有重要的功能和更改.

新功能1:联合运算符

在过去, |符号用于 "算术或"运算,例如

?
1
2
3
print ( 0 | 0 )
print ( 0 | 1 )
print ({ 1 , 2 } | { 2 , 3 })

输出

0 1 {1, 2, 3} 。

在Python 3.10中, |符号有的新语法,可以表示x类型 或 Y类型,以取代之前的typing.Union 完成类型注解 。

举个栗子:

函数的参数应该是一个int 或 str类型 。

旧的写法

?
1
2
3
4
5
from typing import Union
 
 
def f(value: Union[ int , str ]) - > Union[ int , str ]:
     return value * 2

新的写法:

?
1
2
def f(value: int | str ) - > int | str :
     return value * 2

这种新的语法也被作为isinstance() 和issubclass() 的第二个参数,用于类型判断 。

?
1
isinstance ( 1086 , int | str )   # 10086是否为 int型 或 str型

新功能2: 多行上下文管理器

在过去,上下文管理器一般用于资源的自动获取和自动释放,利用打开文件时使用上下文管理器:

?
1
2
with open ( "test.txt" , "w" ) as f:  # 自动打开和关闭文件
     f.write( "hello, 我是三木" )    #  对文件进行读写

如果要复制文件的话,需要打开源文件和目标文件,那么就需要2个上下文管理器,代码会写成这个样子:

?
1
2
3
4
with open ( "test.txt" , "r" ) as f:  # 打开第一个文件
     with open ( "test_copy.txt" , "w" ) as f_copy:  # 打开第二个文件
         content = f.read()  # 从第一个文件获取内容
         f_copy.write(content)  # 向第二个文件写入内容

在Python3.10中,可以将代码精简一下:

?
1
2
3
4
5
6
with (
     open ( "test.txt" , "r" ) as f,  # 打开第一个文件
     open ( "test_copy.txt" , "w" ) as f_copy,  # 打开第二个文件
):
     content = f.read()  # 从第一个文件获取内容
     f_copy.write(content)  # 向第二个文件写入内容

注意变化:

  1. with 只出现了1次
  2. 在同一个代码段,有2个上下文管理器f和 f_copy
  3. 这两个上下文管理可以交互

此外,还可以更加灵(sao)活(qi)的操作:

?
1
2
3
4
5
6
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)  # 向第二个文件写入内容

注意细节:在第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
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 = "星期六" ;
}

简单来说:根据x的值,选择指定的case语句进行执行 。

过去,Python没有这样的语句,所以现在,有了! 。

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
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)

输出 。

星期一 。

如果将第一行改为today = 8,则输出 。

别闹...一个星期只有七天 。

注意:

  1. 匹配顺序是从上往下
  2. 找到一个匹配的case后,会停止,所以不需要向JavaScript一样写break语句
  3. 如果有多个符合条件的case,后面的case也不会有机会匹配到了
  4. 如果没有符合条件的匹配,则会执行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
~ $ . / 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 % )

此外,还有多个Python核心模块正在进行持续的优化,让我们继续期待吧 。

新变化:zip支持长度检查

PEP 618:zip()函数现在具有一个可选strict标志,用于要求所有可迭代对象具有相等的长度 。

首先回顾一下zip函数的用法:

在一个迭代中,同时向多个序列读取内容, 。

可以将行变成列,列变成行,这类似于转置矩阵.

?
1
2
3
4
5
name_list = [ '报警' , '急救' , '消防' ]
number_list = [ 110 , 120 , 119 ]
 
for i in zip (name_list, number_list):
     print (i)

输出 。

?
1
2
3
( '报警' , 110 )
( '急救' , 120 )
( '消防' , 119 )

上面的例子有一个特点:name_list 和 number_list 长度是相同的,如果长度不同会怎么样呢?

?
1
2
3
4
5
name_list = [ '报警' , '急救' , '消防' , '查号' ]
number_list = [ 110 , 120 , 119 ]
 
for i in zip (name_list, number_list):
     print (i)

输出 。

?
1
2
3
( '报警' , 110 )
( '急救' , 120 )
( '消防' , 119 )

注意:因为长度不同,所以最后一组结果查号是不会显示的,但是却没有任何提示,从结果来看,无法判断是否有遗漏的数据.

在Python 3.10,可以给zip()传递参数strict=True,对长度进行严格检查 。

?
1
2
for i in zip (name_list, number_list, strict = True ):
     print (i)

输出 。

?
1
2
3
4
5
6
7
( '报警' , 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

注意: zip的第二个参数比第一个参数短,于是抛出异常 。

以上就是详解Python 3.10 中的新功能和变化的详细内容,更多关于Python 3.10 中的新功能和变化的资料请关注我其它相关文章! 。

原文链接:https://www.cnblogs.com/dongfangtianyu/p/14713895.html 。

最后此篇关于详解Python 3.10 中的新功能和变化的文章就讲到这里了,如果你想了解更多关于详解Python 3.10 中的新功能和变化的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com