Python 3.9 值得关注的更新点
Python更新不停。
2020年8月19日,Python 最新释放bate版本 3.9.0rc1,呼之欲出的新版,提前来看看吧~
新功能
- 新增字典合并方法
- 新增字符串删除操作内置函数
- 类型提示与定义
- 时区对象设置
- 新的 Python 解析器
新增字典合并方法
再一次优雅。在3.8版本之前,字典合并需要使用 zip()
或其他的方法进行,而现在只需要使用 |
即可快速完成预期,需要注意的是,当两个字典有相同的键时,对应的值为最后一次的赋值:
>>> d = {'spam': 1, 'eggs': 2, 'cheese': 3}
>>> e = {'cheese': 'cheddar', 'aardvark': 'Ethel'}
>>> d | e
{'spam': 1, 'eggs': 2, 'cheese': 'cheddar', 'aardvark': 'Ethel'}
>>> e | d
{'aardvark': 'Ethel', 'spam': 1, 'eggs': 2, 'cheese': 3}
若要直接更新字典,那么使用 |=
即可
>>> d |= e
>>> d
{'spam': 1, 'eggs': 2, 'cheese': 'cheddar', 'aardvark': 'Ethel'}
逻辑有点类似上一期魔法方法中我们说道的 +=
,即a+=b
等价于 a =a+b
。
新增字符串操作内置函数
removeprefix()
和 removesuffix():
虽然更新的大,但是这个的优势在于:
- 不依赖统计字符串长度
- 不需要调用
len
及str.replace()
函数 - 与传统的字符串切片方法相比,这些方法为代码的可读性提供了更高级别的API。
举几个案例:
# Current
if funcname.startswith("context."):
self.funcname = funcname.replace("context.", "")
self.contextfunc = True
else:
self.funcname = funcname
self.contextfunc = False
# Improved
if funcname.startswith("context."):
self.funcname = funcname.removeprefix("context.")
self.contextfunc = True
else:
self.funcname = funcname
self.contextfunc = False
又比如:
# Current
if name.endswith(('Mixin', 'Tests')):
return name[:-5]
elif name.endswith('Test'):
return name[:-4]
else:
return name
# Improved
return (name.removesuffix('Mixin')
.removesuffix('Tests')
.removesuffix('Test'))
上述可以直接理解为,在正序和倒序字符串排列中,删除部分已知的字符串内容,而不需要使用符串切片。
类型提示
现在,在3.5的基础上,python的编辑器能够快速响应指定并且理解我们的意图。
上图我们将 sum_dict
函数的参数定义为字典类型,将其返回值定义为 int
类型。test 的定义时也指定了类型。
时区对象
zoneinfo
模块有助于从 IANA
时区数据库中获得对应的信息,用于优化填充时区对象,简单使用如下:
>>> print(datetime(2020, 2, 22, 12, 0).astimezone())
2020-02-22 12:00:00-05:00
>>> print(datetime(2020, 2, 22, 12, 0).astimezone()
... .strftime("%Y-%m-%d %H:%M:%S %Z"))
2020-02-22 12:00:00 EST
>>> print(datetime(2020, 2, 22, 12, 0).astimezone(timezone.utc))
2020-02-22 17:00:00+00:00
新的解析器
Python 目前主要使用一种基于 LL (1)的语法,而这种语法可以通过 LL (1)解析器进行解析——该解析器从上到下、从左到右地解析代码,只需要从词法分析器中取出一个 token 就可以正确地解析下去。
这个本应该是最大的修改点,但由于不是特别了解底层的工作原理,这里就贴一下官方的overview,详情可以通过查看原文了解。
This PEP proposes replacing the current LL(1)-based parser of CPython with a new PEG-based parser. This new parser would allow the elimination of multiple "hacks" that exist in the current grammar to circumvent the LL(1)-limitation. It would substantially reduce the maintenance costs in some areas related to the compiling pipeline such as the grammar, the parser and the AST generation. The new PEG parser will also lift the LL(1) restriction on the current Python grammar.
在更新日志中还提及到一些语言特性修改、模块的删减、弃用和API的变化,有兴趣小伙伴可以的查看官方更新日志可见:
https://docs.python.org/3.9/whatsnew/changelog.html#changelog
Python3.9版本都要来啦,点击Python3专辑,你将获得更多资料,我们下期见。
参考资料
Python 3.9 beta2 版本发布了,看看这 7 个新的 PEP 都是什么?
Python 3.9 正式版要来了,我还在3.6的路上!
What’s New In Python 3.9
https://docs.python.org/3.9/whatsnew/3.9.html#what-s-new-in-python-3-9
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- Cypress系列(44)- 命令行运行 Cypress
- Cypress系列(45)- cypress-skip-and-only-ui 插件详解
- 多线程基础(五):java对象的MarkWord及synchronized锁升级过程
- 【每日一题】45. Jump Game II
- 「Elasticsearch + Lucene」搜索引擎的架构、倒排索引和搜索过程
- 查看 MAC JDK默认安装路径 JAVA路径 的shell 命令
- Gradle 命令行介紹和安裝教程
- Spring工厂创建复杂对象
- Nginx反向代理配置去除前缀
- 深入浅出java虚拟机
- Maven resources 分环境
- JetBrains Upsource(上源) 研究
- Spring JPA 拓展
- python自学成才之路 死锁的解决方案
- C++核心准则T.40: 使用函数对象向算法传递操作