值得期待的Python 3.9的新功能
即将开播: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
- # <HTTPStatus.EARLY_HINTS: 103>
- http.HTTPStatus.TOO_EARLY
- # <HTTPStatus.TOO_EARLY: 425>
- http.HTTPStatus.IM_A_TEAPOT
- # <HTTPStatus.IM_A_TEAPOT: 418>
http.HTTPStatus这些状态码会对我们处理http协议中的很多问题带来便捷。
结论
Python 3.9目前还处于Alpha阶段,下个月发布beta版本,到正式版发布已经为时不多了,希望该文章介绍能对我们版本升级更换有所帮助。
低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
鸿蒙OS,真是连哄带蒙?部分功能已经超越安卓
即将开播:4月29日,民生银行郭庆谈商业银行金融科技赋能的探索与实践 在自己的头条下面,总有一些人留言配图:鸿蒙鸿蒙,连哄带蒙!以前非常生气,都不是华为的粉丝,为什么非要让我的内容下贴图,后来看的多了,司空见惯、不以为然。平下心来,细细品味,说实话,鸿蒙系统自己看来真是连哄带蒙搞出来的。 5G时代来临,国内目前对鸿蒙的呼声越来越高,下面我们来看一下鸿蒙系统的今生前世。 一、安卓、windows,世界最强的操作系统。 电脑时代,dos成了第一代操作系统,单命令、单任务,多公司模仿:MS-DOS、PC-DOS、DR-DOS、FreeDOS、PTS-DOS、ROM-DOS、JM-OS和CC-DOS等,其中MS-DOS最为著名,看起来挺多,但万变不离其中心内含:磁盘操作系统,几个版本其实内核是一样的,只不过各家公司加入了自己的命令。 linux系统,基于UNIX开发的另一款系统,小红帽、中科、麒麟等同样源于linux的改编。 windows、mac成了当今最主流的两款电脑系统,linux虽然呼声很高,但没形成主流。 而手机系统在走进智能手机时代:期初是诺基亚的Symbian成了众多键盘码农证明...
- 下一篇
高频Redis面试题解析:Redis 事务是否具备原子性?
一、Redis 事务的实现原理 一个事务从开始到结束通常会经历以下三个阶段: 1、事务开始 客户端发送 MULTI 命令,服务器执行 MULTI 命令逻辑。 服务器会在客户端状态(redisClient)的 flags 属性打开 REDIS_MULTI 标识,将客户端从非事务状态切换到事务状态。 void multiCommand(redisClient *c) { // 不能在事务中嵌套事务 if (c->flags & REDIS_MULTI) { addReplyError(c,"MULTI calls can not be nested"); return; } // 打开事务 FLAG c->flags |= REDIS_MULTI; addReply(c,shared.ok); } 2、命令入队 接着,用户可以在客户端输入当前事务要执行的多个命令。 当客户端切换到事务状态时,服务器会根据客户端发来的命令来执行不同的操作。 如果客户端发送的命令为 EXEC、DISCARD、WATCH、MULTI 四个命令的其中一个,那么服务器立即执行这个命令。 与此相反,...
相关文章
文章评论
共有0条评论来说两句吧...