Python 3.8 新功能来一波(大部分人都不知道)


Posted in Python onMarch 11, 2020

Python 3.8 新功能来一波(大部分人都不知道)

Python 是一门广受好评的编程语言,每个版本的更新都会对开发社区带来一定影响。近日,Python 3.8 已进入 beta 2 版本的测试中,各项新特性已经添加完毕,最终版本预计于今年 10 月发布。

从事计算机领域工作的读者朋友对 Python 编程语言应该非常熟悉了。这是一门广受好评的动态编程语言,其灵活和语法简易的特点使得这门语言在脚本工具、数据分析、Web 后端都有广泛的应用。Python 开发社区也非常活跃,3.x 的版本迭代速度非常快。2018 年 6 月底,Python 3.7 问世,之后 Python 3.8 的开发和测试工作也已经展开。近日,Python 软件基金会公开了 3.80b2 的说明文档,向公众展示了 beta 版本的测试进展,以及 Python 3.8 版本的新特性和功能改进。

目前,Python 3.8 的 beta 测试流程正在进行中。今年 6 月初,官方发布了第一个 beta 版本——Python 3.80b1,紧接着一个月后发布了 Python 3.80b2。第二个 beta 版本发布后,Python 3.8 新特性已经添加完毕。官方目前已公布最终版本的发布时间,预计在今年的 10 月份。

文档地址:https://docs.python.org/zh-cn/3.8/whatsnew/3.8.html#summary-release-highlights

正文

Python 3.8 是Python语言的最新版本,它适合用于编写脚本、自动化以及机器学习和Web开发等各种任务。

现在Python 3.8已经进入官方的beta阶段,这个版本带来了许多语法改变、内存共享、更有效的序列化和反序列化、改进的字典和更多新功能。

Python 3.8还引入了许多性能改进。总的来说,我们即将拥有一个更快、更精确、更一致和更现代的Python。

下面是Python 3.8的新功能和最重要的改变,我总结了一些开发中用得到的,常用的特性。

1.赋值表达式

Python 3.8最明显的变化就是赋值表达式,即:=操作符。赋值表达式可以将一个值赋给一个变量,即使变量不存在也可以。它可以用在表达式中,无需作为单独的语句出现。

Python 3.8 新功能来一波(大部分人都不知道)

上例中,如果变量line不存在则会被创建,然后将file.readline()的返回值赋给它。然后检查line是否为"end"。如果不是,则读取下一行,保存在line中,然后继续测试。

赋值表达式遵循了Python一贯简洁的传统,就像列表解析式一样。其目的在于避免在特定的Python编程模式中出现一些枯燥的样板代码。例如,上述代码用一般写法需要多写两行代码。

2.仅通过位置指定的参数

仅通过位置指定的参数是函数定义中的一个新语法,可以让程序员强迫某个参数只能通过位置来指定。这样可以解决Python函数定义中哪个参数是位置参数、哪个参数是关键字参数的模糊性。

仅通过位置指定的参数可以用于如下情况:某个函数接受任意关键字参数,但也能接受一个或多个未知参数。Python的内置函数通常都是这种情况,所以允许程序员这样做,能增强Python语言的一致性。

Python文档中给出的例子如下:

Python 3.8 新功能来一波(大部分人都不知道)

符号 / 分隔了位置参数和关键字参数。在这个例子中,所有参数都是未知参数。在以前版本的Python中,z会被认为是关键字参数。但采用上述函数定义,pow(2, 10)和pow(2, 10, 5)都是正确的调用方式,而pow(2, 10, z=5)是不正确的。

3.支持f字符串调试

f字符串格式可以更方便地在同一个表达式内进行输出文本和值或变量的计算,而且效率更高。

Python 3.8 新功能来一波(大部分人都不知道)

输出4。

在f字符串表达式末未添加=可以输出f表达式本身的值,后面是计算后的值

Python 3.8 新功能来一波(大部分人都不知道)

输出为x+1=4。

4.多进程共享内存

在Python 3.8中,multiprocessing模块提供了SharedMemory类,可以在不同的Python进城之间创建共享的内存区域。

