python中yield的用法--浅显易懂

yield这个关键词相信大部分初学者第一次都很难弄懂,我也是经过多次的学习忘记,再学习,还有查阅其他人的分享,最后终于搞清楚啦。如果大家想更清晰地了解,建议大家用单步调试调试以下代码:

def consumer(name):
    print("%s 准备吃包子啦!" %name)
    while True:
       baozi = yield "return返回的值..."
       print("包子[%s]来了,被[%s]吃了!" %(baozi,name))

c = consumer("小华")
print('-------华丽分割线1-------------')
print(c.__next__())
print('-------华丽分割线2-------------')
print(c.__next__())
print('-------华丽分割线3-------------')
c.send("韭菜包")


输出结果:

-------华丽分割线1-------------
小华 准备吃包子啦!
return返回的值...
-------华丽分割线2-------------
包子[None]来了,被[小华]吃了!
return返回的值...
-------华丽分割线3-------------
包子[韭菜包]来了,被[小华]吃了!

下面我们来分析程序的运行过程:
1.程序开始执行以后,因为consumer函数中有yield关键字,所以consumer函数并不会真的执行,而是先得到一个生成器generator(相当于一个对象),

2.直到调用__next__()方法,consumer函数正式开始执行,先执行consumer函数中的print方法,然后进入while循环,

3.程序遇到yield关键字,然后把yield想想成return,return了一个值之后,程序停止,并没有执行赋值给baozi操作,此时__next__()语句执行完成,所以输出的前两行(第一个是while上面的print的结果,第二个是return出的结果)是执行print(c.__next__())的结果,
4.又开始执行下面的print(c.__next__()),这个时候和上面那个差不多,不过不同的是,这个时候是从刚才那个上次程序停止的地方开始执行的,也就是要执行baozi的赋值操作,这时候要注意,这个时候赋值操作的右边是没有值的(因为刚才那个是return出去了,并没有给赋值操作的左边传参数),所以这个时候baozi赋值是None,所以接着下面的输出就是None,

5.程序会继续在while里执行,又一次碰到yield,这个时候同样return,

6.程序执行g.send("韭菜包"),程序会从yield关键字那一行继续向下运行,send会把"韭菜包"这个值赋值给baozi变量,执行print("包子[%s]来了,被[%s]吃了!" %(baozi,name))。

猜你喜欢

转载自blog.csdn.net/jiaming917/article/details/86654665