Python yield详解
文章目录
由“斐波那契”深入理解yield案例
斐波那契(Fibonacci)數列是一个非常简单的递归数列,除第一个和第二个数外,任意一个数都可由前两个数相加得到
第一个版本
def fab(max):
n, a, b = 0, 0, 1
while n < max:
print b
a, b = b, a + b
n = n + 1
执行 fab(5),我们可以得到如下输出:
>>> fab(5)
1
1
2
3
5
第二个版本
提高 fab 函数的可复用性,最好不要直接打印出数列,而是返回一个 List。
def fab(max):
n, a, b = 0, 0, 1
L = []
while n < max:
L.append(b)
a, b = b, a + b
n = n + 1
return L
可以使用如下方式打印出 fab 函数返回的 List:
>>> for n in fab(5):
... print(n)
...
1
1
2
3
5
问题的引出
稍微高级的代码的 fab 函数
通过返回 List 能满足复用性的要求,但是更有经验的开发者会指出,该函数在运行中占用的内存会随着参数 max 的增大而增大,如果要控制内存占用,最好不要用 List 来保存中间结果,而是通过 iterable 对象来迭代。
第三个版本
利用 iterable 我们可以把 fab 函数改写为一个支持 iterable 的 class
class Fab():
"""
Python3:自定义迭代器的类需要同时实现__iter__和__next__方法。
Python2:自定义迭代器的类需要同时实现__iter__和next方法。
"""
def __init__(self, max):
self.max = max
self.n, self.a, self.b = 0, 0, 1
def __iter__(self):
return self
def __next__(self):