def fibonacci():
i, j = 0, 1
while True:
yield j
i, j = j, i + j
def fibonacci_naive():
i, j = 0, 1
count = 0
while j <= 5000:
if j % 2:
count += 1
i, j = j, i + j
return count
def fibonacci_transform():
count = 0
for f in fibonacci():
if f > 5000:
break
if f % 2:
count += 1
return count
from itertools import islice
def fibonacci_succinct():
is_odd = lambda x : x % 2
first_5000 = islice(fibonacci(), 0, 5000)
return sum(1 for x in first_5000 if is_odd(x))
fibonacci_naive()、fibonacci_transform()、fibonacci_succinct()都实现了 5000以内的斐波那契数中有几个奇数 ,fibonacci_transform 函数具有多个优势。
- 相比 fibonacci_succinct 更加直观,可以轻易被另一个开发者调试和理解
- fibonacci_naive 一次做了多件事情,隐藏了实际的计算逻辑
- 使用斐波那契数列的生成器则不会阻碍我们理解实际的计算逻辑