简单点说 就是把yield看成return 然后走到一个yield 把这个yield当做return return出去之后程序就暂停,然后下一次next的时候,再从上个yield结束后的地方开始执行
1.yield的举例,理解
def func(): for i in range(5): print('i的值为',i) res = yield i print('yield后res的值为',res) f = func() #程序走到yield停止 打印出print中的语句 以及函数的返回值 print(next(f))# 输出:i的值为 0 同时输出函数的返回值i 即 0 #从yield处执行,这里因为上一个next中将i 返回出去了,所以这里next开始的时候 res是没有值的是None #可以理解为上一个next的步骤中结尾为 yield i 然后这个next的开始就只有res = , =后面的yield已经在上一步执行完了,所以就是None print(next(f))#输出:yield后res的值为 None 然后继续循环 输出:i的值为 1 然后碰到yield停下来,打印出函数的返回值i 即1 #同上 print(next(f)) #因为按照上述的理解,yield之后 res= ,=后面的内容在上一步中执行完毕了,所以就没有值传递过来 #这里send是相当于加了这么一步,传递给 res = , =号右边的内容,传递给了yield的意思 #所以为了理解方便,send可以看做是 一个next()方法 加上传递一个 值过去 代替yield的内容 print(f.send(88888))#输出: yield后res的值为 88888 i的值为 3 打印出函数的返回值i 即3
2.send不能放在第一次,除非send(None),这样和next()的意义一样,所以还是在执行一次next()之再执行send()
def func2(): while True: yield 1 f2= func2() f2.send('zz') #报错:TypeError: can't send non-None value to a just-started generator
3.多个yield
def F(): for i in range(5, 9): for j in range(21, 29): x = yield i print('x 为',x) y = (yield j) * 100 print('y 为',y) x += y print ('>>>', x) gen = F() #这里return 的是i的值5然后停止 print(next(gen))# return 5 #继续执行,x = 66 然后走到 y = (yield j) * 100 这里停下,return 的是j的值 21 print(gen.send(66))# return j=21 #继续执行,y = 77*100=7700 打印出来,然后打印出 x+y =66+7700 然后继续循环走到 x = yield i,这里return i的值5 print(gen.send(77))# return i=5