Python中有没有一种方法可以同时生成多个输出。我特别想要这样的东西:
var myVar = setInterval(myTimer, 10);
function myTimer() {
var d = new Date();
document.getElementById("startTimeCounter").innerHTML = d.toLocaleTimeString();
}
并说我有一个参数my_gen =(i for i in range(10))
。我希望生成器输出:
batch_size = 3
在最后一条命令上,它仅产生两个数字,因为即使my_gen.next()
0,1,2
my_gen.next()
3,4,5
my_gen.next()
6,7,8
my_gen.next()
9,10
为3,也只剩下两个数字。
答案 0 :(得分:5)
在itertools
page上提供了一个分组功能:
def grouper(iterable, n, fillvalue=None):
"Collect data into fixed-length chunks or blocks"
# grouper('ABCDEFG', 3, 'x') --> ABC DEF Gxx"
args = [iter(iterable)] * n
return zip_longest(*args, fillvalue=fillvalue)
然后,您可以制作发生器并用石斑鱼将其包装:
for my_tuple in grouper(my_gen, 3):
print([x for x in my_tuple if x is not None])
答案 1 :(得分:2)
IMO,不需要任何库。您可以定义自己的批处理生成器
def batch_iter(batch_size, iter_):
yield [next(iter_) for _ in range(batch_size)]
还有
next(batch_iter(batch_size, x))
迭代安全版本为
def batch_iter(batch_size, iter_):
r = []
for _ in range(b):
val = next(iter_, None)
if val is not None: r.append(val)
yield r
如果需要元组值,当然可以yield tuple(r)
,而不只是r
。您还可以添加else
子句和break
循环,因为一旦val
为None
,就不再有要迭代的值
答案 2 :(得分:1)
您可以在生成器中使用列表推导:
batch_size, max_size = 3, 10
my_gen = ([x for x in range(i, i + batch_size) if x <= max_size] for i in range(0, max_size, batch_size))
for x in my_gen:
print(x)
答案 3 :(得分:0)
如果您希望迭代器/生成器具有多个批处理大小元素,则只需执行以下操作:
gen = iter(range(12))
for x, y, z in iter(lambda: [next(gen) for _ in range(3)], 1):
print(x, y, z)
如果没有,这应该适合您的需求:
gen = iter(range(11))
for t in iter(lambda: [next(gen, None) for _ in range(3)], [None]*3):
print(*[x for x in t if x is not None])
优点: