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)方法,直接从赋值语句的下一个语句开始执行

posted @ 2021-07-15 12:10  pandaly  阅读(97)  评论(0编辑  收藏  举报