gpt4 book ai didi

Python:循环中的产量与打印

转载 作者:太空宇宙 更新时间:2023-11-03 18:56:04 24 4
gpt4 key购买 nike

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

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() 似乎不起作用。

最佳答案

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,而是在退出时打印结果

3.嗯,至于返回,很明显您从函数中返回,因此函数中的以下代码不会执行,因此您的列表不会填充。

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

要更清楚地了解 yield 关键字的用法,请查看这篇文章:What does the "yield" keyword do in Python?

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

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() 函数都会生成下一个值,您可以根据条件将其添加到列表中。

关于Python:循环中的产量与打印,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17244236/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com