3

当生成器未完成值并且已读取所有需要的结果时,有没有办法停止产生?我的意思是生成器在没有进行 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/

4

4 回答 4

8

您可以调用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-24T11:52:23.920 回答
0

正如你已经看到的,

TypeError: 'generator' object is unsubscriptable

你写devtrue它的方式不应该停止。如果您需要该容量,您可以:

def bounded_true(count)
   while count > 0:
       yield True
       count -= 1

或更简单地说:

y = [True] * 5

如果你制作一个无限生成器,它将无限生成。

于 2010-07-24T12:04:09.460 回答
0

这是我想出的最好的方法,但它仍然需要切片两次才能找到长度,并且需要将字符串编号从拆分转换为 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

我会在我的初筛上尝试它,但它可能不会比从递归公式中进行长度算术更快。 通过递归公式改进纯 Python 素筛

于 2010-07-24T22:00:21.927 回答
0

与 Haskell 中的函数类似take,您可以基于另一个生成器构建一个“有限”生成器:

def take(n,gen):
    '''borrowed concept from functional languages'''
togo=n
while togo > 0:
    yield gen.next()
    togo = togo - 1

def naturalnumbers():
    ''' an unlimited series of numbers '''
    i=0
    while True:
        yield i
        i=i+1

for n in take(10, naturalnumbers() ):
   print n

您可以使用“直到”生成器、“while”、...

def gen_until( condition, gen ):
   g=gen.next()
   while( not condition(g) ):
      yield g
      g=gen.next()

并像使用它一样

for i in gen_until( lambda x: x*x>100, naturalnumbers() ):
  print i

...

于 2010-07-25T07:29:21.017 回答