Python中實現iterator
今天創建了一個實體類,大致如下:
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,而不是iterator。iterable和iterator的區別如下:
- 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的魅力及極客之處。
我的個人博客:http://www.2gua.info/
推薦閱讀:
※如何用7天學會開發 Django 版的蘋果官網?
※左手用R右手Python系列之——noSQL基礎與mongodb入門
※OpenCV:圖片操作基本知識
※Python 機器學習之 SVM 預測買賣(標的物:比特幣)
※Python魔法方法指南
TAG:Python |