专栏首页Python中文社区Python协程演进过程

Python协程演进过程

Milestone

协程相关的关键字和方法的引入:

Python 2.2(2001年)yield

Python 2.5(2006年) .send() .throw() .close()

Python 3.3(2012年) yield from Python 3.5(2015年)async await

Duck type

在面向对象的支持上,C++采用了多重继承等一系列C++风格的东西,Java是单继承+接口,JavaScript之前是Prototype,而Python采用了多继承+duck type,并用super来安全的初始化父类。而同样喜欢宣传自己优雅的设计的Ruby也是采用的Duck Type。

什么是Duck Type

当我看到一只鸟走路像鸭子,游泳像鸭子,叫声像鸭子,那我就把它叫做鸭子。(When I see a bird that walks like a duck and swims like a duck and quacks like a duck, I call that bird a duck.)

简而言之就是,判断一个对象的类型不是看他爸爸是谁,而是他实现了什么方法。 举个例子:

>>> class Foo:

...     def __iter__(self):

...             pass

...

>>> from collections import Iterable

>>> isinstance(Foo(),Iterable)

True

在命令行里运行如上代码,会发现Foo类并没有继承任何迭代相关的父类,但却被认为是可迭代对象。正是由于Duck Type,避免了复杂的继承关系。

Iterator

解释器在判断要给对象是否是可迭代对象时,是这么做的:

 判断是否有__iter__,获取一个迭代器。

    实现了__getitem__,创建一个迭代器,按索引获取元素。

    不满足以上条件则对象不可迭代,抛出异常。

可迭代对象的UML图如下:

通过iter方法返回一个迭代器,而迭代器需要实现一个next方法和iter方法。

Generators

生成器是为了满足惰性加载而出现的,比如一些数据在使用时才生产出来,而不是初始化时就加载到内存里了。在编程中,英文含有lazy的相关专业词汇大多都是这样的作用。

在python中,一个函数中如果有yield关键词,那么这个函数就是个生成器函数,该函数调用时会立即返回一个生成器对象,而不是函数结果。而要获取该函数产出的结果,需要调用next方法(根据不同版本,有的是双下划线版本的next方法)。

协程的定义是,一个可以随时挂起并让出CPU控制权的控制流。惰性加载在协程中的意义在于,可以通过将未来的控制流放在next方法中,使得程序暂时让出CPU,在需要时通过send方法转进回来。

Summary

Python的Duck Type保证了一种灵活的面向对象实践。

在迭代器基础上实现了惰性加载的生成器,之后为了完善生成器,提供了send等方法,和原有的next方法配合,是实现协程的基础。

本文分享自微信公众号 - Python中文社区(python-china)

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2017-06-28

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • Python迭代器使用详解

    这一集的内容看起来比较绕,反反复复出现的是迭代二字。大家注意,这一节的内容很pythonic,是很有特色也非常重要的知识点。敲黑板啦!

    Python中文社区
  • Python生成器的使用技巧详解

    之前我们介绍了列表解析式,他的优点很多,比如运行速度快、编写简单,但是有一点我们不要忘了,他是一次性生成整个列表。如果整个列表非常大,这对内存也同样会造成很大压...

    Python中文社区
  • 关于生成器的那些事儿

    关于生成器的那些事儿 作者:李者璈 写在前面的话 ❈ 本来想这周继续写写 Flask 那点破事儿的,但是想了想决定换换口味,来聊聊很不容易理解但是很重要的 Py...

    Python中文社区
  • 测开之数据类型· 第4篇《迭代器、生成器》

    一种是包含iter方法的,另一种是包含getitem方法的(比如str对象就没有iter方法,但是一样能够迭代),只要对象中包含了这两种方法的任意一种,那么这个...

    清菡
  • Python基础-迭代器与生成器

    迭代器对象要求支持迭代器协议的对象,在 python 中,支持迭代器协议就是实现对象的 __iter__() 和 __next__() 方法。

    小团子
  • python yield浅析

    在python(本文python环境为python2.7)中,使用yield关键字的函数被称为generator(生成器)。故为了了解yield,必然先要了解g...

    py3study
  • python迭代和解析(3):range

    range()是一个内置函数,它返回一个数字序列,功能和Linux下的seq命令差不多。

    py3study
  • Python|认识可迭代对象与迭代器

    可迭代对象指的是定义了_ _ iter _ _ 方法的对象,调用该方法会返回一个迭代器对象。可迭代对象,例如:list列表、tuple元组、带有上述iter方法...

    算法与编程之美
  • Xcode Tips 006:自定义 Xcode 模板

    Xcode 模板是用来创建代码片段的工具。当你的工程中有很多可以标准化的代码时,比如 MVVM 架构中的各个组件,使用模板可以快速帮你生成代码,避免手动去新建 ...

    用户2932962
  • 《你不知道的JavaScript》:生成器中的生产者和迭代器

    生成器的一种有趣用法是作为一种产生值的方式。而这也是“生成器”这个名称的最初使用场景。前面说过生成器函数每次调用都会创建一个迭代器实例。这个迭代器实例有next...

    前端_AWhile

扫码关注云+社区

领取腾讯云代金券