标签: generator

Python:检查生成器中是否存在对象

我有一个错误是由检查"如果x在发电机中"的变化结果引起的

def primes(upper_limit):
    for n in range(2, upper_limit):
        if all(n % i > 0 for i in range(2, n)):
            yield n

first_hundred_primes = primes(100)

print(5 in first_hundred_primes)
print(5 in first_hundred_primes)
print(5 in first_hundred_primes)
print(5 in first_hundred_primes)
print(5 in first_hundred_primes)
Run Code Online (Sandbox Code Playgroud)

这给出了输出:

True
False
False
False
False
Run Code Online (Sandbox Code Playgroud)

我假设一个不是要检查一个对象是否存在于生成器中,但如果是这种情况,为什么它不会抛出一些错误,为什么这个工作?

>>> hundred_generator = range(1,100)
>>> 50 in hundred_generator
True
>>> 50 in hundred_generator
True
>>> 50 in hundred_generator
True
Run Code Online (Sandbox Code Playgroud)

在我检查是否存在某个对象(加快检查)之前,我通常会将生成器变成一个集合,这样可以解决问题,但我非常想知道这里发生了什么?

python list generator range

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

如何迭代生成器函数的结果

有没有更好的方法可以迭代生成器的结果,我的for循环很丑陋:

for(let job = readyJob.next(); !job.done; job = readyJob.next()){ } 
Run Code Online (Sandbox Code Playgroud)

在上下文中,有一个生成器函数可以确定是否存在由1 .. *个作业组成的一批工作(生成器也可能在批处理中不返回任何作业)。有一个连续的循环实例化生成器并遍历批处理工作(记录)。

有没有更好的解决此迭代问题的方法。我的意思是,这看起来像Java / C#的传统迭代器,还不错。像“每个”这样的东西是超级可读的……无论如何,这就是我的希望。

 let getReadyJob = function *(instance){
    let numJobs = 7 ; // getRandomInt(0, 10) ;
    for(let i = 0; i < numJobs; i++) {
        yield {
            jobId: '' + instance + '::' + i,
            jobReadyOn: (new Date()).valueOf()
        };
    }
}
Run Code Online (Sandbox Code Playgroud)

然后

while(true){
    let readyJob = getReadyJob()

    for(let job = readyJob.next(); !job.done; job = readyJob.next()){
        console.log(JSON.stringify(job.value)) ;
    }
}
Run Code Online (Sandbox Code Playgroud)

javascript generator node.js ecmascript-6

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

ES6发电机令人困惑

我试图了解这是多么有效.我已经完全操纵了这个代码,但仍然不明白它是如何返回它的值.我从http://davidwalsh.name/es6-generators的教程中得到了这个

function *foo(x) {
  var y = 2 * (yield (x + 1));
  var z = yield (y / 3);
  return (x + y + z);
}

var it = foo( 5 );

// note: not sending anything into `next()` here
console.log( it.next() );       // { value:6, done:false }
console.log( it.next( 12 ) );   // { value:8, done:false }
console.log( it.next( 13 ) );   // { value:42, done:true }
Run Code Online (Sandbox Code Playgroud)

我似乎对第一个下一个()有一点把握,但接下来的两个让我感到困惑的是8和42的值.

希望有人可以帮助解释这一点,以便我可以尝试掌握并使用发电机进入下一阶段.

javascript generator ecmascript-6

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

在python中有条件地在一行中不产生任何内容

我有发电机像

def not_nones(some_iterable):
    for item in some_iterable:
        if item is not None:
            yield item
Run Code Online (Sandbox Code Playgroud)

但由于"扁平比嵌套好",我想在一行中做到这一点,如:

def not_nones(some_iterable):
    for item in some_iterable:
        yield item if item is not None else None
Run Code Online (Sandbox Code Playgroud)

但这实际上会None成为发电机的一个项目.是否有可能在单行中不产生任何东西?

python generator flat

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

