[英]iterate infinite generator until condition is met
我在理解 python 中的生成器时遇到了一些麻烦。 假设我有以下简单的生成器:
def test_gen():
yield 1
yield 2
yield 5
yield 8
yield 12
那只会产生一些数字。 假设我想保持从生成器打印值,直到值大于 10。我的第一次尝试只是
gen = test_gen()
for i in gen:
while i > 10:
print(i)
但这只会永远打印1
。 我发现做
gen = test_gen()
for i in gen:
if i > 10:
print(i)
按预期工作,因为它只是迭代生成器中的每个值,直到引发StopIteration
。 然后我遇到了一个无限生成器的问题,比如这个生成素数的生成器:
def prime_gen():
D = dict()
n = 2
while True:
if n not in D:
yield n
D[n*n] = [n]
else:
for p in D[n]:
D.setdefault(p + n, []).append(p)
del D[n]
n += 1
那么如果我做类似的事情
primes = prime_gen()
for p in primes:
if p < 100:
print(p)
然后它将打印到 p 的所有内容,但随后被挂断。 我认为它被挂断了,因为它试图检查primes
产生的每个值,这将永远持续下去。 迭代无限生成器直到满足这样的条件的正确方法是什么? 我发现的唯一方法是做
primes = prime_gen()
for p in primes:
if p < 100:
print(p)
else:
break
但我觉得有一种更 Pythonic 的方式来做到这一点。
for i in itertools.takewhile(lambda x: x < 100, primes):
print(i)
您的break
方法非常 Pythonic,但我会考虑包装生成器:
for p in (i if i < 100 else StopIteration for i in primes):
print(p)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.