Python 3.9/3.10 版本更新前瞻:bit_count、严格压缩与字典只读视图
本文梳理了Python 3.8至3.10的开发时间线,重点解析Python 3.10的四大核心更新:引入返回二进制中1的个数的bit_count()方法;为zip函数添加strict参数以强制检查迭代器长度;赋予字典keys/values/items视图mapping属性以获取只读代理;以及移除collections模块中ABC的向后兼容别名。
Python 3.8-3.10 版本时间线概览
当前Python生态处于3.8版本的稳定期,上周已发布最新稳定版3.8.4。与此同时,Python 3.9已进入beta开发阶段,并于2020年7月3日预发布了3.9.0b4版本,第五版beta预计次日发布。首个稳定版Python 3.9预计于2020年10月推出。此外,Python 3.10的开发工作也将于2020年5月启动,其首个beta版本预计于2021年5月发布。
对于Python开发者而言,这意味着激动人心的更新周期即将到来。基于对3.8、3.9和3.10三个版本发布计划的梳理,本文旨在整理关键时间节点,帮助开发者把握即将到来的Python开发节奏。
正如阿甘所言:"生活就像一盒巧克力,你永远不知道会得到什么。"
在典型的Python开发周期中,通常会经历4到5个beta版本,且首个beta之后的版本不再引入新功能。例如,Python 3.8的beta-1于2019年6月发布,而3.9的beta-1则于2020年5月发布。尽管Python 3.10刚刚启动,但官方网站已简要介绍了部分亮点功能。
本文旨在简述上述时间轴,并基于Python官方示例预览即将发布的新版本主要特性。需要注意的是,Python 3.10可能会包含更多新功能,本文将随时间推移持续更新列表。
Python 3.10 核心新功能详解
Python 3.10 核心功能预览
bit_count:二进制中1的计数
(1) 二进制表示中1的计数
Python 3.10将引入新方法bit_count(),用于返回整数二进制表示中1的个数,且结果与整数的符号无关。该功能在信息论中有实际应用,例如计算两个等长字符串的汉明距离(即不同位置的总数,参见Wiki)。关于此功能在Python中的历史背景可查阅相关文档。
底层实现上,该方法仅调用strtype的asstr.count('1')方法。以下示例展示了这一机制:
# Positive integer
>>> num = 108
# Let's first get the binary representation of num
>>> bin(num)
'0b1101100'
>>> num.bit_count()
4
# Negative integer
>>> num = -108
>>> bin(num)
'-0b1101100'
>>> num.bit_count()
4
# Under the hood
>>> bin(num).count('1')
zip函数:引入strict严格模式
(2) 压缩操作将支持"严格"模式
zip函数将新增可选关键字参数strict。若设置strict=True,则参与压缩的迭代器长度必须相等,否则将抛出ValueError。在Python 3.9及之前版本中,压缩不等长列表时,输出长度将等于较短列表的长度。
如示例所示,在Python 3.10之前,zip()函数会忽略第一个列表中多出的'D'元素。而在Python 3.10中,这将触发ValueError。鉴于压缩相同数量项目的直观预期,此功能有助于提醒开发者检查输入数据。更多信息请参阅PEP 618。
Python 3.10之前的行为:
>>> list(zip(['A', 'B', 'C', 'D'], ['Apple', 'Ball', 'Cat']))
[('A', 'Apple'), ('B', 'Ball'), ('C', 'Cat')]
Python 3.10中的行为:
>>> list(zip(['A', 'B', 'C', 'D'], ['Apple', 'Ball', 'Cat'], strict=True))
Traceback (most recent call last): ...ValueError: zip() argument 1 is longer than argument 2
字典视图:新增mapping只读属性
(3) 字典视图的只读代理
字典的三个键方法keys()、values()和items()返回类似集合的对象,分别对应字典的键、值和项目的动态视图。对这些视图的任何修改都会反映在原始字典中。
在Python 3.10中,上述三种方法返回的视图将新增一个名为mapping的属性,用于返回该映射的只读代理。该只读代理封装了视图所引用的原始字典。以下示例说明了这一特性:
首先定义一个字典,并将其键和值分别存储到独立变量中:
>>> fruits = {'Mangos': 12, 'Figs': 100, 'Guavas': 3, 'Kiwis': 70}
>>> keys = fruits.keys()
>>> values = fruits.values()
>>> list(keys)
['Mangos', 'Figs', 'Guavas', 'Kiwis']
接着,使用del语句从字典中删除两个元素。此时打印键和值,将仅显示剩余项目,原始字典的变更已同步至视图。
>>> del fruits['Figs']
>>> del fruits['Guavas']
>>> print (list(keys), list(values))
['Mangos', 'Kiwis'] [12, 70]
通过mapping属性,您仍可获取原始字典的只读代理。
# returns a read-only proxy of the original dictionary
>>> values.mapping
mappingproxy({'Mangos': 12, 'Figs': 100, 'Guavas': 3, 'Kiwis': 70})
>>> values.mapping['Guavas']
3
向后兼容性:移除collections别名
(4) 移除部分向后兼容性
从Python 3.10开始,将移除集合模块抽象基类(ABC)的别名支持。因此,现在是忽略相应"弃用警告"并适配代码的最佳时机。
截至Python 3.9.0b4(2020年7月3日发布):
在DeprecationWarning中,直接从collections模块导入任何这些ABC已被标记为弃用。
>>> from collections import ABC_Name
DeprecationWarning: Using or importing the ABCs from 'collections' instead of from 'collections.abc' is deprecated since Python 3.3,and in 3.9 it will stop working
本文到此结束。随着Python 3.10更多发行要点的公布,我将持续补充相关内容。请持续关注,并期待Python 3.10的发布。当前及即将发布的版本时间表可在此查阅:3.8、3.9、3.10。
以上就是关于2021年Python时间轴及即将推出功能的详细介绍,更多Python时间轴相关内容请搜索本站历史文章或继续浏览后续文章,希望大家多多支持本站!
本站声明
本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。













