yield与return类似,都可返回某值,但return返回后不再继续执行,yield返回值后会暂停在某处,下次会接着在该位置继续执行。
含有yield的函数会成为生成器函数,在循环的过程中计算所需元素,不必创建完整的list,节省了大量空间。使用next()进行下一步运算(从上一步停下的地方开始)。
def test():
print("begin")
while True:
print('循环开始')
x = yield 2022
print("赋值x:",x)
print('循环结束')
run = test() #此句没有任何输出
print('第一个next:')
print(next(run))
print('第二个next:')
print(next(run))
print('第三个next:')
print(next(run))
输出:
执行第一个next时,从函数开始处向后进行,进入while循环,遇到yield后返回了2022。
执行第二个next时,从上次停止处,也就是赋值语句的位置,继续向后进行。由于赋值语句右边的2022在上一个next已经被返回出去,此时右边没有值,所以没能进行赋值,print出来的x值为None。循环结束直接进入下一轮while循环,在yield处返回2022。
执行第三个next时,同上
x始终未被赋值