作用类似于return,只不过yield返回的是一个迭代器(generator),可以配合特殊的方法:next()、send()函数使用。
1.调用:含有yield特殊字的函数,被调用之后返回的是一个迭代器
def foo():
i = 1
print("starting...")
while True:
yield i+1
i+=1
print(i)
g = foo()
print(g)
》》》
<generator object foo at 0x0000020430EEC8E0>
可以看到,不会执行foo函数的内容,g为一个generator。
2.next(g) 当调用next()函数时,会执行到yield。 nex(g)就是yield返回的东西。
def foo():
i = 1
print("starting...")
while True:
yield i+1
i+=1
print(i)
g = foo()
print(g)
print(next(g))
print("*"*20)
print(next(g))
》》》
<generator object foo at 0x0000028838AFC8E0>
starting...
2
********************
2
3
再执行next()函数时,会接着上一次next执行完yield的地方继续向下执行
3.send()函数,赋值。否则 yield是不会进行赋值操作的。 同时send()方法包含了next()方法,执行send()会自动执行next()
def foo():
i = 1
print("starting...")
while True:
res = yield i+1
i+=1
print(i)
print('res:',res)
g = foo()
print(g)
print(next(g))
print("*"*20)
print(next(g))
》》》
<generator object foo at 0x000001CB255BC8E0>
starting...
2
********************
2
res: None
3
由上面可以看到,虽然有 res = yield i+1,这个貌似赋值的操作,但是yield并不会有进行赋值
def foo():
i = 1
print("starting...")
while True:
res = yield i+1
i+=1
print(i)
print('res:',res)
g = foo()
print(g)
print(next(g))
print("*"*20)
print(g.send(7))
》》》
<generator object foo at 0x00000187FDD3C8E0>
starting...
2
********************
2
res: 7
3
上段代码可见,在第一次执行next()函数之后,迭代器会停留在yield处。
在执行g.send(7)时,会接着在yield处继续执行,进行赋值。然后自动再执行next()函数,即运行到下一个yield结束。
4.yield 和 return 的区别
从上面可以看出,yield操作之后,后续是可以继续有代码的,下一次next()的时候,后续的代码也是会被执行的。
而return不同,函数只要执行了return,这个函数就结束了,return后面的任何代码是不会被执行的。并且 return没有标记的作用,不能配合send() 进行赋值。