Hello,大家好,我是Alex,欢迎来到每周博客!
这篇博客来给大家介绍一下Python 3.10的新特性。

Python 3.10版本带来了一些很棒的新功能和改进。

结构模式匹配

结构模式匹配可以让我们将变量与一组不同的可能值进行匹配,就类似于其它编程语言中的switch case语句,相应的Python 3.10中为match case语句。

一个简单的示例:

import randomdef http_error(status) -> str:match status:case 400:return "Bad Request"case 401 | 403:        # 可以将多个可能值组合在一个casereturn "Not Allowed"case 404:return "Not Found"case _:return "Something's wrong with the internet"if __name__ == '__main__':s = random.choice([400, 401, 403, 404, 500])print(s, http_error(s))s = random.choice([400, 401, 403, 404, 500])print(s, http_error(s))

输出:

D:\Python\Python310\python.exe E:/Code/PythonProject/Python310NewFeatures/main.py
403 Not Allowed
500 Something's wrong with the internetProcess finished with exit code 0

Python 3.10不仅支持与简单值进行匹配,还可以与其它数据类型进行匹配,比如元组或者设置为特定值的特定属性的类对象。

point = (3, 4)
match point:case (0, 0):print("Origin")case (0, y):print(f"x = 0, y = {y}")case (x, 0):print(f"x = {x}, y = 0")case (x, y):print(f"x = {x}, y = {y}")case _:raise ValueError("Not a Point")

输出:

D:\Python\Python310\python.exe E:/Code/PythonProject/Python310NewFeatures/main.py
x = 3, y = 4Process finished with exit code 0

我们可以看到match case在许多不同的场景中都可以使用。

带括号的上下文管理器

现在已支持使用外层圆括号来使多个上下文管理器可以连续多行地书写。 这允许将过长的上下文管理器集能够以与之前 import 语句类似的方式格式化为多行的形式。 例如,以下这些示例写法现在都是有效的:

with (CtxManager() as example):...with (CtxManager1(),       # 在被包含的分组末尾过可以使用一个逗号作为结束:CtxManager2()
):...with (CtxManager1() as example,CtxManager2()):...with (CtxManager1(),CtxManager2() as example):...with (CtxManager1() as example1,CtxManager2() as example2
):...

zip函数的strict参数

现在 zip() 函数有一个可选的 strict 布尔参数,用于要求所有可迭代对象的长度都相等。

zip() 函数创建一个迭代器聚合来自多个可迭代项的元素,默认是当到达较短的可迭代对象的末尾时停止。

names = ["Max", "Mary", "Ben"]
ages = [22, 26]result = zip(names, ages)
print(list(result))

输出:

[('Max', 22), ('Mary', 26)]

它只是组合了前两个元素,丢弃了第三个name。

如果设置strict参数为True,那么可迭代对象长度不等时将引发报错。

>>> names = ["Max", "Mary", "Ben"]
>>> ages = [22, 26]
>>>
>>> result = zip(names, ages, strict=True)
>>> print(list(result))
Traceback (most recent call last):File "<stdin>", line 1, in <module>
ValueError: zip() argument 2 is shorter than argument 1

更清楚的错误消息

这是我发现的非常有用的另一项改进,许多错误消息已经得到了改进,不仅提供有关错误的更精确消息,而且还提供有关错误实际发生位置的更精确信息。

例如在此代码中缺少括号,旧错误只是一条invalid syntax,甚至连行号都不对。

