如何添加在';而';使用Python循环

如何添加在';而';使用Python循环,python,while-loop,fibonacci,Python,While Loop,Fibonacci,我正在解决的问题如下: 通过考虑Fibonacci序列中值不超过400万的项,找到偶数值项之和。” 所以我用这个脚本打印了高达400万的斐波那契序列: a = 0 b = 1 while b < 4000000: print b a, b = b, a+b a=0 b=1 而b从itertools导入takewhile,ifilter >>>def fib(): a、 b=0,1 尽管如此: 产生 a、 b=b,a+b >>>def为_偶数(x): 返回x%2==0 >>

我正在解决的问题如下:

通过考虑Fibonacci序列中值不超过400万的项,找到偶数值项之和。”

所以我用这个脚本打印了高达400万的斐波那契序列:

a = 0
b = 1
while b < 4000000:
    print b
    a, b = b, a+b
a=0
b=1
而b<4000000:
打印b
a、 b=b,a+b
显然,我可以运行这个程序,然后手动添加偶数值,但我会觉得我在作弊

从技术上讲,我想我要问两个问题:

  • 我怎么能挑出晚上呢
  • 我如何添加这些even而不实际将其分配给变量
  • 哦,我相信这是非常明显的,但我对……嗯,一般来说,编程是非常陌生的,我可以很容易地在专家的长篇大论中迷失。提前谢谢!

    啊,欧拉计划

    不过,这更像是一个数学问题,而不是一个编程问题

    在编程方面,只需添加一个累加器。您可以使用模运算符
    %
    测试均匀性,该运算符在左操作数除以右操作数后返回整数余数

    a, b = 0, 1
    evens = 0
    while b < 4000000:
        if not b%2:
            evens += b
        a, b = b, a+b
    
    a,b=0,1
    evens=0
    而b<4000000:
    如果不是b%2:
    evens+=b
    a、 b=b,a+b
    

    得到答案后,Project Euler PDF和论坛将向您介绍此问题的数学部分,并真正回答您的问题。有一些方法可以避免计算每个斐波那契数和测试均匀度,但这些方法需要利用斐波那契序列的特定数学特性。

    如果您需要如果您不喜欢变量赋值,您可能会喜欢:

    >>从itertools导入takewhile,ifilter
    >>>def fib():
    a、 b=0,1
    尽管如此:
    产生
    a、 b=b,a+b
    >>>def为_偶数(x):
    返回x%2==0
    >>>求和(i滤波器是偶数,(takewhile)(λx:x
    我怎么能挑出晚上呢

    偶数是将它们除以2(整数)时留下零余数的数。在Python中,我们使用
    %
    运算符得到“作为整数除以后的余数”

    然而,这里还有另一个巧妙的技巧,偶数斐波那契数是序列中的每三个数,如果你能严格地证明原因,那么你将接近得到直接生成偶数斐波那契数序列所需的公式

    我如何添加这些even而不实际将其分配给变量


    将它们分配给变量有什么问题?只需为运行计数设置另一个变量。

    使用
    return not(x%2)
    而不是
    return x%2==0
    :它更像pythonic,速度更快。@gecco
    return not(x%2)
    利用了一个事实,即0被视为
    False
    ,并使条件隐式。我不认为这可能被认为更像pythonic。我怀疑它也会对其他实现产生影响,而不是对CPython。我没有弄明白你提到的诀窍,但你的答案过于简单。这让我想到了find一个备用路径。我刚刚添加了一个简短的“if”语句来增加偶数值。谢谢!我实际上不再那么确定我关于技巧的断言了。>_
    >>> from itertools import takewhile, ifilter
    
    >>> def fib():
            a, b = 0, 1
            while True:
                yield a
                a, b = b, a+b
    
    >>> def is_even(x):
            return x % 2 == 0
    
    >>> sum(ifilter(is_even, (takewhile(lambda x: x<4000000, fib()))))
    4613732