赞
踩
def MainFunction() : #主调函数
MoudleFunction()
pass
def MoudleFunction() : #被调函数
pass
主调函数在执行过程中,主调函数一直持有控制权,当被调函数执行的时候,主调函数将控制权权交给被调函数,在被调函数执行期间,被调函数一直享有控制权直到执行完成之后释放控制权。
标准的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
当 PyEval_EvalFrameEx 遇到 CALL_FUNCTION 字节码的时候,它会创建一个新的 Python 堆栈帧,递归调用 PyEval_EvalFrameEx 来执行 bar。
Python 的堆栈帧是分配在堆内存中的,Python 解释器是个普通的 C 程序,所以它的堆栈帧就是普通的堆栈。但是它操作的 Python 堆栈帧是在堆上的。
前面提过Python在编译生成器函数为字节码的时候遇到yield关键字,会设置标注标注该函数为生成器函数。当调用生成器函数的时候,Python解释器看到标注,但是不会运行该函数而是会创建一个生成器。调用同一生成器函数的生成器都指向同一个代码对象【图】,但是个都有自己的堆栈帧。这个堆栈帧并不存在于实际的堆栈上,它在堆内存上等待着被使用
def ModuleFunction() :
yield 1
module = ModuleFunction()
print(type(module)) #<class 'generator'>
生成器可以在任何时候被任何函数恢复执行,因为它的堆栈帧实际上不在堆栈上——它在堆(内存)上。生成器在调用调用层次结构中的位置不是固定的,它不需要遵循常规函数执行时遵循的先进后出顺序。生成器被是被解放了的,它像云一样浮动。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。