迭代无限发生器直到满足条件

The*_*ark 2 python generator

我在python中理解生成器时遇到了一些麻烦.假设我有以下简单的生成器:

def test_gen():
    yield 1
    yield 2
    yield 5
    yield 8
    yield 12
Run Code Online (Sandbox Code Playgroud)

这只会产生一些数字.让我们说我想继续从发生器打印值,直到值超过10.我的第一次尝试就是

gen = test_gen()
for i in gen:
    while i > 10:
        print(i)
Run Code Online (Sandbox Code Playgroud)

但这只是打印1永久.我找到了

gen = test_gen()
for i in gen:
    if i > 10:
        print(i)
Run Code Online (Sandbox Code Playgroud)

按预期工作,因为它只是迭代生成器中的每个值,直到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
Run Code Online (Sandbox Code Playgroud)

如果我做了类似的事情

primes = prime_gen()
for p in primes:
    if p < 100:
        print(p)
Run Code Online (Sandbox Code Playgroud)

然后它会将所有内容打印到p,但随后会挂断.我认为它正在被挂起,因为它正试图检查所primes产生的每一个价值,这些价值将永远持续下去.迭代通过无限生成器直到满足条件的正确方法是什么?我发现的唯一方法就是做

primes = prime_gen()
for p in primes:
    if p < 100:
        print(p)
    else:
        break
Run Code Online (Sandbox Code Playgroud)

但我觉得有更多的pythonic方式.

Ign*_*ams 11

itertools.takewhile()

for i in itertools.takewhile(lambda x: x < 100, primes):
  print i
Run Code Online (Sandbox Code Playgroud)