yield理解

简单点说 就是把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
原文地址:https://www.cnblogs.com/alantammm/p/13646336.html