Python 3.8 新功能全解


Posted in Python onJuly 25, 2019

Python 3.8是Python语言的最新版本,它适合用于编写脚本、自动化以及机器学习和Web开发等各种任务。现在Python 3.8已经进入官方的beta阶段,这个版本带来了许多语法改变、内存共享、更有效的序列化和反序列化、改进的字典和更多新功能。

Python 3.8还引入了许多性能改进。总的来说,我们即将拥有一个更快、更精确、更一致和更现代的Python。下面是Python 3.8的新功能和最重要的改变。

1、赋值表达式

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

while (line := file.readline()) != "end":  print(chunk)"end":
  print(chunk)

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

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

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

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

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

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

def pow(x, y, z=None, /):  r = x**y  if z is not None:    r %= z  return r
  r = x**y
  if z is not None:
    r %= z
  return r

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

3、支持f字符串调试

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

x = 3 print(f'{x+1}')
print(f'{x+1}')

输出4。

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

x = 3print (f'{x+1=}')
print (f'{x+1=}')

输出为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重构方面下了很大功夫。到目前为止这些工作还在不断添加,现有的成果包括:

  1. Python初始化配置(Python Initialization Configuration)有了个新的C API,可以实现对Python初始化例程更紧密的控制和更详细的反馈。如此一来,将Python运行时嵌入到其他应用程序中就会更容易,也可以以编程方式给Python程序传递启动参数。新的API还确保了所有Python配置控制都有一个单一的、一致的位置,因此以后的改变(如Python的新的UTF-8模式)也更为容易。
  2. CPython的另一个新的C API——"vectorcall"调用协议——可以实现针对Python内部方法更快的调用,而无需创建临时对象。该API依然不稳定,但已有了明显的改善。该API计划在Python 3.9中成熟。
  3. Python运行时的审计钩子为Python运行时提供了两个API,可以用来勾住事件,从而保证测试框架、日志和审计系统等外部工具能够监视到它们。

10、如何下载Python 3.8

请点击下方链接,从Python 软件基金会下载Python 3.8 beta版:

https://www.python.org/downloads/release/python-380b1/

原文:https://www.infoworld.com/article/3400640/the-best-new-features-in-python-38.html?upd=1560521475943

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
Python做简单的字符串匹配详解
Mar 21 Python
浅谈python中copy和deepcopy中的区别
Oct 23 Python
PyCharm在win10的64位系统安装实例
Nov 26 Python
python实现数据分析与建模
Jul 11 Python
python小程序实现刷票功能详解
Jul 17 Python
python2.7的flask框架之引用js&css等静态文件的实现方法
Aug 22 Python
python 命令行传入参数实现解析
Aug 30 Python
python基于K-means聚类算法的图像分割
Oct 30 Python
pytorch模型预测结果与ndarray互转方式
Jan 15 Python
Python实现在线批量美颜功能过程解析
Jun 10 Python
python删除文件、清空目录的实现方法
Sep 23 Python
python3.7 的新特性详解
Jul 25 #Python
python issubclass 和 isinstance函数
Jul 25 #Python
django的分页器Paginator 从django中导入类
Jul 25 #Python
python threading和multiprocessing模块基本用法实例分析
Jul 25 #Python
Python交互式图形编程的实现
Jul 25 #Python
python之pexpect实现自动交互的例子
Jul 25 #Python
Python使用lambda表达式对字典排序操作示例
Jul 25 #Python
You might like
php下载远程文件类(支持断点续传)
2008/11/14 PHP
PHP IN_ARRAY 函数使用注意事项
2010/07/24 PHP
php使用Smarty的相关注意事项及访问变量的几种方式
2011/12/08 PHP
php三维数组去重(示例代码)
2013/11/26 PHP
thinkphp使用literal防止模板标签被解析的方法
2014/11/22 PHP
详解PHP中websocket的使用方法
2016/09/15 PHP
PHP+百度AI OCR文字识别实现了图片的文字识别功能
2019/05/08 PHP
Gambit vs CL BO3 第三场 2.13
2021/03/10 DOTA
数理公式,也可以这么唯美
2021/03/10 无线电
游戏人文件夹程序 ver 4.03
2006/07/14 Javascript
jquery dialog键盘事件代码
2010/08/01 Javascript
jQuery点击后一组图片左右滑动的实现代码
2012/08/16 Javascript
javascript在当前窗口关闭前检测窗口是否关闭
2014/09/29 Javascript
关于JS中match() 和 exec() 返回值和属性的测试
2016/03/21 Javascript
JS结合bootstrap实现基本的增删改查功能
2016/07/22 Javascript
前端弹出对话框 js实现ajax交互
2016/09/09 Javascript
AngularJS中的DOM操作用法分析
2016/11/04 Javascript
关于jquery form表单序列化的注意事项详解
2017/08/01 jQuery
详解Angular4 路由设置相关
2017/08/26 Javascript
Webpack实战加载SVG的方法
2017/12/26 Javascript
如何获取TypeScript的声明文件.d.ts
2018/05/01 Javascript
bootstrap下拉框动态赋值方法
2018/08/10 Javascript
vue发送ajax请求详解
2018/10/09 Javascript
javascript实现动态时钟的启动和停止
2020/07/29 Javascript
Python socket.error: [Errno 98] Address already in use的原因和解决方法
2014/08/25 Python
详解python 字符串和日期之间转换 StringAndDate
2017/05/04 Python
Python图像的增强处理操作示例【基于ImageEnhance类】
2019/01/03 Python
python+selenium 鼠标事件操作方法
2019/08/24 Python
浅谈python之自动化运维(Paramiko)
2020/01/31 Python
python 实现socket服务端并发的四种方式
2020/12/14 Python
IE9下html5初试小刀
2010/09/21 HTML / CSS
《桂花雨》教学反思
2014/04/12 职场文书
停电通知范文
2015/04/16 职场文书
【HBU】数据库第四周 单表查询
2021/04/05 SQL Server
利用python实时刷新基金估值(摸鱼小工具)
2021/09/15 Python
nginx实现多geoserver服务的负载均衡
2022/05/15 Servers