PHP兰特,但获得另一个数字的机会更大?

我有一个PHP文件,我想得到一个随机数,但我希望它有80%的机会成为1.然后20%要么是2,3或4.通常你可以做这样的事情:

rand(1, 4)
Run Code Online (Sandbox Code Playgroud)

1正如我解释的那样,我希望获得更高的机会.

php random numbers generator

1
推荐指数
2
解决办法
338
查看次数

列表上的生成器与链接生成器和内存消耗?

谁能解释一下这些例子中的生成器是如何工作

在这个例子中来自http://www.dabeaz.com/generators/index.html

wwwlog = open("access-log")
bytecolumn = (line.rsplit(None,1)[1] for line in wwwlog)
bytes = (int(x) for x in bytecolumn if x != '-')
print "Total", sum(bytes)
Run Code Online (Sandbox Code Playgroud)
  1. 当我们链接这样的生成器时,除了代码对象创建之外,还有什么真正的工作发生,直到我们做sum()?
  2. 为什么我们需要分别执行line.split(None,1)[1]和int(x) - 这样做有什么好处?

在这个例子中(x*x代表范围内的x(1,100000000))

  1. 当解释器评估此表达式时,是否在Python 2中计算了范围(1,100000000)?
  2. 这是在本声明中还是在第一次运行发生器期间发生的
  3. 这在Python 3中有什么不同吗?

我有这个疑问的原因是这个片段:

def foo():
    for each in range(1,100000):
      yield each

a = foo()

# Here range is not evaluated until generator is run or just 
# before first yield is hit which is expected.

a=(x for x in range(1,100000)) 

# I thought …
Run Code Online (Sandbox Code Playgroud)

python generator

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

嵌套python生成器(一个在另一个内)

我有两个功能(发电机).

def a():
  yield 1
  yield 2


def b():
  yield 'A'
  yield 'B'
  yield a()
Run Code Online (Sandbox Code Playgroud)

现在我想迭代b()并期望它应该输出A B 1 2.但不是.它给了这个.

In [11]: for i in b():
   ....:     print i
   ....:     
A
B
<generator object a at 0x10fc3ddc0>
Run Code Online (Sandbox Code Playgroud)

如何获得所需的输出?

python yield generator

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

如何遍历列表,获取每个可能的值对?

我如何遍历list(数字)并获取其每一对可能的值?

示例(java):

for(int i = 0; i < 5; i++)
    for(int j = i+1; j < 5; j++)
        print(i, j); // 01, 02, 03, 04, 12, 13, 14, 23, 24, 34
Run Code Online (Sandbox Code Playgroud)

我的问题是列表是通过生成器函数获取的,因此它是懒惰的.此外,它可能非常大,因此将所有对保留在内存中不仅仅是绝望的解决方案.

所以最后一个问题 - 如何在python中实现相同的行为,记住内存是有限的?还应该复杂不超过O(N^2)哪里N是的长度list.

python iteration list generator

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

使用生成器循环遍历列表中的数字

每次调用函数时,我都在寻找一种循环遍历列表中数字的方法.

我使用了一个生成器,它一次返回列表一的成员,但是在函数返回最后一个元素之后,我还没有找到回到列表开头的方法.

def returnSeq(self, numRows):
    for seq in [0, 1, 2, 3, 2, 1]:
        yield seq
Run Code Online (Sandbox Code Playgroud)

如果有更好的方法来实现这一点,我将不胜感激.

先感谢您,

python generator

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

在C++中,如何生成一个介于两个范围之间的随机数?

如何编写代码以生成介于两个不同范围之间的随机数?

示例:生成一个介于5到7之间或介于10到12之间的随机数.可能的结果是5,6,7,10,11或12.

c++ random generator

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

标签 统计

generator ×10

python ×6

ecmascript-6 ×2

javascript ×2

list ×2

random ×2

c++ ×1

flat ×1

iteration ×1

node.js ×1

numbers ×1

php ×1

range ×1

yield ×1