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的魅力及極客之處。
來自:https://zhuanlan.zhihu.com/p/23292802
本文由用戶 xiao911 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!