即将开播: 4 月 29 日, 民生银行郭庆谈商业银行金融科技赋能的探索与实践
Python 3.9 beta 预计下个月就要发布了, 那么 3.9 有那些让我们期待的新功能和变更呢? 本我我们一起来说 Python 3.9 的新功能的.
安装测试版
为了能够实际探索 Python 3.9 的功能, 我们需要先下载一个 Python 3.9 alpha/beta 并安装.
- 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/chongchong/python-3.9
- make
- make install
这样 python 测试版本就会安装完成, 我们通过
/home/chongchong//python-3.9/bin/python3.9
运行此命令后, 会显示当前版本和提示消息:
新区操作符
最值得期待的新功能是新字典合并运算符:| 和 |=. 当前, 我们要对字典合并要的做法, 假设有两个字典:
- d1 = {
- "x": 1, "y": 4, "z": 10
- }
- d2 = {
- "a": 7, "b": 9, "x": 5
- }
我们希望结果为:
{'x': 5, 'y': 4, 'z': 10, 'a': 7, 'b': 9}
方法 1:
d = dict(d1, **d2)
方法 2:
- d = d1.copy()
- d.update(d2)
方法 3:
d = {**d1, **d2}
方法 1 使用 dict(iterable, **kwargs)初始化字典的函数: 第一个参数是普通字典, 第二个参数是键 / 值对列表, 在这种情况下, 是使用 ** 操作符解压缩的另一个字典.
方法 2 使用 update 功能用第二个字典中的键值对更新第一个字典. 由于该操作会修改原始字典, 因此我们需要将第一个字典复制到最终变量中, 以避免修改原始字典.
方法 3 是最简练的解决方案, 使用了字典解压缩并将两个变量 (d1 和 d2) 解压缩为结果变量 d.
三种方法都可以用, 在 python 3.9 中, 我们还可以使用新的 | 操作法来解决.
新操作符方法:
方法 4:
- d = d1 | d2
- d = {
- 'x': 5, 'y': 4, 'z': 10, 'a': 7, 'b': 9
- }
方法 5:
- d1 |= d2
- d1 = {
- 'x': 5, 'y': 4, 'z': 10, 'a': 7, 'b': 9
- }
上面的方法 4 与方法 1 的拆包 (d = {**d1, **d2}) 非常相似. 方法 5 可用于就地合并, 其中原始变量 (d1) 被第二操作数 (d2) 的值更新.
拓扑顺序
functools 模块的 TopologicalSorter 可能是值得关注的另一项新功能. 该类允许我们使用拓扑顺序对图进行排序. 拓扑顺序是这样的顺序, 其中对于 2 个节点 u 和 v 通过向边连接 uv(从 u 至 v)u 在 v 前
在引入此功能之前, 我们必须使用 Khan 的算法或深度优先搜索 (不是完全简单的算法) 手动来实现. 在 pyton 4.9 中, 如果需要对依赖作业进行排序以进行调度, 则只需执行下面的操作:
- 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 个节点处于同一图形级别时, 它们将按插入顺序返回.
除了静态的排序, 此类还支持节点的并行处理, 比如与任务队列工作.
IPv6 范围的地址
Python 3.9 中引入的另一个变化是可以指定 IPv6 地址的范围. 对不不熟悉 IPv6 的人来说, 通过 IPv6 范围, 它可以用来验证 IP 的有效性. 范围可以在 IP 地址的末尾使用 % 符号指定, 例如 "3FFE:0:0:1:200:F8FF:FE75:50DF%2". 该 IP 地址为范围内 2, 即链接本地地址.
因此, 如果需要在 Python 中处理 IPv6 地址, 现在可以这样处理:
- from ipaddress import IPv6Address
- addr = IPv6Address('ff02::fa51%1')
- print(addr.scope_id)
结果为:
"1" - 表示网卡本地地址.
但是, 使用 IPv6 范围时应注意一件事. 使用基本的 Python 运算符进行比较时, 范围不同的两个地址不相等.
新 math 功能
Python 3.9 在 math 模块中, 添加或改进了许多其他功能.
- import math
- math.gcd(80, 64, 152)
- 8
以前计算最大公因数的函数 (gcd) 只能应用于 2 个数字, 所以, 我们不得不要变相使用 math.gcd(80, math.gcd(64, 152))的方法来处理. 从 Python 3.9 开始, gcd 可以将其应用于任意数量的值.
math 模块的新增加的功能是 math.lcm:
- math.lcm(4, 8, 5)
- 40
math.lcm 用来计算其参数的最小公倍数. 与 gcd 相同, 它允许可变数量的参数.
还有两个新增加的功能是 math.nextafter 和 math.ulp:
- math.nextafter(4, 5)
- 4.000000000000001
- math.nextafter(9, 0)
- 8.999999999999998
- math.ulp(1000000000000000)
- 0.125
- math.ulp(3.14159265)
- 4.440892098500626e-16
math.nextafter(x, y)功能是非常简单: 它表示往后面浮动 x 到 y 趋势, 同时增加浮点数精度的近似(根据确实补 0 或者 9).
而 math.ulp 用作数值计算精确的测量. 最简短的解释是使用示例:
假设我们没有 64 位计算机. 相反, 我们只有 3 位数字. 用这 3 位数字可以表示 3.14 而不是 3.141. 使用 3.14, 我们可以代表的最接近的较大数字是 3.15, 这 2 个数字相差 1 个 ULP(最后一个单位), 即 0.1. 因此, math.ulp 返回值如上面示例.
新的字符串函数
Python 3.9 中, 字符串也添加了两个新的便捷功能:
removeprefix, 去掉前缀
"someText".removeprefix("some")
结果为 "Text"
removesuffix, 去掉后缀
- "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 这些状态码会对我们处理 http 协议中的很多问题带来便捷.
结论
Python 3.9 目前还处于 Alpha 阶段, 下个月发布 beta 版本, 到正式版发布已经为时不多了, 希望该文章介绍能对我们版本升级更换有所帮助.
来源: http://developer.51cto.com/art/202004/615459.htm