此代码应打印Fibonacci序列前十个数字中偶数的总和。
#Creates a list with the first ten Fibonacci numbers.
l = [1,2]
for i in range(10):
l.append(l[i]+l[i+1])
for i in l:
#If an element of the Fibonacci list is uneven, replace it with zero.
if l[i]%2 != 0:
l[i] = 0
#Print the sum of the list with all even Fibonacci numbers.
print sum(l)
当我执行此操作时,我得到:
File "pe2m.py", line 6, in <module>
if l[i]%2 != 0:
IndexError: list index out of range
我不知道它是如何超出范围的,有人可以澄清吗?
答案 0 :(得分:3)
你的问题是for i in l
:它没有给你索引,它给你列表元素。由于元素是整数,它们可能是有效的(前几个将是有效的)但它们没有您想要的值 - 您将不得不再次迭代一个范围。
答案 1 :(得分:2)
您正在遍历值而不是索引位置!
请改用以下代码:
#Creates a list with the first ten Fibonacci numbers.
l = [1,2]
for i in range(10):
l.append(l[i]+l[i+1])
for i in range(len(l)):
#If an element of the Fibonacci list is uneven, replace it with zero.
if l[i]%2 != 0:
l[i] = 0
#Print the sum of the list with all even Fibonacci numbers.
print sum(l)
答案 2 :(得分:2)
您无法使用列表中的值索引列表,因为无法保证该值将在列表边界内
看到你的代码,我觉得你打算做下面的事情
>>> for i,e in enumerate(l):
#If an element of the Fibonacci list is uneven, replace it with zero.
if e%2 != 0:
l[i] = 0
有趣的是,你可以这样做。 (在看到glglgl的评论后编辑]
>>> print sum(e for e in l if e%2)
答案 3 :(得分:1)
Python的for x in y
构造返回x中序列的值/元素,而不是它们的索引。
至于Fibonacci数:序列从1,1开始,而不是1,2,并且总和可以更简单地完成:
a, b = 1, 1
s = 0
for i in range(10):
a, b = b, a+b
if b % 2 = 0:
s += b
print s
如果您需要获得前N个偶数的总和,您可以这样做:
a, b = 1, 1
s = 0
count = 0
while count < 10:
a, b = b, a+b
if b % 2 = 0:
s += b
count += 1
print s
只是为了实现带有函数式发电机的版本:
from itertools import islice
def fib():
a, b = 1, 1
yield a
yield b
while True:
a, b = b, a+b
yield b
even_sum = reduce(lambda x, y: x+y if y % 2 == 0 else x, islice(fib(), 10), 0)