yield
1. 函数执行的时候,找到yield关键字,则会标记这个函数,返回生成器对象
2. Python解释器会记录最近一次函数中yield位置
3. 生成器对象也是分配在栈堆上
4. 通过yield关键字,让程序员主动控制函数的运行状态,暂停函数还继续运行
5. 生成器可以return值
def fib(): """斐波那契数列生成器""" start, end = 1, 1 hai = yield start print(hai) hai = yield end print(hai) while True: start, end = end, start + end hai = yield end print(hai) if __name__ == '__main__': func = fib() one = func.send(None) two = func.send("beimenchuixue_1") three = func.send("beimenchuixue_2") four = func.send("beimenchuixue_3") print(one, two, three, four)
函数运行原理
Python解释器是用C语言写的,会用PyEvalFramEx(c函数)去执行我们的函数,会首先创建一个栈帧(stack frame)
Python一切皆对象,栈帧对象,运行字节码对象 import dis dis.dis(funcName)
当函数调用子函数,又会创建一个栈帧
所有的栈帧都是分配在堆的内存上,这就决定了栈帧可以独立调用者存在