详解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)  # 向第二个文件写入内容

注意变化:

  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 中的新功能和变化的资料请关注我们其它相关文章!

(0)

相关推荐

  • Python 3.7新功能之dataclass装饰器详解

    前言 Python 3.7 将于今年夏天发布,Python 3.7 中将会有许多新东西: 各种字符集的改进 对注释的推迟评估 以及对dataclass的支持 最激动人心的新功能之一是 dataclass 装饰器. 什么是 Data Class 大多数 Python 开发人员编写过很多像下面这样的类: class MyClass: def __init__(self, var_a, var_b): self.var_a = var_a self.var_b = var_b dataclass 可以

  • Python 3.8 新功能全解

    Python 3.8是Python语言的最新版本,它适合用于编写脚本.自动化以及机器学习和Web开发等各种任务.现在Python 3.8已经进入官方的beta阶段,这个版本带来了许多语法改变.内存共享.更有效的序列化和反序列化.改进的字典和更多新功能. Python 3.8还引入了许多性能改进.总的来说,我们即将拥有一个更快.更精确.更一致和更现代的Python.下面是Python 3.8的新功能和最重要的改变. 1.赋值表达式 Python 3.8最明显的变化就是赋值表达式,即:=操作符.赋值

  • Python 3.8 新功能大揭秘【新手必学】

    最新版本的Python发布了!今年夏天,Python 3.8发布beta版本,在2019年10月14日,第一个正式版本已准备就绪.现在,我们都可以开始使用新功能并从最新改进中受益. Python 3.8是Python语言的最新版本,它适合用于编写脚本.自动化以及机器学习和Web开发等各种任务.现在Python 3.8已经进入官方的beta阶段,这个版本带来了许多语法改变.内存共享.更有效的序列化和反序列化.改进的字典和更多新功能. 好了,正文开始,一起看看吧! Python 3.8 是 Pyth

  • 详解Python 4.0 预计推出的新功能

    Python 3.8 发布在即,核心开发者团队让我总结一下最近讨论的 Python 4.0 预计推出的新功能,代码名为" Ouroboros:自噬蛇".Python 4.0 是大家翘首以盼的新版本,也将成为 Python 历史上的重大里程碑,在此感谢为之努力奋斗的 100 多名贡献者. 经过邮件列表上的论战,PEP8 里的一行 79 个字符的限制将增加至一行 89.5 个字符.IDE 用户终于可以充分利用 30" 超宽 4K 显示器的优势啦!这是我们对每行 100 个字符这一

  • Python 3.10 的首个 PEP 诞生,内置类型 zip() 迎来新特性(推荐)

    译者前言:相信凡是用过 zip() 内置函数的人,都会赞同它很有用,但是,它的最大问题是可能会产生出非预期的结果.PEP-618 提出给它增加一个参数,可以有效地解决大家的痛点. 这是 Python 3.10 版本正式采纳的第一个 PEP,「Python猫」一直有跟进社区最新动态的习惯,所以翻译了出来给大家尝鲜,强烈推荐一读.(PS:严格来说,zip() 是一个内置类(built-in type),而不是一个内置函数(built-in function),但我们一般都称它为一个内置函数.) PE

  • Python 3.8 新功能来一波(大部分人都不知道)

    Python 是一门广受好评的编程语言,每个版本的更新都会对开发社区带来一定影响.近日,Python 3.8 已进入 beta 2 版本的测试中,各项新特性已经添加完毕,最终版本预计于今年 10 月发布. 从事计算机领域工作的读者朋友对 Python 编程语言应该非常熟悉了.这是一门广受好评的动态编程语言,其灵活和语法简易的特点使得这门语言在脚本工具.数据分析.Web 后端都有广泛的应用.Python 开发社区也非常活跃,3.x 的版本迭代速度非常快.2018 年 6 月底,Python 3.7

  • Python3.9又更新了:dict内置新功能

    Python3.8 的热乎劲还没过去,Python 就又双叒叕要更新了.近日,3.9 版本的第四个 alpha 版已经开源.从文档中,我们可以看到官方透露的对 dict.math 等组件增加的新特性,以及下一步的开发进展 自公开了 3.8 版本后,Python 的迭代依然在继续.目前是 Python3.9,这是一个正在开发的 Python 版本.其最新的 alpha 4.0 版本--3.9.0a4 已经公开.公开这一版本的原因是希望帮助开发者尽快测试新特性.修复 bug 并测试开源流程.在这一阶

  • python实现文本进度条 程序进度条 加载进度条 单行刷新功能

    python实现文本进度条 程序进度条 加载进度条 单行刷新功能,具体内容如下所示: 利用time库来替代某个程序 的进行过程,做实例, 思路是,简单打印出来程序进度 单行刷新关键是\r, python默认是print后换行,所以加一个\r是光标回退到之前位置 import time tm=10 print('{:-^18}'.format('开始')) for i in range(tm+1): a='#'*i b='.'*(tm-i) c=(i/tm)*100 print('\r{:^3.0

  • Python 3.8正式发布重要新功能一览

    Python3.8有哪些你要关注的新内容?  Python3.8 都有哪些新功能,在文档手册中,大家可以有一个概览.这么多新内容,哪些是大家最先要关注一下的呢?下面,营长就带大家从深度和广度两方面,了解那些最大的变化,帮助大家快速上手 Python3.8. 新功能手册: https://docs.python.org/3.8/whatsnew/3.8.html 在本文中,你将了解到Python 3.8如何: 使用赋值表达式简化一些代码结构 在你自己的函数中强制执行仅位置参数 指定更精确的类型提示

  • Python中的sys.stdout.write实现打印刷新功能

    前言: 今天学习python的常用模块的时候,了解到了time模块和datetime模块,于是想在编译环境中实时打印出时间,不会换行,且打印的时候自动删除前一步打印出的时间(本质原理不是这样),而不是像print那样打印之后自动换行再重新打印. 想要直接看到效果及方法,请直接跳到后文 解决办法. 我们先来看看Print方法打印的效果: 代码: from datetime import datetime as dt import sys import time for i in range(5):

随机推荐