gpt4 book ai didi

python - Python 2.x 中循环迭代的 Deferred_output

转载 作者:行者123 更新时间:2023-12-01 06:02:25 26 4
gpt4 key购买 nike

Here我找到了一个非常好的方法,说明如何使用延迟输出技术来计算数字序列。

我决定使用相同的技术来解决 Project Euler 中的第二个问题.

代码:

#Answer: 4613732
from itertools import *
import operator

seeds = [1,2]

def deferred_output():
for i in output:
yield i

result,a1,a2 = tee(deferred_output(),3)
paired = map(operator.add,a1,islice(a2,1,None))
output = chain(seeds,paired)

cropped = takewhile((4000000).__gt__,result)
evened = filter(lambda x: x%2==0,cropped)

print(sum(evened))

代码在 Python 3.x 中完美运行

但是当我尝试在 Python 2.x 中运行它时,出现了以下错误:

Traceback (most recent call last):
File "C:\Documents and Settings\Oleg\Мои документы\_Мои документы\_SyncedWithFlashDrive\Программирование\Project Euler\2\1.py", line 14, in <module>
paired = map(operator.add,a1,islice(a2,1,None))
File "C:\Documents and Settings\Oleg\Мои документы\_Мои документы\_SyncedWithFlashDrive\Программирование\Project Euler\2\1.py", line 9, in deferred_output
for i in output:
NameError: global name 'output' is not defined

这意味着延迟输出在Python 2.x中不起作用

这是为什么?

最佳答案

以下代码有效:

from itertools import *                                                         
import operator

seeds = [1,2]

def deffered_output():
for i in output:
yield i

result,a1,a2 = tee(deffered_output(),3)
paired = imap(operator.add,a1,islice(a2,1,None)) # change 2 (imap)
output = chain(seeds,paired)

cropped = takewhile(lambda x: x <= 4000000,result) # change 1 (lambda)
evened = filter(lambda x: x%2==0,cropped)

print(sum(evened))

我需要进行两项更改:

首先,takewhile 的参数必须是 lambda,因为 2.7 中的整数没有像 __gt__ 这样的方法。 .

第二,更重要的是,map()在 python 3 中是惰性的——它返回一个稍后完成工作的生成器。相比之下,在 python 2.7 中,它是急切的 - 它立即完成工作并返回一个列表。

所以,在 python 2.7 中,map()触发代码的评估,该代码通过各个生成器回调,直到评估 deffered_output()功能。这一切都发生在 output 行之前被定义为。所以有一个错误,因为output未定义。

但是,在 python 3 中(或在 python 2.7 中使用 imap() 时),该行创建另一个生成器,该生成器实际上不会执行工作,直到在 sum() 中评估内容为止。 (此时 output 已定义,因此可以评估 deffered_output)。

如果这还不清楚,那么您需要了解更多关于 generators 的信息在Python中。

ps并不重要,但是看着它让我发疯:它是“延迟”,而不是“延迟”!

关于python - Python 2.x 中循环迭代的 Deferred_output,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9656530/

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