当生成器没有完成值并且所有需要的结果都被读取时,有没有办法停止让步?我的意思是生成器在不做StopIteration的情况下给出值。
例如,这永远不会停止:(修订)
from random import randint
def devtrue():
while True:
yield True
answers=[False for _ in range(randint(100,100000))]
answers[::randint(3,19)]=devtrue()
print answers我找到了这段代码,但还不明白如何在这种情况下应用它:http://code.activestate.com/recipes/576585-lazy-recursive-generator-function/
发布于 2010-07-25 06:00:22
这是我想出的最好的方法,但它仍然会进行两次切片来找到长度,并且需要将字符串数字从still转换为int:
from time import clock
from random import randint
a=[True for _ in range(randint(1000000,10000000))]
spacing=randint(3,101)
t=clock()
try:
a[::spacing]=[False]
except ValueError as e:
a[::spacing]=[False]*int(e.message.rsplit(' ',1)[-1])
print spacing,clock()-t
# baseline
t=clock()
a[::spacing]=[False]*len(a[::spacing])
print 'Baseline:',spacing,clock()-t我会尝试我的素数筛子,但它可能不会比从递归公式中进行长度算术更快。Improving pure Python prime sieve by recurrence formula
发布于 2010-07-24 19:52:24
您可以在生成器对象上调用close()。这样,就会在生成器中引发GeneratorExit异常,并且对其next()方法的进一步调用将引发StopIteration
>>> def test():
... while True:
... yield True
...
>>> gen = test()
>>> gen
<generator object test at ...>
>>> gen.next()
True
>>> gen.close()
>>> gen.next()
Traceback (most recent call last):
...
StopIteration发布于 2010-07-24 20:04:09
正如你已经看到的,
TypeError: 'generator' object is unsubscriptable而且您编写devtrue的方式不应该停止。如果您需要该容量,您可以:
def bounded_true(count)
while count > 0:
yield True
count -= 1或者更简单地说:
y = [True] * 5如果你做一个无限生成器,它就会无限生成。
https://stackoverflow.com/questions/3324947
复制相似问题