1

我是 Python 的初学者,目前正在解决 Project Euler 的问题(这里是为那些没有听说过它的人准备的)。我已经解决了这个特殊问题,但是它给我留下了一些问题:

def fibsum():
    result = []
    a, b = 0, 1
    while True:
        a, b = b, a + b
        print b
        if b < 4000000 and b % 2 == 0:
            result.append(b)
        if b > 4000000:
        break
    print sum(result)

fibsum()

当我使用 PowerShell 运行它时,首先它会打印出我需要的所有数字(尽管它会重复一次),然后最后打印总和:

1
2
3
5
8
...
3524578
5702887 <-- This is over 4,000,000. Why is this here?
4613732 <-- This is the answer.
  1. 有什么方法可以让循环在达到超过 4,000,000 的第一个值之前停止迭代?

  2. 为了节省空间,如果我决定使用打印,有什么方法可以将所有值以列表格式([、、、、])打印出来?

  3. 当我用 yield 或 return(对于变量 b)替换原始代码中的 print 时,程序不会打印任何内容,尽管仍然存在

    打印总和(结果)

    在函数的最后。

  4. 有什么方法可以让这更容易,而不必定义结果和附加值?当值以类似于实际结果的格式返回时, sum() 似乎不起作用。

4

1 回答 1

1

1.在打印之前移动第二个条件b

while True:
    a, b = b, a + b  
    if b > 4000000:
        break
    print b
    if b < 4000000 and b % 2 == 0:
        result.append(b)

2.不要b循环打印,而是在result你爆发后打印。

3.嗯,至于return,很明显你是从函数中返回的,所以下面的函数中的代码没有被执行,因此你的列表没有被填充。

yield用于创建生成器函数,函数的每次执行都会返回下一个值。因此,您必须多次调用您的函数,从而将产生的值添加到外部定义的列表中。当没有什么可以返回时,你的函数就会中断。

yield更清楚地了解关键字的用法,请查看这篇文章:“yield”关键字在 Python 中的作用是什么?

您可以编辑代码以使用这样的产量(尚未测试):

def fibsum():
    a, b = 0, 1
    while True:
        a, b = b, a + b
        if b > 4000000:
            break
        yield b

result = []
for val in fibsum():
    if val < 4000000 and val % 2 == 0:
            result.append(val)

print sum(result)

因此,在 for 循环中,对函数的每次调用都会根据fibsum()条件生成下一个值,您将其添加到列表中。

于 2013-06-21T21:03:24.863 回答