应该了解的Python 3.9的新功能

@高效码农  April 26, 2020

Python 3.9的发布版本(5.10.2020)尚有一段距离,但是随着最后一个alpha(3.9.0a5)的发布以及不久的将来的第一个beta版本,感觉到了该看看我们有哪些新功能,改进和修复的时间了可以期待和期待。本文并不会详尽列出每个更改,而是为我们的下一版本(开发人员)列出了最有趣和值得注意的事情。所以,让我们开始吧!

安装测试版

为了能够实际尝试Python 3.9 的alpha / beta版本中包含的任何内容,我们首先需要安装它。理想情况下,与我们现有的Python 3.8(或其他稳定版本)安装一起,以免弄乱我们的默认解释器。因此,要安装最新的最佳版本:

wget https://www.python.org/ftp/python/3.9.0/Python-3.9.0a5.tgz
tar xzvf Python-3.9.0a5.tgz
cd Python-3.9.0a5
./configure --prefix=$HOME/python-3.9.0a5
make
make install
$HOME/python-3.9.0a5/bin/python3.9

运行此命令后,您应该收到IDLE和类似以下消息的欢迎:

Python 3.9.0a5 (default, Apr 16 2020, 18:57:58) 
[GCC 9.2.1 20191008] on linux
Type "help", "copyright", "credits" or "license" for more information.

Dict操作符

最值得注意的新功能可能是新字典合并运算符-||=。到目前为止,您将不得不从以下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}

上面的第一个选项使用dict(iterable, kwargs)函数来初始化字典——第一个参数是普通字典,第二个参数是键/值对列表,在这种情况下,它只是另一个使用操作符解压缩的字典。

第二种方法使用update函数更新第一个字典,其中包含来自第二个字典的对。由于这个修改了现有的dictionary,我们需要将第一个复制到final变量中,以避免修改原始的dictionary。

第三,也就是最后,在我看来,最干净的解决方案是使用字典将两个变量(d1和d2)解压缩到结果d中。

尽管上面的选项是完全有效的,但是我们现在使用|操作符有了新的(更好的?)解决方案。

# Normal merging
d = d1 | d2
# d = {'x': 5, 'y': 4, 'z': 10, 'a': 7, 'b': 9}

# In-place merging
d1 |= d2
# d1 = {'x': 5, 'y': 4, 'z': 10, 'a': 7, 'b': 9}

上面的第一个例子与前面显示的操作符解包非常相似(d = {d1, d2})。另一方面,第二个示例可以用于就地合并,其中原始变量(d1)用来自第二个操作数(d2)的值更新。

拓扑排序

下一个有趣的(有点晦涩的)新特性是functools模块的一部分。你可以在TopologicalSorter类下找到它。这个类允许我们使用拓扑排序对图形进行排序。那是什么?你可能会问。拓扑排序是指两个节点u和v通过有向边uv(从u到v)连接,u在v之前的排序。

在介绍这个特性之前,您必须使用Khan的算法或深度优先搜索(deep -first search)等自己实现它,这并不是简单的算法。所以,现在,如果需要-例如-排序依赖的工作调度,你只需做以下:

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']

2020-04-26T01:28:25.png
在上面的示例中,我们首先使用dictionary创建图形,其中键是传出节点,值是它们的邻居的集合。然后,我们使用图形创建sorter实例,然后调用static_order函数来生成排序。请记住,此顺序可能取决于插入的顺序,因为当两个节点位于图的同一级别时,它们将按照插入的顺序返回。

除了静态排序之外,这个类还支持节点准备处理时的并行处理,这在处理任务队列时非常有用——你可以在Python库文档中找到这样的例子

IPv6地址范围

Python 3.9中引入的另一个变化是能够指定IPv6地址的范围。如果你不熟悉IPv6范围,他们是用来指定在互联网的哪个部分是各自的IP地址有效。范围可以指定在IP地址的结尾使用%符号-例如:3FFE:0:0:1:20 00:F8FF:FE75:50DF%2 -所以这个IP地址在范围2,这是链接本地地址。

所以,如果你需要在Python中处理IPv6地址,你现在可以这样做:

from ipaddress import IPv6Address
addr = IPv6Address('ff02::fa51%1')
print(addr.scope_id)
# "1" - interface-local IP address

但是在使用IPv6作用域时,有一件事你应该小心。使用基本的Python操作符比较时,具有不同作用域的两个地址是不相等的。

新的数学函数

同时在数学模块中,增加或改进了大量的杂项函数。从一个现有功能的改进开始:

import math

# Greatest common divisor
math.gcd(80, 64, 152)
# 8

以前计算最大公约数的gcd函数只能应用于2个数字,迫使程序员做类似的计算。肾小球囊性肾病(80年,数学。gcd(64,152)),当处理更多的数字时。从Python 3.9开始,我们可以将它应用于任意数量的值。

数学模块的第一个新添加是数学。模块功能:

# Least common multiple
math.lcm(4, 8, 5)
# 40

新字符串函数

数学模块并不是唯一一个有新功能的模块。还添加了两个新的字符串方便函数:

# Remove prefix
"someText".removeprefix("some")
# "Text"

# Remove suffix
"someText".removesuffix("Text")
# "some"

这两个函数的作用是:用string[len(prefix):]作为前缀,用string[:-len(suffix)]作为后缀。这些都是非常简单的操作,因此也是非常简单的函数,但是考虑到您可能会经常执行这些操作,所以最好有内置的函数来为您完成这些操作。



添加新评论