首頁  >  文章  >  後端開發  >  python中實作迭代器(iterator)的方法範例

python中實作迭代器(iterator)的方法範例

高洛峰
高洛峰原創
2017-02-23 15:47:221822瀏覽

概述

迭代器是存取集合元素的一種方式。迭代器物件從集合的第一個元素開始訪問,直到所有的元素被訪問結束。迭代器只能往前不會後退。

延遲計算或惰性求值 (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中的下一個元素。

直接測試一下:

python中實作迭代器(iterator)的方法範例

#結果發現List不支援next()特性。這時候,List只是一個iterable,而不是iterator。

iterable與iterator的差異如下:

  1. #iterable - 只實作了__iter__的物件;


iterator —— 同時實作了__iter__和__next__方法的物件。

其中,

__iter__

返回iterator對象,python中實作迭代器(iterator)的方法範例__next__

則傳回迭代過程的下一個元素。

1. 讓清單成為iterator

要讓前面的accounts List成為iterator只需簡單的一個

iter()函數:

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

結果如下圖:

這麼簡單的函數,估計還是有不少Python開發者不知道吧?

2. 自訂iterator物件

python中實作迭代器(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的魅力及極客之處。 ######更多python中實作迭代器(iterator)的方法範例相關文章請關注PHP中文網! ###
陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn