Python yield与实现

558 查看

Python yield与实现

yield的功能类似于return,但是不同之处在于它返回的是生成器

生成器

生成器是通过一个或多个yield表达式构成的函数,每一个生成器都是一个迭代器(但是迭代器不一定是生成器)。

如果一个函数包含yield关键字,这个函数就会变为一个生成器。

生成器并不会一次返回所有结果,而是每次遇到yield关键字后返回相应结果,并保留函数当前的运行状态,等待下一次的调用。

由于生成器也是一个迭代器,那么它就应该支持next方法来获取下一个值。

基本操作

除了next函数,生成器还支持send函数。该函数可以向生成器传递参数。

应用

最经典的例子,生成无限序列。

常规的解决方法是,生成一个满足要求的很大的列表,这个列表需要保存在内存中,很明显内存限制了这个问题。

如果使用生成器就不需要返回整个列表,每次都只是返回一个数据,避免了内存的限制问题。

生成器源码分析

生成器的源码在Objects/genobject.c

调用栈

在解释生成器之前,需要讲解一下Python虚拟机的调用原理。

Python虚拟机有一个栈帧的调用栈,其中栈帧的是PyFrameObject,位于Include/frameobject.h

除了next函数,生成器还支持send函数。该函数可以向生成器传递参数。

应用

最经典的例子,生成无限序列。

常规的解决方法是,生成一个满足要求的很大的列表,这个列表需要保存在内存中,很明显内存限制了这个问题。

如果使用生成器就不需要返回整个列表,每次都只是返回一个数据,避免了内存的限制问题。

生成器源码分析

生成器的源码在Objects/genobject.c

调用栈

在解释生成器之前,需要讲解一下Python虚拟机的调用原理。

Python虚拟机有一个栈帧的调用栈,其中栈帧的是PyFrameObject,位于Include/frameobject.h