详解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发送邮件实例分享
Jul 28 Python
python文件名和文件路径操作实例
Sep 29 Python
Python爬虫爬取一个网页上的图片地址实例代码
Jan 16 Python
python存储16bit和32bit图像的实例
Dec 05 Python
python批量下载网站马拉松照片的完整步骤
Dec 05 Python
python+opencv 读取文件夹下的所有图像并批量保存ROI的方法
Jan 10 Python
Django框架基础模板标签与filter使用方法详解
Jul 23 Python
django与vue的完美结合_实现前后端的分离开发之后在整合的方法
Aug 12 Python
django 文件上传功能的相关实例代码(简单易懂)
Jan 22 Python
python异常处理try except过程解析
Feb 03 Python
浅谈keras通过model.fit_generator训练模型(节省内存)
Jun 17 Python
你需要掌握的20个Python常用技巧
Feb 28 Python
Python基础之数据结构详解
Apr 28 #Python
Python基础详解之邮件处理
python实现黄金分割法的示例代码
Apr 28 #Python
Python 流媒体播放器的实现(基于VLC)
tensorflow+k-means聚类简单实现猫狗图像分类的方法
python实现三阶魔方还原的示例代码
python基于opencv批量生成验证码的示例
You might like
php 求质素(素数) 的实现代码
2011/04/12 PHP
无JS,完全php面向过程数据分页实现代码
2012/08/27 PHP
CI框架简单邮件发送类实例
2016/05/18 PHP
php中__toString()方法用法示例
2016/12/07 PHP
php获取linux命令结果的实例
2017/03/13 PHP
PHP基于socket实现客户端和服务端通讯功能
2017/07/13 PHP
Laravel5.1框架注册中间件的三种场景详解
2019/07/09 PHP
浅析jQuery的链式调用之each函数
2010/12/03 Javascript
固定背景实现的背景滚动特效示例分享
2013/05/19 Javascript
以JSON形式将JS中Array对象数组传至后台的方法
2014/01/06 Javascript
加载列表时jquery获取ul中第一个li的属性
2014/11/02 Javascript
实现前后端数据交互方法汇总
2015/04/07 Javascript
JS生成某个范围的随机数【四种情况详解】
2016/04/20 Javascript
WEB开发之注册页面验证码倒计时代码的实现
2016/12/15 Javascript
从零开始学习Node.js系列教程之基于connect和express框架的多页面实现数学运算示例
2017/04/13 Javascript
Angular.js中ng-include用法及多标签页面的实现方式详解
2017/05/07 Javascript
jQuery插件实现非常实用的tab栏切换功能【案例】
2019/02/18 jQuery
微信小程序开发之点击按钮退出小程序的实现方法
2019/04/26 Javascript
js实现跟随鼠标移动的小球
2019/08/26 Javascript
从零使用TypeScript开发项目打包发布到npm
2020/02/14 Javascript
vue制作抓娃娃机的示例代码
2020/04/17 Javascript
[01:04:01]2014 DOTA2华西杯精英邀请赛5 24 DK VS VG
2014/05/25 DOTA
Python使用函数默认值实现函数静态变量的方法
2014/08/18 Python
Python获取二维矩阵每列最大值的方法
2018/04/03 Python
python实现事件驱动
2018/11/21 Python
python 寻找离散序列极值点的方法
2019/07/10 Python
python中@property和property函数常见使用方法示例
2019/10/21 Python
Python 实现数组相减示例
2019/12/27 Python
Python3 requests模块如何模仿浏览器及代理
2020/06/15 Python
英国领先的男装设计师服装购物网站:Mainline Menswear
2018/02/04 全球购物
英格兰足协官方商店:England Store
2019/07/12 全球购物
会计学习心得体会
2014/09/09 职场文书
转变工作作风心得体会
2016/01/23 职场文书
简单介绍Python的第三方库yaml
2021/06/18 Python
Java数据开发辅助工具Docker与普通程序使用方法
2021/09/15 Java/Android
Python使用mitmproxy工具监控手机 下载手机小视频
2022/04/18 Python