Python 3.8 新特性来袭

Python 3.8 新特性来袭

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

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

1.赋值表达式编程

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

while (line := file.readline()) != "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

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

3.支持f字符串调试

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

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

输出4。

在f字符串表达式末未添加=能够输出f表达式自己的值,后面是计算后的值

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

  • 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/

相关文章
相关标签/搜索