你在享受十一长假时,Python 已悄悄地变了


你在享受十一长假时,Python 已悄悄地变了文章插图
Python 3.9 在经历了将近一年的试用期后 , 于 10月5日(2020年)发布了稳定版 , 意味着 , 在下一版本发布之前 , 不会在做改动 , 童鞋们可以放心大胆地更新了 。 享受完惬意的十一长假后 , 我们快来看看新版本带来了哪些惊喜
先附上一个 16 岁印度小哥哥整理的特性图:
你在享受十一长假时,Python 已悄悄地变了文章插图
节能篇这次版本最喜人的特性事节能 , 不仅节省电能 , 更重要的是节省了敲代码的次数 , 以及我们宝贵的时间
字典的合并与更新毫无疑问 , 字典对象(Dict)是日常编程中最常用到的数据结构 , 从存储键值对到支持复杂算法 , 都依赖于字典对象 , 而且常用一些字段的合并、更新等操作 , 虽然 Python 中已经提供了字段更新的方法和字典展开操作符( ** ) , 但是仍然不够简洁 , 我理解 , 在你看到新版本中的更新之前 , 不会感觉有什么不简洁的
原来的合并:
d1 = {'a': 'A', 'b': 'B', 'c': 'C'}d2 = {'d': 'D', 'e': 'E'}d3 = {**d1, **d2}# 使用展开操作符 , 将合并结果存入 d3print(d3)# {'a': 'A', 'b': 'B', 'c': 'C', 'd': 'D', 'e': 'E'}d1.update(d2)# update 方法 , 将 d1 d2 合并 , 且更新 d1print(d1)# {'a': 'A', 'b': 'B', 'c': 'C', 'd': 'D', 'e': 'E'}现在的合并:
d1 = {'a': 'A', 'b': 'B', 'c': 'C'}d2 = {'d': 'D', 'e': 'E'}d3 = d1 | d2# 效果等同于展开操作符print(d3)# {'a': 'A', 'b': 'B', 'c': 'C', 'd': 'D', 'e': 'E'}d1 |= d2# 等同于 updateprint(d1)# {'a': 'A', 'b': 'B', 'c': 'C', 'd': 'D', 'e': 'E'}

  • | 操作符 , 除了对数值的 与 操作之外 , 现在还可以做字典对象的合并
  • |= 如果要用合并的结果更新前面的字典对象 , 在合并操作符后加赋值号就行
是不是简洁多了 , 不仅简洁了 , 而且更容易理解了
这还没完 , 合并赋值操作符( |= )除了字典之间的合并 , 还可以合并类字典对象
先看一段代码:
d1 = {'a': 'A', 'b': 'B', 'c': 'C'}l1 = [('d', 'D'), ('e', 'E')]d1 |= l1print(d1)# {'a': 'A', 'b': 'B', 'c': 'C', 'd': 'D', 'e': 'E'}
  • l1 是一个列表对象 , 其中的元素是二维元组
  • 这里的特别之处在于二维元组对象 , 合并时 , 第一个元素被看成字典的 Key , 第二个被看成字典的 Value , 如果不是这样 , 则会报错
如果遇到这种特殊的场景 , 合并运算简直太方便了 , 你能想到有哪些类似场景吗?欢迎留言
拓扑排序首先需要理解什么是拓扑图 , 简单来说就是一定空间内若干个点之间的关系 , 例如对于一项工作来说 , 包含有若干个任务 , 任务之间有相互依赖的关系 , 任务加上它们之间的关系 , 就构成了一个拓扑结构图
拓扑排序 , 就是对一个拓扑图中的点按照点之间的相互关系的一种排序
例如这样一个拓扑图
你在享受十一长假时,Python 已悄悄地变了文章插图
拓扑排序为
1、2、3、4、5
如果用算法生写的话 , 需要十行以上 , 而且还不包括调试时间 , 以及为各种适应性做的改善所花的时间
现在 , 排序只需要一行代码:
from graphlib import TopologicalSortertg = {5: {3, 4}, 4: {2, 3}, 3: {2, 1}, 2: {1}}ts = TopologicalSorter(tg)print(list(ts.static_order())) # [1, 2, 3, 4, 5]static_order实际上最核心的就是创建排序对象的代码 , 新特性提供了优雅的封装