标签: generator

如何判断发电机是否刚启动?

我想要一个函数,is_just_started其行为类似于以下内容:

>>> def gen(): yield 0; yield 1
>>> a = gen()
>>> is_just_started(a) 
True
>>> next(a)
0
>>> is_just_started(a) 
False
>>> next(a)
1
>>> is_just_started(a) 
False
>>> next(a)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
StopIteration
>>> is_just_started(a)
False
Run Code Online (Sandbox Code Playgroud)

我该如何实现这个功能?

我查看了该.gi_running属性,但它似乎用于其他东西.

如果我知道需要发送到生成器的第一个值,我可以这样做:

def safe_send(gen, a):
    try:
        return gen.send(a)
    except TypeError as e:
        if "just-started" in e.args[0]:
            gen.send(None)
            return gen.send(a)
        else:
            raise
Run Code Online (Sandbox Code Playgroud)

然而,这似乎令人憎恶.

python yield generator

49
推荐指数
3
解决办法
1961
查看次数

在Python 3.3中将生成器与yield一起返回

在Python 2中,当函数定义中的return与yield一起时,出现了错误.但对于Python 3.3中的这段代码

def f():
  return 3
  yield 2

x = f()
print(x.__next__())
Run Code Online (Sandbox Code Playgroud)

没有错误,返回用于带有yield的函数.但是,当__next__调用该函数时,会抛出异常StopIteration.为什么不只是返回价值3?这种回报是否被忽略了?

python generator python-3.x

48
推荐指数
2
解决办法
2万
查看次数

node.js是否支持yield?

有没有办法让生成器进入node.js?

我目前正在使用回调伪装它们,但我必须记得检查我的生成器函数内部回调的响应,这会产生很多 if (callback(arg) === false) return;

我想要像python中的东西:

for p in primes():
  if p > 100: break
  do_something(p)
Run Code Online (Sandbox Code Playgroud)

我正在节点中这样做:

primes(function(p) {
  if (p > 100) return false;
  do_something(p)
});
Run Code Online (Sandbox Code Playgroud)

也许像coffeescript这样的东西可以帮忙吗?

generator node.js

47
推荐指数
2
解决办法
2万
查看次数

将发电机拆分成块而不预先行走

(这个问题与这一个这个问题有关,但那些是预先走动的发电机,这正是我想要避免的)

我想把一个发电机拆分成块.要求是:

  • 不填充块:如果剩余元素的数量小于块大小,则最后一个块必须更小.
  • 不要事先走动发电机:计算元件是昂贵的,而且只能通过消耗功能来完成,而不是通过消耗器来完成
  • 这意味着,当然:不要累积在内存中(没有列表)

我试过以下代码:

def head(iterable, max=10):
    for cnt, el in enumerate(iterable):
        yield el
        if cnt >= max:
            break

def chunks(iterable, size=10):
    i = iter(iterable)
    while True:
        yield head(i, size)

# Sample generator: the real data is much more complex, and expensive to compute
els = xrange(7)

for n, chunk in enumerate(chunks(els, 3)):
    for el in chunk:
        print 'Chunk %3d, value %d' % (n, el)
Run Code Online (Sandbox Code Playgroud)

这有点工作:

Chunk   0, value 0
Chunk   0, value 1 …
Run Code Online (Sandbox Code Playgroud)

python generator

47
推荐指数
4
解决办法
1万
查看次数

我应该如何使用Google风格的Sphinx记录列表,选项和收益?

如何使用Sphinx-Napoleon为Google风格的文档字符串指示生成器的列表,可选参数和返回类型的类型?

我试过了

List[type]
list of type

Optional[type]
type, optional
Run Code Online (Sandbox Code Playgroud)

Yields:
   type: 
Run Code Online (Sandbox Code Playgroud)

分别; 但是所有产生的输出都不令人满意,与生成的文档的其余部分不一致.例如

