Python 为什么函数不打印列表中的值之和?
这个程序的目标是让函数“Fib”接受两个值,并将它们放入一个斐波那契序列,在变量“sequence”的过程中添加项。当它通过“check”函数并返回达到的限制时,它将向列表“final”添加偶数值,然后在循环后打印出“final”的总和 问题是,无论Fib接受什么值,“final”总是以没有值结束。我对编程非常陌生,似乎不明白它为什么这么做Python 为什么函数不打印列表中的值之和?,python,list,function,variables,Python,List,Function,Variables,这个程序的目标是让函数“Fib”接受两个值,并将它们放入一个斐波那契序列,在变量“sequence”的过程中添加项。当它通过“check”函数并返回达到的限制时,它将向列表“final”添加偶数值,然后在循环后打印出“final”的总和 问题是,无论Fib接受什么值,“final”总是以没有值结束。我对编程非常陌生,似乎不明白它为什么这么做 def even(x): v = list(str(x))[-1] if v == '0' or v == '2' or v == '4'
def even(x):
v = list(str(x))[-1]
if v == '0' or v == '2' or v == '4' or v == '6' or v == '8':
return x
else:
return 0
def check(sequence):
for v in sequence:
if v >= 20:
return 'Limit Reached'
else:
return None
def Fib(x,y):
sequence = [x,y]
a = 0
b = 1
final = []
while len(sequence) < 100:
term = sequence[a] + sequence[b]
sequence.append(term)
if check(sequence) == 'Limit Reached':
for v in sequence:
final.apppend(even(v))
print sum(final)
break
a += 1
b += 1
def偶数(x):
v=列表(str(x))[-1]
如果v=='0'或v=='2'或v=='4'或v=='6'或v=='8':
返回x
其他:
返回0
def检查(顺序):
对于按顺序排列的v:
如果v>=20:
返回“已达到限制”
其他:
一无所获
def Fib(x,y):
序列=[x,y]
a=0
b=1
最终=[]
当len(序列)<100时:
术语=序列[a]+序列[b]
sequence.append(术语)
如果检查(顺序)=“达到极限”:
对于按顺序排列的v:
最终申请(偶数(v))
打印金额(最终)
打破
a+=1
b+=1
您没有返回final,因此每次调用Fib()时它的值都会被清除,因为它是一个局部变量。我确信它会打印出预期的结果,不是吗?如果列表中的第一项小于20,check
将始终返回None
你可能是说:
def check(sequence):
for v in sequence:
if v >= 20:
return 'Limit Reached'
else:
return None
与大多数语言不同的是,Python会在这样的输入错误上抛出运行时错误(与根本不编译程序相反)
如果看不到运行时错误,则表明周围的
if
条件永远不会满足,这是因为check
方法在检查序列中的第一项之后立即返回,而不是检查整个序列。此代码存在许多问题。我会这样写:
def even(x):
# is the modulo operator, it's used to calculate a remainder
return x % 2 == 0
def check(sequence):
# you need to check all the values, not just the first one
return max(sequence) >= 20
def Fib(x, y):
sequence = [x, y]
while len(sequence) < 100:
# it's not necessary to keep a and b around, you can use
# negative indices instead
sequence.append(sequence[-2] + sequence[-1])
if check(sequence):
# this is called a "generator comprehension"
print sum(v for v in sequence if even(v))
break
def偶数(x):
#是模运算符,用于计算余数
返回x%2==0
def检查(顺序):
#您需要检查所有值,而不仅仅是第一个值
返回最大值(序列)>=20
def Fib(x,y):
序列=[x,y]
当len(序列)<100时:
#没有必要保持a和b在附近,您可以使用
#相反,负指数
sequence.append(sequence[-2]+sequence[-1])
如果检查(顺序):
#这被称为“生成器理解”
打印总和(如果偶数(v),则按顺序为v表示v)
打破
仍然可以进一步简化,但此结构与您自己的结构相匹配。实际上,甚至不需要保持序列,因为你可以在前进的过程中保持一个连续的总数,但我认为这样做会更有启发性。也许你想要更简单的东西:
def fib(a, b, iterations = 20):
result = 0
if not (a & 1): result += a
if not (b & 1): result += b
for x in xrange(iterations):
nextval = a + b
if not (nextval & 1):
result += nextval
a = b
b = nextval
return result
您可能需要执行一些新代码:按顺序为v:if v%2==0:final.append(v),据我所知Fib()函数对整数进行运算,所以更好的方法是只执行位运算:
somevalue&1
仅当数字为奇数(而非偶数)时,什么才等于1@ddzialak:可能最好使用%
进行数字奇偶校验测试,因为该运算符位于整数的语义域中,而不是它们的表示。我们也许能够证明a%2==a&1
,但除非我们最初打算按位进行操作,否则我认为最好使用%
。在某些情况下,可能有理由不这样做,但这显然是一个与初学者相关的问题,而不是花哨的玩弄技巧。@ecatmur我想我喜欢在for
循环之后使用else
,从现在起我将使用它。
def fib(a, b, iterations = 20):
result = 0
if not (a & 1): result += a
if not (b & 1): result += b
for x in xrange(iterations):
nextval = a + b
if not (nextval & 1):
result += nextval
a = b
b = nextval
return result