yield , 初碰见不太可能会明白是什么意思. 从这里可以看出python的特点, 由于在背后做了大量的隐藏的工作, 才使得形式和使用上边的简洁和优美.
这是一个很不好理解的概念, 请参考下面这两篇文章:
http://www.cnblogs.com/coderzh/archive/2008/05/18/1202040.html
http://pyzh.readthedocs.io/en/latest/the-python-yield-keyword-explained.html
总结下来,
1, 包含yield的函数是generator.
2, yield是表达式, 和return类似, 但是返回的是generator.
这篇文章写的很好, 从一个"如何生成斐波那契數列" 的例子开始. 从中能学到很多东西. 仔细看看这篇文章.
https://www.ibm.com/developerworks/cn/opensource/os-cn-python-yield/
看看这个例子, 当最后两行写出优美简介的循环时, 其实背后做了很多事情, 这再次说明了python的特点. 这绝对是一门易学难精的语言.
# 利用 iterable 我们可以把 fab 函数改写为一个支持 iterable 的 class,以下是第三个版本的 Fab: # 你可以尝试一下去掉 __iter__ 这个函数的定义会发生什么 class Fab(object): def __init__(self, max): self.max = max self.n, self.a, self.b = 0, 0, 1 def __iter__(self): return self def next(self): if self.n < self.max: r = self.b self.a, self.b = self.b, self.a + self.b self.n += 1 return r raise StopIteration()
for n in Fab(8): print(n)
为了易用和简洁, 不惜创造出了yield的这个魔法, 在形式之美的背后, 是迭代器, 生成器等众多手段.
# 使用yield的方式 def fab(max): n, a, b = 0, 0, 1 while n < max: yield b # print b a, b = b, a + b n += 1
for n in fab(8): print(n)