很多blog里面说,yield关键字和return关键字非常类似。只不过yield关键字更复杂一点。
我们都知道,return就是返回一个值,一般位于函数的末尾(或者说,作为函数结束的标志)。只要函数运行到return,那么这个函数的这次调用就结束了。
yield并不是这样。首先,yield返回的不是一个值,而是迭代器。yield返回值之后,并不代表函数的这次调用结束,函数会接着运行yield下面的代码。
def yt():
yield 0
print("yield's tail")
def rt():
return 1
print("return's tail")
if __name__ == '__main__':
for i in yt():
print(i)
print(rt())
我们无法直接打印出yield关键字返回的值,因为带有yield关键字的函数就是一个生成器。所以需要结合for循环来使用。我们可以看看输出:
0
yield's tail
1
输出如上,屏幕上打印出了"yield's tail"这串字符,证明yield结束后,函数仍然向下运行。相比而言,return的函数并没有向下运行打印"return's tail"。这就是yield关键字的一个特性。
我们可以进一步加深对yield的理解,通过以下代码:
def yield_test(n):
for i in range(n):
yield i * 2
print("\nend.")
for j in yield_test(5):
print(j, end=' ')
在这里,完全把yield生成器的功能发挥出来了。可以看看输出:
0 2 4 6 8
end.
上面的代码就等同于:
gener = [x*2 for x in range(4)]
for i in gener:
print(i, end=' ')
print('\nend.')
在大部分情况下,对yield关键字了解到上面这一层就够了。不过yield关键字还有更深层的意思:
yield函数保留每次运行的位置,就是知道自己函数没走完,而且知道自己走到哪里了,下次继续走。