gpt4 book ai didi

python - 迭代器的意外行为

转载 作者:行者123 更新时间:2023-12-02 08:46:22 25 4
gpt4 key购买 nike

我尝试用迭代器实现埃拉托色尼筛(因为我想更多地了解Python的函数式编程)。可悲的是,发生了一些意想不到的行为。您可以在此视频中看到它:/image/woEu5.jpg

这是我的代码:

def sieve_primes(stop=10):
L = (x for x in range(2, stop+1))
while True:
prime = next(L)
L = filter(lambda x: x % prime != 0 or x == prime, L)
#L, M = itertools.tee(L)
#print(list(M))
yield prime

当两个注释行未注释时,它可以工作(吐出具有所需素数的迭代器对象)。否则,它只会迭代每个数字。

我期待着您的答复:)谢谢!

最佳答案

def sieve_primes(stop=10):
L = (x for x in range(2, stop+1))
while True:
prime = next(L)
L = filter(lambda x: x % prime != 0 or x == prime, L)
yield prime

下面逐次迭代地给出了代码中到底发生了什么。为了方便起见,我在第一次迭代中将 L 表示为 L1,在第二次迭代中将 L 表示为 L2,依此类推。

  • 第一次迭代 prime=next(L)是 2(如预期)。 L1=filter(lambda x: x % prime != 0 or x == prime, L) (L 的值是延迟计算的,即仅根据需要计算的值。yield prime 将产生预期的 2

  • 第二次迭代 prime=next(L1) 。棘手的部分来了。 L1filter object其值仅根据需要计算。因此,在第二次迭代中,当 prime=next(L1)仅执行从 L 计算出的一个值。现在 lambda 使用质数为 2并计算一个值 3 ( 3%2!=0 ) 现在是 primeL2=filter(lambda x: x % prime != 0 or x == prime, L1) (L2 的值是延迟计算的,即仅按需计算的值。现在您 yield prime 将产生 3

  • 第三次迭代 prime=next(L2) 。现在事情变得有点复杂了。从 L2 获取一个值您需要计算 L1 的一个值并计算一个值 L1您需要计算一个值 L 。如果你没记错的话L现在将产生 4现在将由 L1 使用产生一种值(value)。但最新引用prime34%3!=0评估为 True 。所以,L1产量4 。因此,计算 L2 产生的值4%3!=0评估为 True所以prime=next(L2)4 .

对进一步的迭代应用相同的逻辑,您会发现在进一步的迭代中将产生 5,6,7,8,9...。

关于python - 迭代器的意外行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60216945/

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