标签: generator

如何从生成器中选择一个项目(在python中)?

我有一个如下的生成器函数:

def myfunct():
  ...
  yield result
Run Code Online (Sandbox Code Playgroud)

调用此函数的常用方法是:

for r in myfunct():
  dostuff(r)
Run Code Online (Sandbox Code Playgroud)

我的问题是,有什么方法可以随时从发电机中获取一个元素吗?例如,我想做类似的事情:

while True:
  ...
  if something:
      my_element = pick_just_one_element(myfunct())
      dostuff(my_element)
  ...
Run Code Online (Sandbox Code Playgroud)

python iterator generator python-2.x

189
推荐指数
4
解决办法
12万
查看次数

如何在Python中连接两个生成器?

我想更改以下代码

for directory, dirs, files in os.walk(directory_1):
    do_something()

for directory, dirs, files in os.walk(directory_2):
    do_something()
Run Code Online (Sandbox Code Playgroud)

这段代码:

for directory, dirs, files in os.walk(directory_1) + os.walk(directory_2):
    do_something()
Run Code Online (Sandbox Code Playgroud)

我收到错误:

+:'generator'和'generator'不支持的操作数类型

如何在Python中连接两个生成器?

python generator

158
推荐指数
8
解决办法
6万
查看次数

如何从生成器构建numpy数组?

如何从生成器对象中构建numpy数组?

让我来说明一下这个问题:

>>> import numpy
>>> def gimme():
...   for x in xrange(10):
...     yield x
...
>>> gimme()
<generator object at 0x28a1758>
>>> list(gimme())
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
>>> numpy.array(xrange(10))
array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
>>> numpy.array(gimme())
array(<generator object at 0x28a1758>, dtype=object)
>>> numpy.array(list(gimme()))
array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
Run Code Online (Sandbox Code Playgroud)

在这个例子中,gimme()是我想要变成数组的输出的生成器.但是,数组构造函数不会迭代生成器,它只是存储生成器本身.我想要的行为来自numpy.array(list(gimme())),但我不想支付同时在内存中使用中间列表和最终数组的内存开销.有更节省空间的方式吗?

python numpy generator

146
推荐指数
4
解决办法
5万
查看次数

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

如何在python中检查对象是否是生成器对象?

在python中,如何检查对象是否是生成器对象?

试试这个 -

>>> type(myobject, generator)
Run Code Online (Sandbox Code Playgroud)

给出错误 -

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
NameError: name 'generator' is not defined
Run Code Online (Sandbox Code Playgroud)

(我知道我可以检查对象是否有一个next方法让它成为一个生成器,但我想用一些方法来确定任何对象的类型,而不仅仅是生成器.)

python generator

137
推荐指数
6
解决办法
4万
查看次数

在Python中重置生成器对象

我有多个yield返回的生成器对象.准备调用这台发电机是相当费时的操作.这就是我想多次重用发生器的原因.

y = FunctionWithYield()
for x in y: print(x)
#here must be something to reset 'y'
for x in y: print(x)
Run Code Online (Sandbox Code Playgroud)

当然,我正在考虑将内容复制到简单的列表中.

python yield generator

133
推荐指数
8
解决办法
6万
查看次数

是否存在在ES6(ECMAScript 6)中循环x次而没有可变变量的机制?

x在JavaScript中循环时间的典型方法是:

for (var i = 0; i < x; i++)
  doStuff(i);
Run Code Online (Sandbox Code Playgroud)

但我不想使用++运算符或根本没有任何可变变量.那么,在ES6中,有x另一种方式循环时间吗?我喜欢Ruby的机制:

x.times do |i|
  do_stuff(i)
end
Run Code Online (Sandbox Code Playgroud)

在JavaScript/ES6中有类似的东西吗?我可以作弊并制造自己的发电机:

function* times(x) {
  for (var i = 0; i < x; i++)
    yield i;
}

for (var i of times(5)) {
  console.log(i);
}
Run Code Online (Sandbox Code Playgroud)

我当然还在用i++.至少它看不见:),但我希望在ES6中有更好的机制.

javascript generator ecmascript-harmony ecmascript-6

132
推荐指数
11
解决办法
7万
查看次数

如何len(generator())

Python生成器非常有用.它们优于返回列表的函数.但是,你可以len(list_returning_function()).有办法len(generator_function())吗?

更新:
当然len(list(generator_function()))会工作.....
我正在尝试使用我在我正在创建的新生成器中创建的生成器.作为新发电机计算的一部分,它需要知道旧发电机的长度.但是我想将它们与发生器保持相同的属性,特别是 - 不要将整个列表保存在内存中,因为它可能长.

更新2:
假设发生器即使从第一步开始就知道它的目标长度.此外,没有理由维护len()语法.示例 - 如果Python中的函数是对象,我不能将长度分配给新生成器可以访问的此对象的变量吗?

python generator

128
推荐指数
8
解决办法
9万
查看次数

如何从一开始就知道发电机是否为空?

有没有一种简单的方法来测试生成器是否没有项目,比如peek,hasNext,isEmpty,这些是什么?

python generator

127
推荐指数
10
解决办法
6万
查看次数

发电机输出长度

Python提供了一种很好的方法来获取渴望迭代的长度,len(x)也就是说.但是我找不到任何类似于生成器理解和函数所代表的惰性迭代.当然,写下这样的东西并不难:

def iterlen(x):
  n = 0
  try:
    while True:
      next(x)
      n += 1
  except StopIteration: pass
  return n
Run Code Online (Sandbox Code Playgroud)

但我无法摆脱我重新实现自行车的感觉.

(当我输入这个函数时,一个想法让我大吃一惊:也许真的没有这样的功能,因为它"摧毁"了它的论点.虽然不是我的情况的问题).

PS:关于第一个答案 - 是的,类似的东西len(list(x))也会起作用,但这会大大增加内存的使用.

PPS:重新检查......无视PS,似乎我在尝试时犯了一个错误,它运行正常.抱歉,添麻烦了.

python iterable generator

117
推荐指数
8
解决办法
6万
查看次数