行为型模式之迭代器INTERATOR

一、意图

提供一种方法顺序访问一个聚合对象中各个元素 , 而又不需暴露该对象的内部表示。

二、图解

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)
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值