Python 3.7.0 (default, Jun 28 2018, 08:04:48) [MSC v.1912 64 bit (AMD64)] :: Anaconda, Inc. on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> print("Hello"
... print("World")File "<stdin>", line 2print("World")^
SyntaxError: invalid syntax

而在Python 3.10中我们可以看到它正确的报错行号和错误描述。

Python 3.10.0 (tags/v3.10.0:b494f59, Oct  4 2021, 19:00:18) [MSC v.1929 64 bit (AMD64)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> Print("Hello"
... Print("World")File "<stdin>", line 1Print("Hello"^^^^^^
SyntaxError: invalid syntax. Perhaps you forgot a comma?

还有缩进错误的例子,我们也可以看到错误确切的行和位置以及准确的错误信息。

>>> def foo():
...    if lel:
...    x = 2File "<stdin>", line 3x = 2^
IndentationError: expected an indented block after 'if' statement in line 2

我非常喜欢这个改进,这对初学者特别有帮助。

更新和弃用

  • Python 3.10现在需要OpenSSL 1.1.1 or newer,这会影响hashlibhmacssl模块的运行。
  • distutils包已被废弃,将在 Python 3.12 中移除。其用指定包构建程序的功能已被第三方软件包 setuptools 和 packaging 完全取代。

优化

  • 现在,构造函数 str() 、 bytes() 和 bytearray() 速度更快了(小对象大约提速 30-40%)。
  • runpy 导入的模块变少了。python3 -m module-name 命令的启动时间平均加快 1.4 倍。在 Linux 上,Python 3.9 的 python3 -I -m module-name 导入了69个模块,而 Python 3.10 只导入了 51个模块(少了 18 个)。
  • 当用 --enable-optimizations 构建 Python 时,会在编译和链接命令行中添加 -fno-semantic-interposition。 这会让用带参数 --enable-shared 的 gcc 构建 Python 解释器时提速 30%。
  • 子串搜索函数,如 str1 in str2 和 str2.find(str1) ,有时会采用Crochemore & Perrin的“二路归并”字符串搜索算法,以避免长字符串的二次检索行为。

总结

Python 3.10带来了很多很棒的功能改进和性能优化,我觉得最有趣的就是模式匹配功能,最有用的就是更清楚的错误消息,详细的Python 3.10 有什么新变化可以参考官方文档。

您应该知道Python 3.10中的新特性!相关推荐

  1. Python 3.10 中的 6 个新特性,你体验了吗?

    作者 | Sara A. Metwalli 译者 | 有数可据 出品 | CSDN(ID:CSDNnews) 新的 Python 版本推出了有趣的新功能. Python 是当今最流行的编程语言之一.它 ...

  2. 利用 Conda 尝鲜 Python 3.10 不一样的特性 快来试试

    1 简介 就在几天前,Python3.10的第一个正式版本3.10.0发布,之前我们只是从其各个测试版本中捕风捉影地知晓了一些可能加入的新特性,而在正式版本中,我们得以一睹其正式加入的诸多新特性. 本 ...

  3. Python 3.10 有什么新变化

    本文介绍了 Python 3.10 相比 3.9 的新增特性. 详情请参阅 更新日志. 摘要 -- 发布重点 新的语法特性: PEP 634, 结构化模式匹配: 规范说明 PEP 635, 结构化模式 ...

  4. Python 3.8 发布,新特性全面解读!

    文末有干货 "Python高校",马上关注 真爱,请置顶或星标 大家好,我是Gao! 本文详细介绍 Python 3.8中的新功能,以及和与3.7相比. 预览用户应该知道此文档在官 ...

  5. Entity Framework 4.3 中的新特性

    原文地址:http://www.cnblogs.com/supercpp/archive/2012/02/20/2354751.html EF4.3于2月9号正式发布了,微软的EF小组最近一年开始发力 ...

  6. atitit.Oracle 9 10 11 12新特性attilax总结

    atitit.Oracle 9  10 11  12新特性 1. ORACLE 11G新特性 1 1.1. oracle11G新特性 1 1.2. 审计 1 1.3. 1.   审计简介 1 1.4. ...

  7. JDK 8 中的新特性

    目录 JDK 8 中的新特性 JDK 8 中的新特性 JDK 版本说明 JDK 8 版本说明 Java Platform, Standard Edition 8 是一个拥有丰富特性的主要版本.本文档总 ...

  8. php v5.,PHP V5.3 中的新特性,第 5 部分- 从 PHP V5.2 升级到 PHP V5.3

    PHP V5.3 中的新特性,第 5 部分: 从PHP V5.2 升级到 PHP V5.3 1 2 3 4 5 下一页 PHP V5.3 将于不久后发布."PHP V5.3 中的新特性&qu ...

  9. Spring 2.5:Spring MVC中的新特性

    转载说明:infoQ就是牛人多,看人家去年就把Spring2.5注视驱动的MVC写出来了,还是这么详细,我真是自叹不如,今天偶尔看到这篇文章非常认真的拜读了2遍,简直是茅厕顿开啊....\(^o^)/ ...

最新文章

  1. 【AJAX】Ajax学习总结
  2. java lifo 队列_1.8 Java 队列 Queue、双端队列 Deque - Java 知识总结与学习
  3. HDLBits 系列(34)Serial two's complememter(Mealy and Moore FSM)
  4. java 1_java基本语法1
  5. linux 修改权限 anyone,linux 进程管理工具
  6. junit4使用心得
  7. 中兴a2018拆机图片_中兴天机拆机步骤详解【图文】
  8. 一致性哈希算法原理分析及实现
  9. r语言 将表格导出为csv_r语言 将表格导出为csv_2. R语言基础语法
  10. GIL线程全局锁 协程
  11. 根据大小分割大文本_值得一看的文本检测方法
  12. ASP.NET基础之HttpContext学习
  13. 接口与事件之图形界面的认证登录
  14. mysql八大知识点_MySQL索引八大法则之上篇
  15. 等式约束凸二次规划(拉格朗日乘子法)_python
  16. 分享个大厂PRD模板
  17. 点云配准ICPNDT
  18. 2020杭电多校赛 Multi-University Training Contest
  19. 模拟网络延迟抖动测试
  20. 小红书购物笔记在哪里看?

热门文章

  1. IE9 CSS 因 Mime 类型不匹配而被忽略“问题
  2. 在echarts图表外调用echarts的下载功能以及echarts getDataURL图表数据不显示的问题的解决方案...
  3. idea离线下载lombok,以及lobok版本不兼容
  4. 在发送键击时,求教Send与SendWait方法,应用于Win7和XP的不同。
  5. 在ASP.net 中对GridView中数据的删除、编辑等操作:
  6. mybaits 字段设置null_为什么阿里巴巴禁止开发人员修改serialVersionUID 字段的值
  7. android 单例的作用,Android中单例模式的几个坑
  8. python 词云手把手_手把手教你用python制作属于你的第一个词云
  9. python字符串加减乘除_python 数字字符串加减乘除-女性时尚流行美容健康娱乐mv-ida网...
  10. php laravel paginate,laravel 8 修改默认的paginate分页样式 的方法可以很简单