发布|再不知道就Out了!赶紧看看新发布的Python 3.9这些独特新功能


发布|再不知道就Out了!赶紧看看新发布的Python 3.9这些独特新功能
本文插图

Python 3.9这些独特新功能
引言:
Python 3.9于2020年7月10日发布 。
最新功能令人难以置信 。
比如:
字典联合运算符:
最喜欢的新功能之一 , 具有优美的语法 。 如果有两个字典a并且b需要合并 , 那么现在使用并运算符 。
类型提示:
使用此工具 , 我们的编辑人员可以立即了解问题 。
我们也可以非常详细地了解所包含的类型
两种新的字符串方法
新的Python解析器 -这非常酷 。 但有可能成为Python未来发展中最重大的更改之一 。
Python 3.9于2020年7月10日发布 。 最新功能令人难以置信 。 本文并不会详尽列出每项更改 , 而是列出了下一版对我们来说最有趣和值得注意的事情-开发人员 。 所以 , 让我们开始吧!
类型提示
Python是动态类型的 , 这意味着我们无需在代码中指定数据类型 。
发布|再不知道就Out了!赶紧看看新发布的Python 3.9这些独特新功能
本文插图

无需在代码中指定数据类型
没关系 , 但是有时可能会造成混淆 , 突然之间 , Python的灵活性比其他任何事情都变得更加令人讨厌 。
从3.5开始 , 我们可以指定类型 , 但是非常麻烦 。 此更新确实改变了这一点 , 让我们使用一个示例:

发布|再不知道就Out了!赶紧看看新发布的Python 3.9这些独特新功能
本文插图

在我们的add_int函数中 , 我们显然希望为其自身添加相同的数字(由于某些神秘的未定义原因) 。 但是我们的编辑器并不知道 , 并且使用两个字符串一起添加完全可以 , +因此不会发出警告 。
现在 , 我们可以将期望的输入类型指定为int 。 使用此工具 , 我们的编辑人员可以立即了解问题 。
我们也可以非常详细地了解所包含的类型 , 例如:
发布|再不知道就Out了!赶紧看看新发布的Python 3.9这些独特新功能
本文插图

类型提示可以在任何地方使用-由于有了新的语法 , 现在它看起来更加简洁:
发布|再不知道就Out了!赶紧看看新发布的Python 3.9这些独特新功能
本文插图

新解析器
这更多是视线之外的更改 , 但有可能成为Python未来发展中最重大的更改之一 。
发布|再不知道就Out了!赶紧看看新发布的Python 3.9这些独特新功能
本文插图

新解析器
Python当前使用的主要是基于LL(1)的语法 , 而该语法又可以由LL(1)解析器进行解析 , 该解析器从上到下 , 从左到右地解析代码 , 而前瞻性只是一个标记 。
现在 , 我几乎不知道它是如何工作的 , 但是由于使用了这种方法 , 因此我可以向您介绍Python中的一些当前问题:

Python包含非LL(1)语法;因此 , 当前语法的某些部分使用了变通办法 , 从而造成了不必要的复杂性 。
LL(1)在Python语法中创建了限制(没有可能的解决方法) 。 此问题突出表明 , 以下代码根本无法使用当前解析器实现(引发SyntaxError):
with (open("a_really_long_foo") as foo,open("a_really_long_bar") as bar):pass
LL(1)在解析器中以左递归中断 。 意味着特定的递归语法可能导致解析树中的无限循环 。 Python的创建者Guido van Rossum在这里对此进行了解释 。
所有这些因素(以及我根本无法理解的更多因素)对Python产生了重大影响 。 它们限制了语言的发展 。
基于
PEG
的新解析器将为Python开发人员提供更大的灵活性-从Python 3.10起我们将开始注意到这一点 。
新的字符串函数
字符串添加了两个新的便捷功能:
# Remove prefix"someText".removeprefix("some")# "Text"# Remove suffix"someText".removesuffix("Text")# "some"
这两个函数执行您可以通过使用string[len(prefix):]前缀和string[:-len(suffix)]后缀来实现的功能 。 这些是非常简单的操作 , 因此也是非常简单的功能 , 但是考虑到您可能会经常执行这些操作 , 因此具有内置功能可以很好地满足您的需求是一件很不错的事情 。
HTTP的状态代码