在旧版本的Python中,进程间共享数据只能通过写入文件、通过网络套接字发送,或采用Python的pickle模块进行序列化等方式。共享内存提供了进程间传递数据的更快的方式,从而使得Python的多处理器和多内核编程更有效率。

共享内存片段可以作为单纯的字节区域来分配,也可以作为不可修改的类似于列表的对象来分配,其中能保存数字类型、字符串、字节对象、None对象等一小部分Python对象。

5.Typing模块的改进

Python是动态类型语言,但可以通过typing模块添加类型提示,以便第三方工具验证Python代码。Python 3.8给typing添加了一些新元素,因此它能够支持更健壮的检查:

final修饰器和Final类型标注表明,被修饰或被标注的对象在任何时候都不应该被重写、继承,也不能被重新赋值。

Literal类型将表达式限定为特定的值或值的列表(不一定是同一个类型的值)。

TypedDict可以用来创建字典,其特定键的值被限制在一个或多个类型上。注意这些限制仅用于编译时确定值的合法性,而不能在运行时进行限制。

6.新版本的pickle协议

Python的pickle模块提供了一种序列化和反序列化Python数据结构或实例的方法,可以将字典原样保存下来供以后读取。不同版本的Python支持的pickle协议不同,而最新版本的支持范围更广、更强大、更有效的序列化。

Python 3.8引入的第5版pickle协议可以用一种新方法pickle对象,它能支持Python的缓冲区协议,如bytes、memoryviews或Numpy array等。新的pickle避免了许多在pickle这些对象时的内存复制操作。

NumPy、Apache Arrow等外部库在各自的Python绑定中支持新的pickle协议。新的pickle也可以作为Python 3.6和3.7的插件使用,可以从PyPI上安装。

7.可反转字典

Python3.6中重写了字典,其使用了PyPy项目贡献的一个新实现。除了更快、更紧凑之外,现在的字典还会继承元素的顺序——元素会按照添加的顺序排列,就像列表一样。Python 3.8还允许在字典上使用reversed()。

8.性能改进

许多内置方法和函数的速度都提高了20%~50%,因为之前许多函数都需要进行不必要的参数转换。

一个新的opcode缓存可以提高解释器中特定指令的速度。但是,目前实现了速度改进的只有LOAD_GLOBAL opcode,其速度提高了40%。以后的版本中也会进行类似的优化。

文件复制操作如shutil.copyfile()和shutil.copytree()现在使用平台特定的调用和其他优化措施,来提高操作速度。

新创建的列表现在平均比以前小了12%,这要归功于列表构造函数如果能提前知道列表长度的情况下进行的优化。

Python 3.8中向新型类(如class A(object))的类变量中的写入操作变得更快。operator.itemgetter()和collections.namedtuple()也得到了速度优化。

9.Python C API和CPython实现

Python最近的版本在CPython(C语言编写的Python的参考实现)中使用的C API重构方面下了很大功夫。到目前为止这些工作还在不断添加,现有的成果包括:

Python初始化配置(Python Initialization Configuration)有了个新的C API,可以实现对Python初始化例程更紧密的控制和更详细的反馈。如此一来,将Python运行时嵌入到其他应用程序中就会更容易,也可以以编程方式给Python程序传递启动参数。新的API还确保了所有Python配置控制都有一个单一的、一致的位置,因此以后的改变(如Python的新的UTF-8模式)也更为容易。

CPython的另一个新的C API——"vectorcall"调用协议——可以实现针对Python内部方法更快的调用,而无需创建临时对象。该API依然不稳定,但已有了明显的改善。该API计划在Python 3.9中成熟。

Python运行时的审计钩子为Python运行时提供了两个API,可以用来勾住事件,从而保证测试框架、日志和审计系统等外部工具能够监视到它们。

10.如何下载Python 3.8

从Python 软件基金会下载Python 3.8 beta版:https://www.python.org/downloads/release/python-380b1/

