社区所有版块导航
Python
python开源   Django   Python   DjangoApp   pycharm  
DATA
docker   Elasticsearch  
aigc
aigc   chatgpt  
WEB开发
linux   MongoDB   Redis   DATABASE   NGINX   其他Web框架   web工具   zookeeper   tornado   NoSql   Bootstrap   js   peewee   Git   bottle   IE   MQ   Jquery  
机器学习
机器学习算法  
Python88.com
反馈   公告   社区推广  
产品
短视频  
印度
印度  
Py学习  »  Python

Python协程演进过程

Python中文社区 • 7 年前 • 948 次点击  

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.)

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

  1. >>> class Foo:

  2. ...     def __iter__(self):

  3. ...             pass

  4. ...

  5. >>> from collections import Iterable

  6. >>> isinstance(Foo(),Iterable)

  7. True

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

Iterator

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

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

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

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

可迭代对象的UML图如下:

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

Generators

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

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

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

Summary

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

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





长按扫描关注Python中文社区,

获取更多技术干货!

    


Python 中 文 社 区

Python中文开发者的精神家园

合作、投稿请联系微信:

pythonpost

— 人生苦短,我用Python —
1MEwnaxmMz7BPTYzBdj751DPyHWikNoeFS





本文为作者原创作品,未经作者授权同意禁止转载



区块链技术演进史


区块链技术名词解释大全


今天看啥 - 高品质阅读平台
本文地址:http://www.jintiankansha.me/t/nXa4mUvRZS
Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/2472
 
948 次点击