导读: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.tgztar xzvf Python-3.9.0a5.tgzcd Python-3.9.0a5./configure --prefix=$HOME/python-3.9.0a5makemake 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 linuxType "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. 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}
上面第一个选项函数使用初始化字典,第一个参数是普通字典,第二个是Key/Value对的列表。在此种情况下,只是使用运算符解压缩到另一个字典。
dict(iterable, **kwargs)**
第二种方法是使用第二个字典来更新第一个字典。因为此字典在原位上修改,我们需要将第一个副本复制到变量中,以避免修改原始变量。
第三种方法也是最后一个。在我看来,最干净的解决方案就是使用字典解包和解压缩两个变量到一个结果。
d1 d2 d
是的,即便以上选项是完全等价的,我们现在使用新的运算符提供新的解决方案。
|
# Normal mergingd = d1 | d2# d = {'x': 5, 'y': 4, 'z': 10, 'a': 7, 'b': 9}# In-place mergingd1 |= 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 IPv6Addressaddr = IPv6Address('ff02::fa51%1')print(addr.scope_id)# "1" - interface-local IP address
但是,使用IPv6范围时应注意一件事。使用基本的Python运算符进行比较时,范围不同的两个地址不是相等的。
新的math模块
同时,在math模块中,添加或改进了许多其他功能。从对一个现有功能的改进开始:
import math# Greatest common divisormath.gcd(80, 64, 152)# 8
以前gcd计算最大公约数的函数只能应用于2个数字,程序员在处理更多数字时必须执行类似的操作,如math.gcd(80, math.gcd(64, 152))。从Python 3.9开始,可以将其应用于任意数量的值。
math模块的 第一个新增加的math.lcm功能,如下代码:
# Least common multiplemath.lcm(4, 8, 5)# 40余下的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也会同时考虑到浮点数精度。
新的字符串函数
字符串添加了两个新的便捷功能:
# 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 httphttp.HTTPStatus.EARLY_HINTS# http.HTTPStatus.TOO_EARLY# http.HTTPStatus.IM_A_TEAPOT#
没事的时候可以来看看这些状态码,我觉得可能你也不知道啥时候能用上它们。也许在生产服务器返回像 http.HTTPStatus.IM_A_TEAPOT 的状态时,可能会提高程序员的生活质量。
小结
这里只是一部分Python 3.9的更新内容,也并非所有更新与你的日常编程有关,但一部分相信会帮助你提高效率。
Python 3.9目前还处于Alpha阶段,稳定版本大概在10月份正式推出,这段时间还会有一些更改。