最后但并非最不重要的一点是 , 实际上…已将HTTP状态代码添加到http.HTTPStatus 。 即 , 这些是:
import httphttp.HTTPStatus.EARLY_HINTS# &ltHTTPStatus.EARLY_HINTS: 103&gthttp.HTTPStatus.TOO_EARLY# &ltHTTPStatus.TOO_EARLY: 425&gthttp.HTTPStatus.IM_A_TEAPOT# &ltHTTPStatus.IM_A_TEAPOT: 418&gt
查看这些状态代码 , 我不太明白您为什么会使用它们 。 就是说 , 很高兴终于可以让我成为茶壶状态代码 。 http.HTTPStatus.IM_A_TEAPOT从生产服务器返回此代码时 , 我现在可以使用它来改善生活质量(讽刺 , 请不要这样做...) 。
math新功能
同时 , 在math模块中 , 添加或改进了许多其他功能 。 从对一个现有功能的改进开始:
import math# Greatest common divisormath.gcd(80, 64, 152)
以前 , gcd用于计算最大公约数的函数只能应用于2个数字 , 从而迫使程序员math.gcd(80, math.gcd(64, 152))在处理更多数字时必须执行类似的操作 。 从Python 3.9开始 , 我们可以将其应用于任意数量的值 。
math模块的第一个新增加的math.lcm功能是:
# Least common multiplemath.lcm(4, 8, 5)# 40
math.lcm计算其参数的最小公倍数 。 与GCD相同 , 它允许可变数量的参数 。
其余2个新功能密切相关 。 这些是math.nextafter和math.ulp:

# Next float after 4 going towards 5math.nextafter(4, 5)4.000000000000001# Next float after 9 going towards 0math.nextafter(9, 0)8.999999999999998# Unit in the Last Placemath.ulp(1000000000000000)0.125math.ulp(3.14159265)4.440892098500626e-16
该math.nextafter(x, y)功能是非常简单-它是后年浮动x朝会y同时考虑到浮点数精度 。
在math.ulp另一方面 , 可能看起来有点怪异...... ULP代表“单位在最后的地方” , 它的用作数值计算精确的测量 。 最简短的解释是使用一个示例:
假设我们没有64位计算机 。 相反 , 我们只有3位数字 。 使用这3位数字 , 我们可以代表3.14 , 而不是3.141 。 使用3.14 , 我们可以代表的最接近的较大数字是3.15 , 这2个数字相差1个ULP(最后一个单位) , 即0.1 。 因此 , math.ulp返回值等于此示例 , 但是具有计算机的实际精度 。
拓扑顺序
functools模块的一部分是下一个有趣的新功能(有点晦涩) 。 您可以在TopologicalSorter课堂上找到它 。 此类允许我们使用拓扑顺序对图进行排序 。 那是什么?你可能会问 。 拓扑顺序是这样的顺序 , 其中对于2个节点u和v通过向边连接uv(从u至v)u之前时v 。
发布|再不知道就Out了!赶紧看看新发布的Python 3.9这些独特新功能
本文插图

拓扑顺序

在引入此功能之前 , 您必须自己使用例如Khan的算法或深度优先搜索(不是完全简单的算法)自己实现 。 因此 , 现在 , 如果需要(例如)对依赖作业进行排序以进行调度 , 则只需执行以下操作:
from functools import TopologicalSortergraph = {"A": {"D"}, "B": {"D"}, "C": {"E", "H"}, "D": {"F", "G", "H"}, "E": {"G"}}ts = TopologicalSorter(graph)list(ts.static_order())# ["H", "F", "G", "D", "E", "A", "B", "C"]
发布|再不知道就Out了!赶紧看看新发布的Python 3.9这些独特新功能
本文插图
【发布|再不知道就Out了!赶紧看看新发布的Python 3.9这些独特新功能】

在上面的示例中 , 我们首先使用字典创建图 , 其中键是传出节点 , 值是它们的邻居集 。 之后 , 我们使用图形创建一个sorter实例 , 然后调用static_order函数以产生排序 。 请记住 , 此顺序可能取决于插入的顺序 , 因为当2个节点处于图形的同一级别时 , 它们将按照插入顺序返回 。
新区操作符
最值得注意的新功能可能是新的词典合并运算符- |或|= 。 到目前为止 , 您必须从以下3个选项之一中进行选择以合并字典:
# Dictionaries to be merged:d1 = {"x": 1, "y": 4, "z": 10}d2 = {"a": 7, "b": 9, "x": 5}# Expected output after merging{"x": 5, "y": 4, "z": 10, "a": 7, "b": 9}# ^^^^^ Notice that "x" got overridden by value from second dictionary# 1. Optiond = dict(d1, **d2)# 2. Optiond = d1.copy()# Copy the first dictionaryd.update(d2)# Update it "in-place" with second one# 3. Optiond = {**d1, **d2}
结语:
这就是即将推出的Python 3.9所包含的部分独特新功能 。 可能并非所有这些更改都与您的日常编程相关 , 但是我认为至少要注意前2个添加项(|operator和TopologicalSorter)是一件好事 , 因为它们有时会派上用场 。 你喜欢吗?


    推荐阅读