从发电机返回小批量物品

时间:2017-09-11 23:53:29

标签: python generator

我正在尝试创建一个包装生成器函数的类,这样我就可以批量生成预定义大小的生成器中的项目。

即。如果我有一个包含10个随机数的列表并且指定了2个迷你批量大小,那么我想获得5个2个数字的元组。

我将以下包装类写入生成器函数,希望它可以完成这项工作:

import random

class multiple_lottery_draws(object):
    def __init__(self, num_draws):
        self.num_draws = num_draws
        print("Initialized % draws"%self.num_draws)

    def my_lottery(self):
        # returns 9 numbers between 1 and 100
        for i in range(10):
            yield random.randint(1, 100)

        # returns a 10th number between 1000 and 2000
        yield random.randint(1000,2000)

    def __iter__(self):
        data = []
        for i in range(self.num_draws):
            data.append(next(iter(self.my_lottery())))
        yield data

two_draws = multiple_lottery_draws(2)

然而,虽然发电机本身工作得很好,

for i in two_draws.my_lottery(): print i
# prints: 52,12,61,67,30,78,84,90,69,31,1069

如果我尝试从包装类中获取迷你批次,我只得到1个项目

for i in two_draws: print i
# prints: [74, 95]

我做错了什么?

2 个答案:

答案 0 :(得分:3)

您只需拨打yield一次。尝试这样的事情:

def __iter__(self):
    data = []

    for i in self.my_lottery():
        data.append(i)

        if len(data) == self.num_draws:
            yield data
            data = []

    if data:
        yield data

答案 1 :(得分:0)

请注意,在my_lottery中,您调用yield 10次(在循环中),它会产生10个值。但是在__iter__中,您只需调用yield一次,因此只会产生一批值。