从打印对象自动创建列表



我是Python的新手,正在通过edX学习并尝试解决ProjectEuler数学问题。 第二个问题是对所有小于 4,000,000 的偶数斐波那契数求和。 我能够用Python解决这个问题,但不是以一种令我满意的方式。

首先,我定义了一个 fib 函数:

def fib(n):
if n == 0:
return 0
elif n == 1:
return 1
else:
return fib(n-1) + fib(n-2)

然后,我能够打印所有值小于 4,000,000 的斐波那契数:

n = 0
while True:
if fib(n) < 40000000 and fib(n) % 2 == 0:
print(fib(n))
n = n+1
elif fib(n) < 4000000 and fib(n) % 2 != 0:
n = n+1
else:
break

然后,我根据打印的内容手动形成一个列表并汇总该列表。 问题是我不想这样做。 我希望计算机在进行时形成列表,然后对值进行汇总。 有人知道我该怎么做吗?谢谢!

你可以写一个产生fib数字的生成器,然后在数字小于400万(4e6(时从中获取:

import itertools
def fib(n):
if n == 0: return 0
elif n == 1: return 1
else: return fib(n-1) + fib(n-2)
# A generator function that lazily produces new fib numbers
def gen_fibs():
n = 1
while True:
yield fib(n) 
n += 1
# Take from the generator while n is less than 4 million
fibs = itertools.takewhile(lambda n: n <= 4e6, gen_fibs())
# Keep all the evens
even_fibs = (n for n in fibs if n % 2 == 0)
# Then print the sum of even fibs
print(sum(even_fibs)) 

可能有一种方法可以绕过手动定义生成器,但这仍然相当整洁。如果range有一个产生无限列表的 0-arity 版本,我本可以将第一部分简化为生成器表达式,但这就是生活。

最新更新