我有一个错误是由检查"如果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)
在我检查是否存在某个对象(加快检查)之前,我通常会将生成器变成一个集合,这样可以解决问题,但我非常想知道这里发生了什么?
有没有更好的方法可以迭代生成器的结果,我的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) 我试图了解这是多么有效.我已经完全操纵了这个代码,但仍然不明白它是如何返回它的值.我从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的值.
希望有人可以帮助解释这一点,以便我可以尝试掌握并使用发电机进入下一阶段.
我有发电机像
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成为发电机的一个项目.是否有可能在单行中不产生任何东西?
我有一个PHP文件,我想得到一个随机数,但我希望它有80%的机会成为1.然后20%要么是2,3或4.通常你可以做这样的事情:
rand(1, 4)
Run Code Online (Sandbox Code Playgroud)
但1正如我解释的那样,我希望获得更高的机会.
谁能解释一下这些例子中的生成器是如何工作
在这个例子中来自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)
在这个例子中(x*x代表范围内的x(1,100000000))
我有这个疑问的原因是这个片段:
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) 我有两个功能(发电机).
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)
如何获得所需的输出?
我如何遍历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.
每次调用函数时,我都在寻找一种循环遍历列表中数字的方法.
我使用了一个生成器,它一次返回列表一的成员,但是在函数返回最后一个元素之后,我还没有找到回到列表开头的方法.
def returnSeq(self, numRows):
for seq in [0, 1, 2, 3, 2, 1]:
yield seq
Run Code Online (Sandbox Code Playgroud)
如果有更好的方法来实现这一点,我将不胜感激.
先感谢您,
如何编写代码以生成介于两个不同范围之间的随机数?
示例:生成一个介于5到7之间或介于10到12之间的随机数.可能的结果是5,6,7,10,11或12.