从打印对象自动创建列表

时间:2018-08-25 22:06:37

标签: list printing sum

我是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

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

1 个答案:

答案 0 :(得分:1)

您可以编写一个生成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版本产生了一个无限列表,那么我可以将第一部分简化为一个生成器表达式,但这就是生命。