yield是2.5版本之后才受重视的一个功能, 是生成器(Generator)的一个部分. 如果一个函数中使用了yield, 那么这个函数就可以看作一个生成器函数.
对于一个生成器函数, 可以通过调用其next()来获取一个一个的返回值.
具体代码例子:
def fab(max):
n, a, b = 0, 0, 1
while n < max:
yield b
a, b = b, a+b
n += 1
对于函数fab, 直接调用是不会出现任何反应的, 必须调用next()来使生成器工作, 当无内容可迭代时, 则抛出StopIteration异常.
func = fab(5)
func.next()
>>>
1
func.next()
>>>
1
func.next()
>>>
2
func.next()
>>>
3
func.next()
>>>
5
func.next()
>>>
Traceback (most recent call last):
File "<stdin>" line 1, in <module>
StopIteration
for in, 对于迭代器已经有支持, 所以我们可以直接像下面这样使用一个迭代器函数:
for n in fab(5)
print n
>>>
1
2
3
4
5
使用迭代器函数的好处是代码更加简介, 同时每次返回一个结果, 符合懒惰计算的思想, 同时不会由于一次生成过多内容同时返回, 而浪费内存.