百木园-与人分享,
就是让自己快乐。

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
    如果喜欢的话欢迎关注和留言,这是我最大的动力!

    来源:https://www.cnblogs.com/dongfangtianyu/p/14713895.html
    图文来源于网络,如有侵权请联系删除。

    未经允许不得转载:百木园 » Python 3.10 中新的功能和变化

    相关推荐

    • 暂无文章