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中使用logging模块打印log日志详解
Apr 05 Python
Python利用Nagios增加微信报警通知的功能
Feb 18 Python
windows及linux环境下永久修改pip镜像源的方法
Nov 28 Python
如何在sae中设置django,让sae的工作环境跟本地python环境一致
Nov 21 Python
详解Tensorflow数据读取有三种方式(next_batch)
Feb 01 Python
对pandas的层次索引与取值的新方法详解
Nov 06 Python
Python实现微信小程序支付功能
Jul 25 Python
解决python多行注释引发缩进错误的问题
Aug 23 Python
python科学计算之numpy——ufunc函数用法
Nov 25 Python
python下载卫星云图合成gif的方法示例
Feb 18 Python
Python读取Excel数据并生成图表过程解析
Jun 18 Python
python 操作excel表格的方法
Dec 05 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
PHP4和PHP5共存于一系统
2006/11/17 PHP
php 获取客户端的真实ip
2009/11/30 PHP
php中选择什么接口(mysql、mysqli)访问mysql
2013/02/06 PHP
ajax取消挂起请求的处理方法
2013/03/18 PHP
ThinkPHP基本的增删查改操作实例教程
2014/08/22 PHP
Ubuntu下安装PHP的mongodb扩展操作命令
2015/07/04 PHP
win10 apache配置虚拟主机后localhost无法使用的解决方法
2018/01/27 PHP
thinkPHP框架实现多表查询的方法
2018/06/14 PHP
JS 无法通过W3C验证的处理方法
2010/03/09 Javascript
关于IE浏览器以及Firefox下的javascript冒泡事件的响应层级
2010/10/14 Javascript
基于node.js的快速开发透明代理
2010/12/25 Javascript
ASP.NET jQuery 实例7 通过jQuery来获取DropDownList的Text/Value属性值
2012/02/03 Javascript
jQuery拖动图片删除示例
2013/05/10 Javascript
Jquery getJSON方法详细分析
2013/12/26 Javascript
ubuntu下安装nodejs以及升级的办法
2015/05/08 NodeJs
nodejs创建web服务器之hello world程序
2015/08/20 NodeJs
浅谈js中用$(#ID)来作为选择器的问题(id重复的时候)
2017/02/14 Javascript
jQuery滚动插件scrollable.js用法分析
2017/05/25 jQuery
nodejs 搭建简易服务器的图文教程(推荐)
2017/07/18 NodeJs
详解使用vue-cli脚手架初始化Vue项目下的项目结构
2018/03/08 Javascript
vue.js实现的全选与全不选功能示例【基于elementui】
2018/12/03 Javascript
详解vue开发中调用微信jssdk的问题
2019/04/16 Javascript
python统计多维数组的行数和列数实例
2018/06/23 Python
Python编写一个验证码图片数据标注GUI程序附源码
2019/12/09 Python
keras CNN卷积核可视化,热度图教程
2020/06/22 Python
Gweniss格温妮丝女包官网:英国纯手工制造潮流包包品牌
2018/02/07 全球购物
选购国际女性时装设计师品牌:IFCHIC(支持中文)
2018/04/12 全球购物
物业经理求职自我评价
2013/09/22 职场文书
财务会计专业毕业生自荐信
2013/10/02 职场文书
网络工程师自荐书范文
2014/04/01 职场文书
勤俭节约演讲稿
2014/05/08 职场文书
计算机网络及管理学专业求职信
2014/06/05 职场文书
机票销售员态度不好检讨书
2014/09/27 职场文书
银行党员批评与自我批评
2014/10/15 职场文书
POST提交数据常见的四种方式
2022/01/18 HTML / CSS
草系十大最强宝可梦,纸片人上榜,榜首大家最熟悉
2022/03/18 日漫