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中的MySQLdb模块添加超时功能的教程
May 05 Python
分享Python文本生成二维码实例
Jan 06 Python
浅谈django三种缓存模式的使用及注意点
Sep 30 Python
Pycharm代码无法复制,无法选中删除,无法编辑的解决方法
Oct 22 Python
Python实现将Excel转换成为image的方法
Oct 23 Python
python实现的按要求生成手机号功能示例
Oct 08 Python
tensorflow-gpu安装的常见问题及解决方案
Jan 20 Python
python词云库wordCloud使用方法详解(解决中文乱码)
Feb 17 Python
Keras官方中文文档:性能评估Metrices详解
Jun 15 Python
Python压缩模块zipfile实现原理及用法解析
Aug 14 Python
关于python tushare Tkinter构建的简单股票可视化查询系统(Beta v0.13)
Oct 19 Python
Python监听剪切板实现方法代码实例
Nov 11 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
如何对PHP程序中的常见漏洞进行攻击(上)
2006/10/09 PHP
一个简单的PHP入门源程序
2006/10/09 PHP
php获取mysql字段名称和其它信息的例子
2014/04/14 PHP
使用JavaScript创建新样式表和新样式规则
2016/06/14 PHP
[原创]解决wincache不支持64位PHP5.5/5.6的问题(提供64位wincache下载)
2016/06/22 PHP
基于yaf框架和uploadify插件,做的一个导入excel文件,查看并保存数据的功能
2017/01/24 PHP
javascript淡入淡出效果的实现思路
2012/03/31 Javascript
js制作的鼠标悬浮时产生的下拉框效果
2012/10/27 Javascript
JSuggest自动匹配下拉框使用方法(示例代码)
2013/12/27 Javascript
JavaScript动态绑定详解
2017/09/14 Javascript
使用electron实现百度网盘悬浮窗口功能的示例代码
2018/10/24 Javascript
Nodejs实现的操作MongoDB数据库功能完整示例
2019/02/02 NodeJs
pyv8学习python和javascript变量进行交互
2013/12/04 Python
python根据出生年份简单计算生肖的方法
2015/03/27 Python
简单的连接MySQL与Python的Bottle框架的方法
2015/04/30 Python
Django学习笔记之ORM基础教程
2018/03/27 Python
python之信息加密题目详解
2019/06/26 Python
python调用pyaudio使用麦克风录制wav声音文件的教程
2019/06/26 Python
pycharm设置当前工作目录的操作(working directory)
2020/02/14 Python
python怎么删除缓存文件
2020/07/19 Python
python实现xml转json文件的示例代码
2020/12/30 Python
深入浅析HTML5中的article和section的区别
2018/05/15 HTML / CSS
英国翻新电子产品购物网站:Tech Trade
2017/12/25 全球购物
WebSphere 应用服务器都支持哪些认证
2013/12/26 面试题
给女朋友的道歉信
2014/01/10 职场文书
早读迟到检讨书
2014/01/24 职场文书
爱祖国演讲稿
2014/05/04 职场文书
2014年前台个人工作总结
2014/11/14 职场文书
2014年员工工作总结范文
2014/11/18 职场文书
打架检讨书范文
2015/01/27 职场文书
餐饮食品安全责任书
2015/01/29 职场文书
酒店仓管员岗位职责
2015/04/01 职场文书
学生乘坐校车安全责任书
2015/05/11 职场文书
2015年法律事务部工作总结
2015/07/27 职场文书
weblogic服务建立数据源连接测试更新mysql驱动包的问题及解决方法
2022/01/22 MySQL
Spring Boot 的创建和运行示例代码详解
2022/07/23 Java/Android