到此这篇关于Python 3.8 新功能来一波(大部分人都不知道)的文章就介绍到这了,更多相关Python 3.8 新功能内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Python 相关文章推荐
python实现在pickling的时候压缩的方法
Sep 25 Python
Python标准库06之子进程 (subprocess包) 详解
Dec 07 Python
Python3 socket同步通信简单示例
Jun 07 Python
详解Python的hasattr() getattr() setattr() 函数使用方法
Jul 09 Python
Python for循环中的陷阱详解
Jul 13 Python
对python指数、幂数拟合curve_fit详解
Dec 29 Python
python实现栅栏加解密 支持密钥加密
Mar 20 Python
python3实现二叉树的遍历与递归算法解析(小结)
Jul 03 Python
Python面向对象程序设计之私有变量,私有方法原理与用法分析
Mar 23 Python
浅谈Django QuerySet对象(模型.objects)的常用方法
Mar 28 Python
keras模型保存为tensorflow的二进制模型方式
May 25 Python
python反爬虫方法的优缺点分析
Nov 25 Python
屏蔽Django admin界面添加按钮的操作
Mar 11 #Python
在Mac中PyCharm配置python Anaconda环境过程图解
Mar 11 #Python
python实现飞机大战项目
Mar 11 #Python
Django 自定义权限管理系统详解(通过中间件认证)
Mar 11 #Python
Django User 模块之 AbstractUser 扩展详解
Mar 11 #Python
pygame实现飞机大战
Mar 11 #Python
Django框架models使用group by详解
Mar 11 #Python
You might like
php checkbox复选框值的获取与checkbox默认值输出方法
2010/05/15 PHP
php实现在限定区域里自动调整字体大小的类实例
2015/04/02 PHP
ZF框架实现发送邮件的方法
2015/12/03 PHP
thinkPHP中_initialize方法实例分析
2016/12/05 PHP
[原创]PHP实现SQL语句格式化功能的方法
2017/07/28 PHP
PHP设计模式之模板方法模式实例浅析
2018/12/20 PHP
实用javaScript技术-屏蔽类
2006/08/15 Javascript
JQuery验证工具类搜集整理
2013/01/16 Javascript
有关于JS辅助函数inherit()的问题
2013/04/07 Javascript
JS如何判断是否为ie浏览器的方法(包括IE10、IE11在内)
2015/12/13 Javascript
基于jquery实现动态竖向柱状条特效
2016/02/12 Javascript
jquery仿QQ登录账号选择下拉框效果
2016/03/22 Javascript
JS键盘版计算器的制作方法
2016/12/03 Javascript
JavaScript中的普通函数和箭头函数的区别和用法详解
2017/03/21 Javascript
Vue2.0表单校验组件vee-validate的使用详解
2017/05/02 Javascript
vue 将页面公用的头部组件化的方法
2017/12/18 Javascript
Vue三层嵌套路由的示例代码
2018/05/05 Javascript
微信小程序日历弹窗选择器代码实例
2019/05/09 Javascript
JS求解两数之和算法详解
2020/04/28 Javascript
vue中实现图片压缩 file文件的方法
2020/05/28 Javascript
JavaScript 实现拖拽效果组件功能(兼容移动端)
2020/11/11 Javascript
Javascript新手入门之字符串拼接与变量的应用
2020/12/03 Javascript
[02:38]DOTA2超级联赛专访Loda 认为IG世界最强
2013/05/27 DOTA
python用于url解码和中文解析的小脚本(python url decoder)
2013/08/11 Python
在python中利用KNN实现对iris进行分类的方法
2018/12/11 Python
基于wxPython的GUI实现输入对话框(2)
2019/02/27 Python
pandas条件组合筛选和按范围筛选的示例代码
2019/08/26 Python
检测tensorflow是否使用gpu进行计算的方式
2020/02/03 Python
利用SVG和CSS3来实现一个炫酷的边框动画
2015/07/22 HTML / CSS
详解webapp页面滚动卡顿的解决办法
2018/12/26 HTML / CSS
法制宣传月活动方案
2014/05/11 职场文书
2014党员民主评议个人总结
2014/09/10 职场文书
2014年幼儿园园务工作总结
2014/12/05 职场文书
社会实践活动总结
2015/02/05 职场文书
MongoDB 常用的crud操作语句
2021/06/20 MongoDB
浅谈Redis中的RDB快照
2021/06/29 Redis