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

  • 相关阅读:
    luogu2253 好一个一中腰鼓!
    luogu2948 滑雪课
    luogu1556 幸福的路
    luogu1900 自我数
    luogu1632 点的移动
    luogu1999 高维正方体
    树状数组模板
    杜教筛
    [比赛|考试] 9月第一周的考试
    历年NOIP真题总结
  • 原文地址:https://www.cnblogs.com/2bjiujiu/p/9145529.html
Copyright © 2011-2022 走看看