[英]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.