Optional[type]
Run Code Online (Sandbox Code Playgroud)

只是给

可选[类型]

没有任何链接type.

我尝试过每个内置主题并遇到同样的问题.

我应该如何使用Sphinx-Napoleon的Google风格文档来记录这些元素?

documentation types generator python-2.7 python-sphinx

47
推荐指数
1
解决办法
961
查看次数

处理生成器中抛出的异常

我有一个生成器和一个消耗它的函数:

def read():
    while something():
        yield something_else()

def process():
    for item in read():
        do stuff
Run Code Online (Sandbox Code Playgroud)

如果生成器抛出异常,我想在使用者函数中处理它,然后继续使用迭代器直到它耗尽.请注意,我不希望在生成器中有任何异常处理代码.

我想到了类似的东西:

reader = read()
while True:
    try:
        item = next(reader)
    except StopIteration:
        break
    except Exception as e:
        log error
        continue
    do_stuff(item)
Run Code Online (Sandbox Code Playgroud)

但这对我来说相当尴尬.

python exception generator

46
推荐指数
3
解决办法
2万
查看次数

如何在一定范围内生成随机数?

如何使用Eclipse创建在Android中生成随机数的应用程序,然后在TextView字段中显示结果?随机数必须在用户选择的范围内.因此,用户将输入范围的最大值和最小值,然后我将输出答案.

random android numbers generator range

46
推荐指数
4
解决办法
11万
查看次数

从Python列表中获取前n个唯一元素

我有一个python列表,其中元素可以重复.

>>> a = [1,2,2,3,3,4,5,6]
Run Code Online (Sandbox Code Playgroud)

我想n从列表中获取第一个独特的元素.所以,在这种情况下,如果我想要前5个独特元素,它们将是:

[1,2,3,4,5]
Run Code Online (Sandbox Code Playgroud)

我已经提出了使用生成器的解决方案:

def iterate(itr, upper=5):

    count = 0
    for index, element in enumerate(itr):
        if index==0:
            count += 1
            yield element

        elif element not in itr[:index] and count<upper:
            count += 1
            yield element
Run Code Online (Sandbox Code Playgroud)

正在使用:

>>> i = iterate(a, 5)
>>> [e for e in i]
[1,2,3,4,5]
Run Code Online (Sandbox Code Playgroud)

我怀疑这是最优化的解决方案.是否有一种替代策略可以实现以更加pythonic和更有效的方式编写它?

python unique generator set python-3.x

46
推荐指数
7
解决办法
2696
查看次数

如何从列表中以Python的形式产生所有值?

假设我有一个列表,我希望不返回,但要从中产生值.什么是最pythonic的方式呢?

这就是我的意思.由于一些非惰性计算我已经计算了列表['a', 'b', 'c', 'd'],但我的代码通过项目使用延迟计算,所以我想从我的函数中产生值而不是返回整个列表.

我目前写的如下:

my_list = ['a', 'b', 'c', 'd']
for item in my_list:
    yield item
Run Code Online (Sandbox Code Playgroud)

但这对我来说并不像是pythonic.

python yield generator

44
推荐指数
2
解决办法
3万
查看次数

如何让Python生成器返回None而不是StopIteration?

我正在使用生成器在列表中执行搜索,就像这个简单的例子:

>>> a = [1,2,3,4]
>>> (i for i, v in enumerate(a) if v == 4).next()
3
Run Code Online (Sandbox Code Playgroud)

(只是为了对示例进行框架化,我使用的列表与上面的列表相比要长得多,而且条目有点复杂int.我这样做,所以每次我都不会遍历整个列表搜索他们)

现在如果我改为那样i == 666,它会返回一个,StopIteration因为它找不到任何666条目a.

我怎样才能让它返回None?我当然可以将它包装在一个try ... except子句中,但有更多的pythonic方法吗?

python exception generator stopiteration

44
推荐指数
2
解决办法
3万
查看次数