导读:Python 3.9来了,有哪些新特性值得学,值得用?
Python 2.9(5.10.2020)已经发布了一段时间,最后一个Alpha版(3.9.0a5)近期发布了测试版。开发者应该看新版有哪些新功能,改进和修复。
安装测试版
本节尝鲜安装Python 3.9,但不要破坏稳定版本的Python解释。命令如下:
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.
新的字典运算符
最明显的新特性大概是新的字典合并运算符 _ 或 .
从现在开始,你有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}
上面第一个选项函数使用初始化字典,第一个参数是普通字典,第二个是Key/Value对的列表。在此种情况下,只是使用运算符解压缩到另一个字典。
dict(iterable, **kwargs)**
第二种方法是使用第二个字典来更新第一个字典。因为此字典在原位上修改,我们需要将第一个副本复制到变量中,以避免修改原始变量。
第三种方法也是最后一个。在我看来,最干净的解决方案就是使用字典解包和解压缩两个变量到一个结果。
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的值立即更新。
IPv6范围地址
Python 3.9中引入的另一个更改是可以指定IPv6地址的范围。如果您不熟悉IPv6范围,它们将用于指定相应IP地址在Internet的哪个部分有效。范围可以在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" - interface-local IP address
但是,使用IPv6范围时应注意一件事。使用基本的Python运算符进行比较时,范围不同的两个地址不是相等的。
新的math模块
同时,在math模块中,添加或改进了许多其他功能。从对一个现有功能的改进开始:
import math
# Greatest common divisor
math.gcd(80, 64, 152)
# 8
以前gcd计算最大公约数的函数只能应用于2个数字,程序员在处理更多数字时必须执行类似的操作,如math.gcd(80, math.gcd(64, 152))。从Python 3.9开始,可以将其应用于任意数量的值。
math模块的 第一个新增加的math.lcm功能,如下代码:
# Least common multiple
math.lcm(4, 8, 5)
# 40
余下的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也会同时考虑到浮点数精度。
新的字符串函数
字符串添加了两个新的便捷功能:
# Remove prefix
"someText".removeprefix("some")
# "Text"
# Remove suffix
"someText".removesuffix("Text")
# "some"
当然你仍然可以使用string[len(prefix):]前缀和string[:-len(suffix)]后缀来实现该功能。但如果经常执行该操作,新的函数就该派上用场了。
小奖励
最后送大家一个Python 3.9甜点。实际上,它已经将HTTP状态码添加到了http.HTTPStatus上了。如下代码:
import http
http.HTTPStatus.EARLY_HINTS
# <HTTPStatus.EARLY_HINTS: 103>
http.HTTPStatus.TOO_EARLY
# <HTTPStatus.TOO_EARLY: 425>
http.HTTPStatus.IM_A_TEAPOT
# <HTTPStatus.IM_A_TEAPOT: 418>
没事的时候可以来看看这些状态码,我觉得可能你也不知道啥时候能用上它们。也许在生产服务器返回像 http.HTTPStatus.IM_A_TEAPOT 的状态时,可能会提高程序员的生活质量。
小结
这里只是一部分Python 3.9的更新内容,也并非所有更新与你的日常编程有关,但一部分相信会帮助你提高效率。
Python 3.9目前还处于Alpha阶段,稳定版本大概在10月份正式推出,这段时间还会有一些更改。