簡體   English   中英

迭代無限生成器直到滿足條件

[英]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 的方式來做到這一點。

itertools.takewhile()

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM