概述
迭代器是存取集合元素的一種方式。迭代器物件從集合的第一個元素開始訪問,直到所有的元素被訪問結束。迭代器只能往前不會後退。
延遲計算或惰性求值 (Lazy evaluation)
#迭代器不要求你事先準備好整個迭代過程中所有的元素。只是在迭代至某個元素時才計算該元素,而在這之前或之後,元素可以不存在或被銷毀。這個特點使得它特別適合用來遍歷一些巨大的或是無限的集合。
今天創建了一個實體類,大致如下:
#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
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]