python3.7 的新特性详解


Posted in Python onJuly 25, 2019

Python 3.7增添了众多新的类,可用于数据处理、针对脚本编译和垃圾收集的优化以及更快的异步I/O。

Python这种语言旨在使复杂任务变得简单,最新版本Python 3.7已正式进入测试版发布阶段。Python 3.7的最终版定于2018年6月发布,但此后不会为Python 3.7版本添加任何新功能。

Python 3.7最重要的添加和改进之处包括如下:

  • 用类处理数据时减少样板代码的数据类。
  • 一处可能无法向后兼容的变更涉及处理生成器中的异常。
  • 面向解释器的“开发模式”。
  • 具有纳秒分辨率的时间对象。
  • 环境中默认使用UTF-8编码的UTF-8模式。
  • 触发调试器的一个新的内置函数。

Python数据类

众所周知,Python是处理结构化数据的一种快捷又方便的方法。Python提供了用来组织管理结构,并将常见行为与数据实例联系起来的类,但是拥有许多初始化器的类历来存在这个弊端:需要大量的样板代码为它们创建实例。比如说:

python3.7 的新特性详解

为了使这实现自动化:为类创建实例,Python 3.7引入了一个新的模块dataclasses,如PEP 557中所述(https://www.python.org/dev/peps/pep-0557/)。它提供了一个装饰器,能够以异常简单的方式重现上述行为:

python3.7 的新特性详解

因而生成的类运行起来如同普通的Python类。你还可以声明某些字段是“冻结”或不可变的,并且使创建属性的特殊方法(比如__hash__或__repr__)实现自动化(或手动覆盖)。

Python生成器异常处理

正如PEP 479中概述(https://www.python.org/dev/peps/pep-0479/),开发了一段时间的一处变更旨在让人们更容易调试Python生成器引发的StopIteration异常。以前,生成器遇到另一个问题时很容易引发StopIteration,而不是由于它用完了需要迭代的东西。这带来了一整批很难追踪的代码缺陷。

在Python 3.7中,生成器引发StopIteration异常后,StopIteration异常将被转换成RuntimeError异常,那样它不会悄悄一路影响应用程序的堆栈框架。这意味着如何处理生成器的行为方面不太敏锐的一些程序会在Python 3.7中抛出RuntimeError。而在Python 3.6中,这种行为生成一个弃用警告;在Python 3.7中,它生成一个完整的错误。

一个简易的方法是使用try/except代码段,在StopIteration传播到生成器的外面捕获它。更好的解决方案是重新考虑如何构建生成器??比如说,使用return语句来终止生成器,而不是手动引发StopIteration。想进一步了解如何在现有代码中补救这个问题,如何在新代码中防范该问题,请参阅PEP 469(https://www.python.org/dev/peps/pep-0479/)。

Python开发模式

Python解释器新的命令行开关:-X让开发人员可以为解释器设置许多低级选项。在Python 3.7中,选项-X dev启用“开发模式”,这种运行时检查机制通常对性能有重大影响,但在调试过程中对开发人员很有用。

-X dev激活的选项包括:

  • asyncio模块的调试模式。这为异步操作提供了更详细的日志记录和异常处理,而异常操作可能很难调试或推理。
  • 面向内存分配器的调试钩子。这对于编写CPython扩展件的那些人很有用。它能够实现更明确的运行时检查,了解CPython如何在内部分配内存和释放内存。
  • 启用faulthandler模块,那样发生崩溃后,traceback始终转储出去。

具有纳秒分辨率的Python时间函数

Python 3.7中一类新的时间函数返回纳秒精度的时间值。尽管Python是一种解释型语言,但是Python的核心开发人员维克多•斯廷纳(Victor Stinner)主张报告纳秒精度的时间。最主要的原因是,在处理转换其他程序(比如数据库)记录的时间值时,可以避免丢失精度。

新的时间函数使用后缀_ns。比如说,time.process_time()的纳秒版本是time.process_time_ns()。请注意,并非所有的时间函数都有对应的纳秒版本,因为其中一些时间函数并不得益于此。

Python UTF-8模式

Python一直支持UTF-8,以便轻松处理字符串和文本。但是周围环境中的语言环境(locale)有时仍是ASCII,而不是UTF-8,检测语言环境的机制并不总是很可靠。

Python 3.7添加了所谓的“UTF-8模式”,可通过-X命令行开关启用该模式,该模式假设UTF-8是环境提供的语言环境。在POSIX语言环境中,UTF-8模式默认情况下已被启用,但在其他位置默认情况下被禁用,以免破坏向后兼容。值得试一试在默认情况下开启UTF-8模式,但不应该在生产环境下启用它,除非你确信Python与周围环境的所有交互都使用UTF-8。

内置breakpoint()函数

Python随带内置的调试器,不过它也可以连入到第三方调试工具,只要它们能与Python的内部调试API进行对话。不过,Python到目前为止缺少一种从Python应用程序里面以编程方式触发调试器的标准化方法。

Python 3.7添加了breakpoint(),这个内置函数使得函数被调用时,让执行切换到调试器。相应的调试器不一定是Python自己的pdb,可以是之前被设为首选调试器的任何调试器。以前,调试器不得不手动设置,然后调用,因而使代码更冗长。而有了breakpoint(),只需一个命令即可调用调试器,并且让设置调试器和调用调试器泾渭分明。

其他新的Python 3.7功能

Python 3.7有另外的众多变更。下面是你在使用最新版本的Python时可能会遇到的其他一些功能:

面向线程本地存储支持的C-API

PEP 539中描述(https://www.python.org/dev/peps/pep-0539/),线程特定存储(TSS)API取代了老式的线程本地存储(TLS)API。如果谁定制CPython或编写使用解释器的内部API的CPython扩展件,就要明白这一点。

模块属性访问定制

你在Python程序中创建模块时,现在可以针对该模块的实例定制属性访问的行为。为此,只需要在模块里面创建一个__getattr__方法,就跟为一个类创建方法那样。这样一来,就可以对诸如请求模块里面不存在的函数或方法之类的操作进行拦截、标记或代理。

Python importlib资源

importlib模块现在可用来读取“资源”,即随Python应用程序一并交付的二进制工件,比如数据文件。这样一来,开发人员可以通过importlib的抽象来访问那些文件,所以它们存储在系统上某个地方的.zip文件中还是存储在目录中并不重要。

底层优化

现在许多单独的操作更快速了:

由于新的操作码,方法调用起来最多快20%。(除非你在编写直接处理Python操作码的代码,否则不需要担心由此带来的影响。)正则表达式中不区分大小写的匹配速度更快了,有时要快20倍。

源代码中的一些常量现在可以更高效地优化。

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

Python 相关文章推荐
在Python中操作文件之truncate()方法的使用教程
May 25 Python
Python批处理更改文件名os.rename的方法
Oct 26 Python
python实现归并排序算法
Nov 22 Python
Python3简单爬虫抓取网页图片代码实例
Aug 26 Python
浅析PEP572: 海象运算符
Oct 15 Python
opencv3/python 鼠标响应操作详解
Dec 11 Python
pytorch中tensor张量数据类型的转化方式
Dec 31 Python
Python3.7实现验证码登录方式代码实例
Feb 14 Python
关于python 跨域处理方式详解
Mar 28 Python
基于python实现可视化生成二维码工具
Jul 08 Python
Python使用sys.exc_info()方法获取异常信息
Jul 23 Python
python编程的核心知识点总结
Feb 08 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
浅析Python 引号、注释、字符串
Jul 25 #Python
You might like
利用yahoo汇率接口实现实时汇率转换示例 汇率转换器
2014/01/14 PHP
php解压文件代码实现php在线解压
2014/02/13 PHP
ThinkPHP实现非标准名称数据表快速创建模型的方法
2014/11/29 PHP
PHP实现的DES加密解密实例代码
2016/04/06 PHP
Yii2下session跨域名共存的解决方案
2017/02/04 PHP
php使用环形链表解决约瑟夫问题完整示例
2018/08/07 PHP
Laravel 手动开关 Eloquent 修改器的操作方法
2019/12/30 PHP
jquery星级插件、支持页面中多次使用
2012/03/25 Javascript
js 距离某一时间点时间是多少实现代码
2013/10/14 Javascript
利用javascript实现全部删或清空所选的操作
2014/05/27 Javascript
检测一个函数是否是JavaScript原生函数的小技巧
2015/03/13 Javascript
深入理解Javascript中的自执行匿名函数
2016/06/03 Javascript
nodejs入门教程三:调用内部和外部方法示例
2017/04/24 NodeJs
详解用node.js实现简单的反向代理
2017/06/26 Javascript
基于vue组件实现猜数字游戏
2020/05/28 Javascript
js+html获取系统当前时间
2017/11/10 Javascript
详解使用vue-admin-template的优化历程
2018/05/20 Javascript
解决Antd Table组件表头不对齐的问题
2020/10/27 Javascript
Python实现将n个点均匀地分布在球面上的方法
2015/03/12 Python
列举Python中吸引人的一些特性
2015/04/09 Python
Python格式化输出%s和%d
2018/05/07 Python
pygame游戏之旅 游戏中添加显示文字
2018/11/20 Python
图解python全局变量与局部变量相关知识
2019/11/02 Python
基于Python第三方插件实现西游记章节标注汉语拼音的方法
2020/05/22 Python
Python字符串格式化常用手段及注意事项
2020/06/17 Python
Python QTimer实现多线程及QSS应用过程解析
2020/07/11 Python
python读写数据读写csv文件(pandas用法)
2020/12/14 Python
土耳其时尚潮流在线购物网站:Trendyol
2017/10/10 全球购物
建筑装饰学院室内设计专业个人自我评价
2013/12/07 职场文书
初中三年毕业生的自我评价分享
2014/02/14 职场文书
幼儿教师工作感言
2014/02/14 职场文书
装修协议书范本
2014/04/21 职场文书
银行求职信模板
2015/03/20 职场文书
幼儿园开学通知
2015/04/24 职场文书
2015年环卫处个人工作总结
2015/07/27 职场文书
“学党章、守党纪、讲党规”学习心得体会
2016/01/14 职场文书