一、意图
提供一种方法顺序访问一个聚合对象中各个元素 , 而又不需暴露该对象的内部表示。
二、图解
C++的STL常用类实现机制。将类列表迭代部分从类中分离出来放入一个迭代器。
但上图List和ListIteraotr耦合在一起。可将迭代器概念推广至多态迭代。
为了让迭代器无需依赖具体列表子类,可以让列表对象类实例化迭代器。迭代器对复杂聚合可以使用多种方式进行遍历。且简化了聚合的接口。同一个聚合上可以有多个迭代器。
三、结构
在机器学习中一般采用msgd方法训练数据,这就需要每次产生一定数量样本,因此常用的设计模式就是迭代器模式:
class DataInput:
def __init__(self, data, batch_size):
self.batch_size = batch_size
# 需要迭代的数据
self.data = data
# 可迭代次数
self.epoch_size = len(self.data) // self.batch_size
if self.epoch_size * self.batch_size < len(self.data):
self.epoch_size += 1
# 迭代过程中用于当前迭代的index
self.i = 0
def __iter__(self):
return self
def next(self):
# 达到迭代次数,停止迭代
if self.i == self.epoch_size:
raise StopIteration
ts = self.data[self.i * self.batch_size : min((self.i+1) * self.batch_size,
len(self.data))]
self.i += 1
u, i, y, sl = [], [], [], []
for t in ts:
u.append(t[0])
i.append(t[2])
y.append(t[3])
sl.append(len(t[1]))
max_sl = max(sl)
# 返回当前迭代index的数据
return self.i, (u, i, y, sl)