08-用生成器生成斐波那契数
1.1.6 用生成器生成斐波那契数
到目前为止,已完成的这些函数都只能输出斐波那契序列中的单个值。如果要将到某个值之前的整个序列输出,又该怎么做呢?用 yield 语句很容易就能把 fib5() 转换为Python生成器。在对生成器进行迭代时,每轮迭代都会用 yield 语句从斐波那契序列中吐出一个值,如代码清单1-9所示。
代码清单1-9 fib6.py
from typing import Generator
def fib6(n: int) -> Generator[int, None, None]:
yield 0 # special case
if n > 0: yield 1 # special case
last: int = 0 # initially set to fib(0)
next: int = 1 # initially set to fib(1)
for _ in range(1, n):
last, next = next, last + next
yield next # main generation step
if __name__ == "__main__":
for i in fib6(50):
print(i)
运行fib6.py将会打印出斐波那契序列的前51个数。 for 循环 for i in fib6(50): 每一次迭代时, fib6() 都会一路运行至某条 yield 语句。如果直到函数的末尾也没遇到 yield 语句,循环就会结束迭代。