Python 3.10 中新的功能和变化
随着最后一个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) # 向第二个文件写入内容
注意变化:
with
只出现了1次- 在同一个代码段,有2个上下文管理器
f
和f_copy
- 这两个上下文管理可以交互
此外,还可以更加灵(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
,则输出
别闹...一个星期只有七天
注意:
- 匹配顺序是从上往下
- 找到一个匹配的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)
~ $ ./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的第二个参数比第一个参数短,于是抛出异常
文章首发于我的公众号,原文链接:https://mp.weixin.qq.com/s/acNtLBNPKUKmcX2VW-K0mw
如果喜欢的话欢迎关注和留言,这是我最大的动力!
Python 3.10 中新的功能和变化的更多相关文章
- (数据科学学习手札22)主成分分析法在Python与R中的基本功能实现
上一篇中我们详细介绍推导了主成分分析法的原理,并基于Python通过自编函数实现了挑选主成分的过程,而在Python与R中都有比较成熟的主成分分析函数,本篇我们就对这些方法进行介绍: R 在R的基础函 ...
- Python 3.10 明年发布,看看都有哪些新特性?
我们目前生活在Python 3.8的稳定时代,上周发布了Python的最新稳定版本3.8.4.Python 3.9已经处于其开发的beta阶段,并且2020年7月3日预发布了beta版本(3.9.0b ...
- Python 3.10 正式发布,新增模式匹配,同事用了直呼真香!
关注微信公众号:K哥爬虫,QQ交流群:808574309,持续分享爬虫进阶.JS/安卓逆向等技术干货! 前几天,也就是 10 月 4 日,Python 发布了 3.10.0 版本,什么?3.9 之后居 ...
- 关于 iOS 10 中 ATS 的问题
本文于 2016 年 11 月 28 日按照 Apple 最新的文档和 Xcode 8 中的表现进行了部分更新. WWDC 15 提出的 ATS (App Transport Security) 是 ...
- 关于 iOS 10 中 ATS / HTTPS /2017 问题
本文于 2016 年 11 月 28 日按照 Apple 最新的文档和 Xcode 8 中的表现进行了部分更新. WWDC 15 提出的 ATS (App Transport Security) 是 ...
- Python 3.10 is coming!
看看Python 官网的文档 whatsnew,Python 3.10 已然距离我们越来越近了,然我们看看 Python 3.10 相较于 Python 3.9 有哪些改变吧 新特性 通过括号来组织多 ...
- 利用Conda尝鲜Python 3.10
1 简介 就在几天前,Python3.10的第一个正式版本3.10.0发布,之前我们只是从其各个测试版本中捕风捉影地知晓了一些可能加入的新特性,而在正式版本中,我们得以一睹其正式加入的诸多新特性. 本 ...
- Windows 10 版本 1507 中的新 AppLocker 功能
要查看 Windows 10 版本信息,使用[运行]> dxdiag 回车 下表包含 Windows 10 的初始版本(版本 1507)中包括的一些新的和更新的功能以及对版本 1511 的 W ...
- NET Framework 4 中的新 C# 功能
http://msdn.microsoft.com/zh-cn/magazine/ff796223.aspx C# 编程语言自 2002 年初次发布以来已经有了极大的改善,可以帮助程序员编写更清晰易懂 ...
随机推荐
- 五大自动化测试的Python框架
1.Robot Framework 作为最重要的Python测试框架之一,Robot Framework主要被用在测试驱动(test-driven)类型的开发与验收中.虽然是由Python开发而来,但 ...
- 聊一聊JVM
JVM 什么是JVM? JVM是java虚拟机的缩写,本质上是一个程序,能识别.class字节码文件(.java文件编译后产生的二进制代码),并且能够解析它的指令,最终调用操作系统上的函数,完成我 ...
- macOS网络安全审计
nettop监听网络流量的方法 nettop是macOS系统自带的命令,命令功能能监听网络流量,如果你想查询一个恶意域名.ip和本机进程连接情况,那么可以试试nettop,就是展示方式不是太友好,需要 ...
- 基于Hi3559AV100的视频采集(VDEC-VPSS-VO)整体框图设计
下面给出基于Hi3559AV100的视频采集整体设计,具体设计将在后续给出: 图形采集端整体设计 Hi3559AV100软件程序按结构划分可分为4层,第一层是硬件驱动层,第二层是操作系统层,第三层是媒 ...
- 在ASP.NET Core中用HttpClient(一)——获取数据和内容
在本文中,我们将学习如何在ASP.NET Core中集成和使用HttpClient.在学习不同HttpClient功能的同时使用Web API的资源.如何从Web API获取数据,以及如何直接使用Ht ...
- 如何在 ASP.NET Core 中写出更干净的 Controller
你可以遵循一些最佳实践来写出更干净的 Controller,一般我们称这种方法写出来的 Controller 为瘦Controller,瘦 Controller 的好处在于拥有更少的代码,更加单一的职 ...
- js--this指向的相关问题
前言 关于this的指向问题是前端面试中常考的知识点,也是我们开发学习中较难理解的问题.作为JavaScript的基础,需要我们彻底理解这一关键词.this作为JavaScript中非常复复杂的机制, ...
- JS table排序
<html lang="en"> <head> <meta charset="UTF-8"> <meta http-e ...
- 《Asp.Net Core3 + Vue3入坑教程》 - 6.异常处理与UserFriendlyException
简介 <Asp.Net Core3 + Vue3入坑教程> 此教程适合新手入门或者前后端分离尝试者.可以根据图文一步一步进操作编码也可以选择直接查看源码.每一篇文章都有对应的源码 目录 & ...
- P4285 [SHOI2008]汉诺塔 题解 (乱搞)
题目链接 P4285 [SHOI2008]汉诺塔 解题思路 提供一种打表新思路 先来证明一个其他题解都没有证明的结论:\(ans[i]\)是可由\(ans[i-1]\)线性递推的. (\(ans[i] ...