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


Posted in Python onApril 28, 2021

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

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

新功能1:联合运算符

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

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类型

旧的写法:

from typing import Union


def f(value: Union[int, str]) -> Union[int, str]:
    return value*2

新的写法:

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

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

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

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

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

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

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

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中,可以将代码精简一下:

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)的操作:

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语句,例如这样:

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没有这样的语句,所以现在,有了!

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

~ $ ./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函数的用法:

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

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

name_list = ['报警', '急救', '消防']
number_list = [110, 120, 119]

for i in zip(name_list, number_list):
    print(i)

输出

('报警', 110)
('急救', 120)
('消防', 119)

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

name_list = ['报警', '急救', '消防', '查号']
number_list = [110, 120, 119]

for i in zip(name_list, number_list):
    print(i)

输出

('报警', 110)
('急救', 120)
('消防', 119)

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

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

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

输出

('报警', 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 中的新功能和变化的资料请关注三水点靠木其它相关文章!

Python 相关文章推荐
Python的Flask框架中实现简单的登录功能的教程
Apr 20 Python
python数据清洗系列之字符串处理详解
Feb 12 Python
详解appium+python 启动一个app步骤
Dec 20 Python
Python使用Tkinter实现机器人走迷宫
Jan 22 Python
对numpy数据写入文件的方法讲解
Jul 09 Python
Linux下python3.7.0安装教程
Jul 30 Python
Django添加favicon.ico图标的示例代码
Aug 07 Python
Python操作excel的方法总结(xlrd、xlwt、openpyxl)
Sep 02 Python
python解析xml文件方式(解析、更新、写入)
Mar 05 Python
Python小白垃圾回收机制入门
Jun 09 Python
python 实现表情识别
Nov 21 Python
详解如何用Python实现感知器算法
Jun 18 Python
Python基础之数据结构详解
Apr 28 #Python
Python基础详解之邮件处理
python实现黄金分割法的示例代码
Apr 28 #Python
Python 流媒体播放器的实现(基于VLC)
tensorflow+k-means聚类简单实现猫狗图像分类的方法
python实现三阶魔方还原的示例代码
python基于opencv批量生成验证码的示例
You might like
php求两个目录的相对路径示例(php获取相对路径)
2014/03/27 PHP
php通过array_merge()函数合并两个数组的方法
2015/03/18 PHP
PHP性能分析工具XHProf安装使用教程
2015/05/13 PHP
CI(Codeigniter)的Setting增强配置类实例
2016/01/06 PHP
Yii框架实现图片上传的方法详解
2017/05/20 PHP
php中访问修饰符的知识点总结
2019/01/27 PHP
超简单的jquery的AJAX用法
2010/05/10 Javascript
Textbox控件注册回车事件及触发按钮提交事件具体实现
2013/03/04 Javascript
JS自调用匿名函数具体实现
2014/02/11 Javascript
使用jQuery实现验证上传图片的格式与大小
2014/12/03 Javascript
JavaScript学习笔记之DOM基础 2.4
2015/08/14 Javascript
JavaScript匿名函数之模仿块级作用域
2015/12/12 Javascript
简述JavaScript提交表单的方式 (Using JavaScript Submit Form)
2016/03/18 Javascript
js从输入框读取内容,比较两个数字的大小方法
2017/03/13 Javascript
JS异步执行结果获取的3种解决方式
2019/02/19 Javascript
详解VScode编辑器vue环境搭建所遇问题解决方案
2019/04/26 Javascript
小程序的上传文件接口的注意要点解析
2019/09/17 Javascript
vue elementUI 表单校验的实现代码(多层嵌套)
2019/11/06 Javascript
vue proxy 的优势与使用场景实现
2020/06/15 Javascript
JavaScript实现H5接金币功能(实例代码)
2021/02/22 Javascript
[01:16]2014DOTA2 TI专访C9战队EE:中国五强中会占三席
2014/07/10 DOTA
总结网络IO模型与select模型的Python实例讲解
2016/06/27 Python
python利用有道翻译实现&quot;语言翻译器&quot;的功能实例
2017/11/14 Python
python批量导入数据进Elasticsearch的实例
2018/05/30 Python
Python双向循环链表实现方法分析
2018/07/30 Python
实例详解Matlab 与 Python 的区别
2019/04/26 Python
Python应用实现处理excel数据过程解析
2020/06/19 Python
Python3获取cookie常用三种方案
2020/10/05 Python
ColourPop美国官网:卡拉泡泡,洛杉矶彩妆品牌
2019/04/28 全球购物
美国职棒大联盟的官方手套、球和头盔:Rawlings
2020/02/15 全球购物
关于晚自习早退的检讨书
2014/09/13 职场文书
2014年学生工作总结
2014/11/20 职场文书
2015年安全教育月活动总结
2015/03/26 职场文书
入党培养人考察意见
2015/06/08 职场文书
2016大学生诚信考试承诺书
2016/03/25 职场文书
Java 在生活中的 10 大应用
2021/11/02 Java/Android