热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

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

Python3.9在经历了将近一年的试用期后,于10月5日(2020年)发布了稳定版,意味着,在下一版本发布之前,不会在做改动,童鞋们可以放心大胆地更新了。享受完惬意的十一长假后,

Python 3.9 在经历了将近一年的试用期后,于 10月5日(2020年)发布了稳定版,意味着,在下一版本发布之前,不会在做改动,童鞋们可以放心大胆地更新了。享受完惬意的十一长假后,我们快来看看新版本带来了哪些惊喜


先附上一个 16 岁印度小哥哥整理的特性图:

节能篇

这次版本最喜人的特性事节能,不仅节省电能,更重要的是节省了敲代码的次数,以及我们宝贵的时间

字典的合并与更新

毫无疑问,字典对象(Dict)是日常编程中最常用到的数据结构,从存储键值对到支持复杂算法,都依赖于字典对象,而且常用一些字段的合并、更新等操作,虽然 Python 中已经提供了字段更新的方法和字典展开操作符( ** ),但是仍然不够简洁,我理解,在你看到新版本中的更新之前,不会感觉有什么不简洁的

原来的合并:

d1 = {'a': 'A', 'b': 'B', 'c': 'C'}
d2 = {'d': 'D', 'e': 'E'}
d3 = {**d1, **d2} # 使用展开操作符,将合并结果存入 d3
print(d3) # {'a': 'A', 'b': 'B', 'c': 'C', 'd': 'D', 'e': 'E'}
d1.update(d2) # update 方法,将 d1 d2 合并,且更新 d1
print(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 # 等同于 update
print(d1) # {'a': 'A', 'b': 'B', 'c': 'C', 'd': 'D', 'e': 'E'}


  • | 操作符,除了对数值的 与 操作之外,现在还可以做字典对象的合并

  • |= 如果要用合并的结果更新前面的字典对象,在合并操作符后加赋值号就行

是不是简洁多了,不仅简洁了,而且更容易理解了

这还没完,合并赋值操作符( |= )除了字典之间的合并,还可以合并类字典对象

先看一段代码:

d1 = {'a': 'A', 'b': 'B', 'c': 'C'}
l1 = [('d', 'D'), ('e', 'E')]
d1 |= l1
print(d1) # {'a': 'A', 'b': 'B', 'c': 'C', 'd': 'D', 'e': 'E'}


  • l1 是一个列表对象,其中的元素是二维元组

  • 这里的特别之处在于二维元组对象,合并时,第一个元素被看成字典的 Key,第二个被看成字典的 Value,如果不是这样,则会报错

如果遇到这种特殊的场景,合并运算简直太方便了,你能想到有哪些类似场景吗?欢迎留言

拓扑排序

首先需要理解什么是拓扑图,简单来说就是一定空间内若干个点之间的关系,例如对于一项工作来说,包含有若干个任务,任务之间有相互依赖的关系,任务加上它们之间的关系,就构成了一个拓扑结构图

拓扑排序,就是对一个拓扑图中的点按照点之间的相互关系的一种排序

例如这样一个拓扑图

拓扑排序为

1、2、3、4、5

如果用算法生写的话,需要十行以上,而且还不包括调试时间,以及为各种适应性做的改善所花的时间

现在,排序只需要一行代码:

from graphlib import TopologicalSorter
tg = {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

实际上最核心的就是创建排序对象的代码,新特性提供了优雅的封装

说到封装,你可能猜到他的功能并不单一,确实,排序组件 TopologicalSorter 不仅能对以及定义的结果排序,还可以对动态结构排序,例如

from graphlib import TopologicalSorter
ts = TopologicalSorter()
ts.add(5, 3, 4)
ts.add(4, 2, 3)
ts.add(3, 2, 1)
ts.add(2, 1)
print(list(ts.static_order())) # [1, 2, 3, 4, 5]

也就是说,可以逐步的将依赖添加进去,在迭代处理的情况下很方便,

需要注意的是 static_order 方法只能掉用一次,再次排序的话,需要重新创建 TopologicalSorter 对象

另外,如果拓扑图结构是个循环的,排序会报 CycleError 循环依赖错误

随机字节码

之前要产生随机字节码,需要先产生随机数,然后从定义的字符序列中获取对应位置的字符,最好再转换为字节,是挺麻烦的,现在,一行代码搞定

import random
print(random.randbytes(10)) # b'\x0fzf\x17K\x00\xfb\x11LF' 随机的,每次结果可能不同

最小公倍数

之前的 Python 版本中已经实现了最大公约数的计算,虽然可以用最大公约数求得最小公倍数,不过需要写多行代码(实际上我不记得怎么推送了)

现在,一行代码搞定:

import math
math.lcm(49, 14) # 98

是不是方便多了,不信的话,和下面生算对比下:

def lcm(num1, num2):
if num1 == num2 == 0:
return 0
return num1 * num2 // math.gcd(num1, num2)
lcm(49, 14) # 98

功能篇

功能方面,Python 3.9 也做出了很多改善,下面来了解下

字符串去前缀后缀

本来字符串在 Python 中的操作已经够强大了,很难想到它会把去前后缀的功能作为更新,先看看效果吧

"three cool features in Python".removesuffix(" Python")
# three cool features in
"three cool features in Python".removeprefix("three ")
# cool features in Python
"three cool features in Python".removeprefix("Something else")
# three cool features in Python

很简单,很容易想到用其他方式实现,代码也不会多,例如用 字符串的 strip 方法:

"three cool features in Python".strip(" Python")
# ree cool features i

很明显,最终的效果并不是我们想要的, strip 会将前后遇到的字符模式一并修剪!

如果用其他方式,比如字符串查找,正则匹配等,也能实现,不过没有现成的方法方便,更重要的是,这个特性避免了自己不小心的犯错

时区支持

对我们中国来说,时区问题不大,特别是只做在国内使用的应用的话,但是如果在每个,或者其他地方,时区会是个问题,之前,可以通过将时间转换为 UTC 格式再转为其他时区的时间,现在可以方便的用 zoneinfo 模块实现了

zoneinfo 模块为标准库引入了 IANA 时区数据库

from zoneinfo import ZoneInfo
from datetime import datetime
dt = datetime(2020, 10, 1, 1, tzinfo= ZoneInfo("America/Los_Angeles"))

如代码所示,可以为本地时间设置时区,将时间转化为指定时区的时间

注意:使用 ZoneInfo 获取时区属性之前,需要安装 tzdata 模块

其他
数据类型提示

Python 本身是弱类型语言,但在一些大型项目中容易因为数据类型引入 bug,为了改善这一点,对声明了数据类型的形参,如果实参与形参类型不符,执行时会得到警告提醒,例如

def fun(input: str):
print(str)
fun(10) # 此时会得到数据类型不匹配的警告

更强悍的解析器

Python 3.9 重构了解析器,虽然在日常编程中几乎感觉不到,但这个更新确是最重要的,就行如果你感觉如履平地,必然有人在默默付出一样

Python 之前一直使用 LL(1) 解析器将源代码解析为解析树,类似于一次读取一个字符,并解释源代码而无需回溯的解析器。

新解释器是基于 PEG(parsing expression grammar) 实现的,既高效,又灵活,不过需要使用更多的内存

import()特性修改

__import__() 在之前的版本中,可能引发 ValueError 异常,按官方解释: ValueError 曾经会在相对导入超出其最高层级包时发生 (不知所云),在新的版本中,异常时会抛出 ImportError,这样更加合理

反正我没遇到过,可能是没有用过这种高级用法,就当是学习了

总结

“人生苦短,用我 Python” —— Python 不但这么说,也这么做,当我们享受惬意的双节长假时,Python 默默的优化自己,只能让我们苦短的人生,更加精彩

还等什么,赶紧升级到 Python3.9 试试吧

完整项目代码获取点这里即可


推荐阅读
  • 提升Python编程效率的十点建议
    本文介绍了提升Python编程效率的十点建议,包括不使用分号、选择合适的代码编辑器、遵循Python代码规范等。这些建议可以帮助开发者节省时间,提高编程效率。同时,还提供了相关参考链接供读者深入学习。 ... [详细]
  • 本文由编程笔记#小编为大家整理,主要介绍了logistic回归(线性和非线性)相关的知识,包括线性logistic回归的代码和数据集的分布情况。希望对你有一定的参考价值。 ... [详细]
  • 本文介绍了lua语言中闭包的特性及其在模式匹配、日期处理、编译和模块化等方面的应用。lua中的闭包是严格遵循词法定界的第一类值,函数可以作为变量自由传递,也可以作为参数传递给其他函数。这些特性使得lua语言具有极大的灵活性,为程序开发带来了便利。 ... [详细]
  • 本文分享了一个关于在C#中使用异步代码的问题,作者在控制台中运行时代码正常工作,但在Windows窗体中却无法正常工作。作者尝试搜索局域网上的主机,但在窗体中计数器没有减少。文章提供了相关的代码和解决思路。 ... [详细]
  • 开发笔记:加密&json&StringIO模块&BytesIO模块
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了加密&json&StringIO模块&BytesIO模块相关的知识,希望对你有一定的参考价值。一、加密加密 ... [详细]
  • 本文介绍了Java工具类库Hutool,该工具包封装了对文件、流、加密解密、转码、正则、线程、XML等JDK方法的封装,并提供了各种Util工具类。同时,还介绍了Hutool的组件,包括动态代理、布隆过滤、缓存、定时任务等功能。该工具包可以简化Java代码,提高开发效率。 ... [详细]
  • 本文介绍了C#中生成随机数的三种方法,并分析了其中存在的问题。首先介绍了使用Random类生成随机数的默认方法,但在高并发情况下可能会出现重复的情况。接着通过循环生成了一系列随机数,进一步突显了这个问题。文章指出,随机数生成在任何编程语言中都是必备的功能,但Random类生成的随机数并不可靠。最后,提出了需要寻找其他可靠的随机数生成方法的建议。 ... [详细]
  • [译]技术公司十年经验的职场生涯回顾
    本文是一位在技术公司工作十年的职场人士对自己职业生涯的总结回顾。她的职业规划与众不同,令人深思又有趣。其中涉及到的内容有机器学习、创新创业以及引用了女性主义者在TED演讲中的部分讲义。文章表达了对职业生涯的愿望和希望,认为人类有能力不断改善自己。 ... [详细]
  • 使用Ubuntu中的Python获取浏览器历史记录原文: ... [详细]
  • 图解redis的持久化存储机制RDB和AOF的原理和优缺点
    本文通过图解的方式介绍了redis的持久化存储机制RDB和AOF的原理和优缺点。RDB是将redis内存中的数据保存为快照文件,恢复速度较快但不支持拉链式快照。AOF是将操作日志保存到磁盘,实时存储数据但恢复速度较慢。文章详细分析了两种机制的优缺点,帮助读者更好地理解redis的持久化存储策略。 ... [详细]
  • 解决Cydia数据库错误:could not open file /var/lib/dpkg/status 的方法
    本文介绍了解决iOS系统中Cydia数据库错误的方法。通过使用苹果电脑上的Impactor工具和NewTerm软件,以及ifunbox工具和终端命令,可以解决该问题。具体步骤包括下载所需工具、连接手机到电脑、安装NewTerm、下载ifunbox并注册Dropbox账号、下载并解压lib.zip文件、将lib文件夹拖入Books文件夹中,并将lib文件夹拷贝到/var/目录下。以上方法适用于已经越狱且出现Cydia数据库错误的iPhone手机。 ... [详细]
  • 本文介绍了在rhel5.5操作系统下搭建网关+LAMP+postfix+dhcp的步骤和配置方法。通过配置dhcp自动分配ip、实现外网访问公司网站、内网收发邮件、内网上网以及SNAT转换等功能。详细介绍了安装dhcp和配置相关文件的步骤,并提供了相关的命令和配置示例。 ... [详细]
  • Spring特性实现接口多类的动态调用详解
    本文详细介绍了如何使用Spring特性实现接口多类的动态调用。通过对Spring IoC容器的基础类BeanFactory和ApplicationContext的介绍,以及getBeansOfType方法的应用,解决了在实际工作中遇到的接口及多个实现类的问题。同时,文章还提到了SPI使用的不便之处,并介绍了借助ApplicationContext实现需求的方法。阅读本文,你将了解到Spring特性的实现原理和实际应用方式。 ... [详细]
  • C# 7.0 新特性:基于Tuple的“多”返回值方法
    本文介绍了C# 7.0中基于Tuple的“多”返回值方法的使用。通过对C# 6.0及更早版本的做法进行回顾,提出了问题:如何使一个方法可返回多个返回值。然后详细介绍了C# 7.0中使用Tuple的写法,并给出了示例代码。最后,总结了该新特性的优点。 ... [详细]
  • 后台获取视图对应的字符串
    1.帮助类后台获取视图对应的字符串publicclassViewHelper{将View输出为字符串(注:不会执行对应的ac ... [详细]
author-avatar
等待的承诺灬_231
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有