zoukankan      html  css  js  c++  java
  • yield生成器理解

    第一步:执行第一个next(gen),执行到语句value = (yield 1)后,执行被挂起,直接返回yield关键字后面表达式的值即为1,所以next(gen)结果为1;注意此时并没有执行value的赋值


    第二步:执行第二个next(gen)时,从上一个挂起位置的下一行开始,也就是从 print("the value is:"+str(value))这句开始,因为上一个挂起时并没有执行赋值语句,所以value的值是None, 执行到 val2 = (yield 4) 后,执行再被挂起,直接返回yield关键字后面表达式的值即为4,所以第二个next(gen)结果为4;注意此时也没有执行val2的赋值


    第三步:调用send()方法时,python首先恢复MyGenerator方法的运行环境。同时将表达式(yield 4)的返回值定义为send方法参数的值即为2。这样,接下来val2 = (yield 4)这一赋值语句会将val2的值置为2。继续运行会遇到val3 = (yield 6)语句,然后执行被挂起,同时返回yield关键字后面表达式的值即为6,所以gen.send(2))的执行结果为6;注意此时并没有执行val3 的赋值。


    第四步:执行第三个next(gen)时,从上一个挂起位置的下一行开始,也就是从 print("the val3 is:" + str(val3))这句开始,因为上一个挂起时并没有执行赋值语句,所以val3的值是None。

    send():send方法先将上一次被挂起的yield语句的返回值清空,并赋值为send方法里面的参数值,如果send()方法没有传参,默认参数值为None,然后执行的是赋值语句。
    调用send()方法与next(gen)方法的区别是,如果上次挂起的语句是个赋值语句,send()先执行赋值,再执行下面的语句,而next(gen)方法,直接从赋值语句的下一个语句开始执行

  • 相关阅读:
    获得ip地理信息的几种方法
    设置 phoneGap/Cordova 3.4 应用程序启动动画闪屏 SplashScreen
    backbone实例01
    即使世界明天毁灭,我今天也要种下葡萄树
    真言真语
    美文美句
    25个实用的jQuery技巧和解决方案
    突袭HTML5之WebGL 3D概述
    敏捷开发之Scrum扫盲篇
    javascript中undefined和null的区别详解
  • 原文地址:https://www.cnblogs.com/pandaly/p/15014915.html
Copyright © 2011-2022 走看看