当前位置:   article > 正文

Python高阶专题:生成器以及生成器原理_pyeval_evalframeex

pyeval_evalframeex
1.Python普通函数的调用原理
def MainFunction() :  #主调函数
	MoudleFunction()
	pass
def MoudleFunction() : #被调函数
	pass
  • 1
  • 2
  • 3
  • 4
  • 5

主调函数在执行过程中,主调函数一直持有控制权,当被调函数执行的时候,主调函数将控制权权交给被调函数,在被调函数执行期间,被调函数一直享有控制权直到执行完成之后释放控制权。

标准的Python解释器是通过c语言编写的,解释器通过一个c函数PyEval_EvalFrameEx 执行Python函数。其接受一个 Python 的堆栈帧对象,并在这个堆栈帧的上下文中执行 Python 字节码

155           0 LOAD_GLOBAL              0 (MoudleFunction)
              2 CALL_FUNCTION            0
              4 POP_TOP

156           6 LOAD_CONST               0 (None)
              8 RETURN_VALUE
None
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

当 PyEval_EvalFrameEx 遇到 CALL_FUNCTION 字节码的时候,它会创建一个新的 Python 堆栈帧,递归调用 PyEval_EvalFrameEx 来执行 bar。

Python 的堆栈帧是分配在堆内存中的,Python 解释器是个普通的 C 程序,所以它的堆栈帧就是普通的堆栈。但是它操作的 Python 堆栈帧是在堆上的。

2.Python生成器原理

前面提过Python在编译生成器函数为字节码的时候遇到yield关键字,会设置标注标注该函数为生成器函数。当调用生成器函数的时候,Python解释器看到标注,但是不会运行该函数而是会创建一个生成器。调用同一生成器函数的生成器都指向同一个代码对象【图】,但是个都有自己的堆栈帧。这个堆栈帧并不存在于实际的堆栈上,它在堆内存上等待着被使用

def ModuleFunction() :
    yield 1
module = ModuleFunction()
print(type(module)) #<class 'generator'>
  • 1
  • 2
  • 3
  • 4

在这里插入图片描述

生成器可以在任何时候被任何函数恢复执行,因为它的堆栈帧实际上不在堆栈上——它在堆(内存)上。生成器在调用调用层次结构中的位置不是固定的,它不需要遵循常规函数执行时遵循的先进后出顺序。生成器被是被解放了的,它像云一样浮动。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/weixin_40725706/article/detail/199216?site
推荐阅读
相关标签
  

闽ICP备14008679号