引入
斐波那契数列的生成(来自参考1,文中使用的python2.7,此处使用的是python3,略有不同)
def fab(max):
n, a, b = 0, 0, 1
while n < max:
print(b)
a, b = b, a + b
n = n + 1
然后调用函数会print我们的结果,但是结果我们不好进行利用。
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
调用函数通过for循环可以一一获取结果,但是当n过大时,运行时所占用的内存也会越大
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 = self.n + 1
return r
raise StopIteration()
(不了解__iter__(),__next()可以移步至参考2)
Fab 类通过 next() 不断返回数列的下一个数,内存占用始终为常数。
当然已经满足我们的需求了,但是我们可以通过yield获取更简单通俗的版本
def fab(max):
n, a, b = 0, 0, 1
while n < max:
yield b
a, b = b, a + b
n = n + 1
此处代码与第一段代码相比,把print换成了yield,此时fab()函数变成了一个 生成器,yield这是返回一个 可迭代 对象
(结合此处与Class Fab与参考2便可更好的理解yield的作用)
return与yield
return隐含的意思是函数正将执行代码的控制权返回给函数被调用的地方。
而yield的隐含意思是控制权的转移是临时和自愿的,我们的函数将来还会收回控制权。