Python中实现iterator
2016.10.29 20:24:55

今天创建了一个实体类,大致如下:

class Account():
    def __init__(self,
                 account_name,
                 account_type,
                 account_cost,
                 return_amount=0):
        self.account_name  = account_name   # 账户名
        self.account_type  = account_type   # 账户类型
        self.account_cost  = account_cost   # 月结费用
        self.return_amount = return_amount  # 返还金额

然后创建一个实体列表:

accounts = [Account("张三", "年费用户", 450.00, 50),
            Account("李四", "月结用户", 100.00),
            Account("杨不悔", "月结用户", 190.00, 25),
            Account("任我行", "月结用户", 70.00, 10),
            Account("凌未风", "年费用户", 400.00, 40)]

我想要执行next()功能,也就是需要的时候“next”一下,得到List中的下一个元素。直接测试一下:

结果发现List不支持next()特性。这时候,List只是一个iterable,而不是iteratoriterableiterator的区别如下:

  • iterable —— 只实现了__iter__的对象;
  • iterator —— 同时实现了__iter____next__方法的对象。

其中,__iter__返回iterator对象,__next__则返回迭代过程的下一个元素。

1. 让列表成为iterator

要让前面的accounts List成为iterator只需简单的一个iter()函数:

accounts_iterator = iter(accounts)
(next(accounts_iterator)).account_name

结果如下图所示:

这么简单的函数,估计还是有不少Python开发者不知道吧?

2. 自定义iterator对象

扩展开来讲,如何定义自己的iterator对象呢?其实也就是按照上面的定义,实现__iter____next__方法。

我们接下来定义一个AccountIterator类:

class AccountIterator():
    def __init__(self, accounts):
        self.accounts  = accounts  # 账户集合
        self.index     = 0

    def __iter__(self):
        return self

    def __next__(self):
        if self.index >= len(self.accounts):
            raise StopIteration("到头了...")
        else:
            self.index += 1
            return self.accounts[self.index-1]

运行结果如:

通过这一阵折腾,next()功能就实现了。Python有不少意外的功能,还等着我们不断去探究,也许这就是Python的魅力及极客之处。


(4)
评论(3条)

RockyWu 2016.10.31 11:29

一个小细节,iterator 实现的是iter和next,不是next


RockyWu 2016.10.31 11:30

不是next 而是next


RockyWu 2016.10.31 11:31

没有下划线...怎么不显示下划线呢


发表评论请先登录或注册