Python中實現iterator

xiao911 8年前發布 | 8K 次閱讀 Python Python開發

今天創建了一個實體類,大致如下:

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的魅力及極客之處。

來自:https://zhuanlan.zhihu.com/p/23292802

 

 本文由用戶 xiao911 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!