Python-生成器函数(协程实现底层原理)-yield

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)
  当函数调用子函数,又会创建一个栈帧
  所有的栈帧都是分配在堆的内存上,这就决定了栈帧可以独立调用者存在

posted @ 2018-06-06 15:52  梦_鱼  阅读(1274)  评论(0编辑  收藏  举报