Python 为什么函数不打印列表中的值之和?

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'

这个程序的目标是让函数“Fib”接受两个值,并将它们放入一个斐波那契序列,在变量“sequence”的过程中添加项。当它通过“check”函数并返回达到的限制时,它将向列表“final”添加偶数值,然后在循环后打印出“final”的总和

问题是,无论Fib接受什么值,“final”总是以没有值结束。我对编程非常陌生,似乎不明白它为什么这么做

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