我正在尝试创建一个包装生成器函数的类,这样我就可以批量生成预定义大小的生成器中的项目。
即。如果我有一个包含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]
我做错了什么?
答案 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
一次,因此只会产生一批值。