Python 3.9这些独特新功能
引言:
Python 3.9于2020年7月10日发布。
最新功能令人难以置信。
比如:
字典联合运算符:
最喜欢的新功能之一,具有优美的语法。如果有两个字典a并且b需要合并,那么现在使用并运算符。
类型提示:
使用此工具,我们的编辑人员可以立即了解问题。
我们也可以非常详细地了解所包含的类型
两种新的字符串方法
新的Python解析器 -这非常酷。但有可能成为Python未来发展中最重大的更改之一。
Python 3.9于2020年7月10日发布。最新功能令人难以置信。本文并不会详尽列出每项更改,而是列出了下一版对我们来说最有趣和值得注意的事情-开发人员。所以,让我们开始吧!
类型提示
Python是动态类型的,这意味着我们无需在代码中指定数据类型。
无需在代码中指定数据类型
没关系,但是有时可能会造成混淆,突然之间,Python的灵活性比其他任何事情都变得更加令人讨厌。
从3.5开始,我们可以指定类型,但是非常麻烦。此更新确实改变了这一点,让我们使用一个示例:
在我们的add_int函数中,我们显然希望为其自身添加相同的数字(由于某些神秘的未定义原因)。但是我们的编辑器并不知道,并且使用两个字符串一起添加完全可以,+因此不会发出警告。
现在,我们可以将期望的输入类型指定为int。使用此工具,我们的编辑人员可以立即了解问题。
我们也可以非常详细地了解所包含的类型,例如:
类型提示可以在任何地方使用-由于有了新的语法,现在它看起来更加简洁:
新解析器
这更多是视线之外的更改,但有可能成为Python未来发展中最重大的更改之一。
新解析器
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 http
http.HTTPStatus.EARLY_HINTS
#
http.HTTPStatus.TOO_EARLY
#
http.HTTPStatus.IM_A_TEAPOT
#
查看这些状态代码,我不太明白您为什么会使用它们。就是说,很高兴终于可以让我成为茶壶状态代码。http.HTTPStatus.IM_A_TEAPOT从生产服务器返回此代码时,我现在可以使用它来改善生活质量(讽刺,请不要这样做...)。
math新功能
同时,在math模块中,添加或改进了许多其他功能。从对一个现有功能的改进开始:
import math
# Greatest common divisor
math.gcd(80, 64, 152)
以前,gcd用于计算最大公约数的函数只能应用于2个数字,从而迫使程序员math.gcd(80, math.gcd(64, 152))在处理更多数字时必须执行类似的操作。从Python 3.9开始,我们可以将其应用于任意数量的值。
math模块的第一个新增加的math.lcm功能是:
# Least common multiple
math.lcm(4, 8, 5)
# 40
math.lcm计算其参数的最小公倍数。与GCD相同,它允许可变数量的参数。
其余2个新功能密切相关。这些是math.nextafter和math.ulp:
# Next float after 4 going towards 5
math.nextafter(4, 5)
4.000000000000001
# Next float after 9 going towards 0
math.nextafter(9, 0)
8.999999999999998
# Unit in the Last Place
math.ulp(1000000000000000)
0.125
math.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。
拓扑顺序
在引入此功能之前,您必须自己使用例如Khan的算法或深度优先搜索(不是完全简单的算法)自己实现。因此,现在,如果需要(例如)对依赖作业进行排序以进行调度,则只需执行以下操作:
from functools import TopologicalSorter
graph = {"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']
在上面的示例中,我们首先使用字典创建图,其中键是传出节点,值是它们的邻居集。之后,我们使用图形创建一个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. Option
d = dict(d1, **d2)
# 2. Option
d = d1.copy() # Copy the first dictionary
d.update(d2) # Update it "in-place" with second one
# 3. Option
d = {**d1, **d2}结语:
这就是即将推出的Python 3.9所包含的部分独特新功能。可能并非所有这些更改都与您的日常编程相关,但是我认为至少要注意前2个添加项(|operator和TopologicalSorter)是一件好事,因为它们有时会派上用场。你喜欢吗?