首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >直到得到所有需要的值,有没有办法让切片变得懒惰?

直到得到所有需要的值,有没有办法让切片变得懒惰?
EN

Stack Overflow用户
提问于 2010-07-24 19:42:23
回答 4查看 551关注 0票数 3

当生成器没有完成值并且所有需要的结果都被读取时,有没有办法停止让步?我的意思是生成器在不做StopIteration的情况下给出值。

例如,这永远不会停止:(修订)

代码语言:javascript
运行
复制
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/

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2010-07-25 06:00:22

这是我想出的最好的方法,但它仍然会进行两次切片来找到长度,并且需要将字符串数字从still转换为int:

代码语言:javascript
运行
复制
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

票数 0
EN

Stack Overflow用户

发布于 2010-07-24 19:52:24

您可以在生成器对象上调用close()。这样,就会在生成器中引发GeneratorExit异常,并且对其next()方法的进一步调用将引发StopIteration

代码语言:javascript
运行
复制
>>> 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
票数 8
EN

Stack Overflow用户

发布于 2010-07-24 20:04:09

正如你已经看到的,

代码语言:javascript
运行
复制
TypeError: 'generator' object is unsubscriptable

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

代码语言:javascript
运行
复制
def bounded_true(count)
   while count > 0:
       yield True
       count -= 1

或者更简单地说:

代码语言:javascript
运行
复制
y = [True] * 5

如果你做一个无限生成器,它就会无限生成。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3324947

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档