2 回答
TA贡献1878条经验 获得超4个赞
正如 user2357112 所说,“currentPrime在使用时查找,而不是在生成器创建时查找。”
一种解决方案是使用filterlambda 来定位 的当前值currentPrime。请注意 lambda 如何使用默认参数来创建局部变量:
currentPrime = None
sieve = iter(range(2, 10))
while True:
try:
# The first value should be prime.
currentPrime = next(sieve)
except StopIteration:
# Stop when sieve is empty.
print(currentPrime)
break
# Filter out all multiples of currentPrime.
sieve = filter(lambda x, prime=currentPrime: x % prime, sieve)
TA贡献1780条经验 获得超5个赞
如果我没记错的话,这里有一堆发电机。
会发生什么(TL;DR:所有生成器都引用一个 currentPrime 实例并引用惰性):
从范围迭代器中获取值 2。
创建生成器表达式 (A)。现在变量 currentPrime = 2 并且不是免费的(未关闭)。发电机消耗剩余范围(3..9)。
从生成器 A 获取值 3(3 % 2 为 True)
创建生成器表达式 (B)。两个发电机 (A, B) 的变量 currentPrime = 3 。发电机消耗发电机 A (4..9) 的剩余部分。
从生成器 B 中获取值 4。参见:next() → B.next(A) → A 产生 4(A 检查:4 % 3为真),然后 B 检查 4 % 3 为真。
创建生成器表达式 (C) ... 等等。
生成器中的变量不在闭包中,请参阅:
>>> a = 5
>>> gen = (a for i in range(3))
>>> a = 3
>>> list(gen)
[3, 3, 3]
添加回答
举报