python中實(shí)現(xiàn)迭代器(iterator)的方法示例
概述
迭代器是訪問集合元素的一種方式。迭代器對象從集合的第一個元素開始訪問,直到所有的元素被訪問完結(jié)束。迭代器只能往前不會后退。
延遲計(jì)算或惰性求值 (Lazy evaluation)
迭代器不要求你事先準(zhǔn)備好整個迭代過程中所有的元素。僅僅是在迭代至某個元素時才計(jì)算該元素,而在這之前或之后,元素可以不存在或者被銷毀。這個特點(diǎn)使得它特別適合用于遍歷一些巨大的或是無限的集合。
今天創(chuàng)建了一個實(shí)體類,大致如下:
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 # 月結(jié)費(fèi)用 self.return_amount = return_amount # 返還金額
然后創(chuàng)建一個實(shí)體列表:
accounts = [Account("張三", "年費(fèi)用戶", 450.00, 50), Account("李四", "月結(jié)用戶", 100.00), Account("楊不悔", "月結(jié)用戶", 190.00, 25), Account("任我行", "月結(jié)用戶", 70.00, 10), Account("凌未風(fēng)", "年費(fèi)用戶", 400.00, 40)]
我想要執(zhí)行next()
功能,也就是需要的時候“next”一下,得到List中的下一個元素。
直接測試一下:
結(jié)果發(fā)現(xiàn)List不支持next()
特性。這時候,List只是一個iterable,而不是iterator。
iterable和iterator的區(qū)別如下:
- iterable —— 只實(shí)現(xiàn)了__iter__的對象;
- iterator —— 同時實(shí)現(xiàn)了__iter__和__next__方法的對象。
其中, __iter__
返回iterator對象, __next__
則返回迭代過程的下一個元素。
1. 讓列表成為iterator
要讓前面的accounts List成為iterator只需簡單的一個iter()
函數(shù):
accounts_iterator = iter(accounts) (next(accounts_iterator)).account_name
結(jié)果如下圖所示:
這么簡單的函數(shù),估計(jì)還是有不少Python開發(fā)者不知道吧?
2. 自定義iterator對象
擴(kuò)展開來講,如何定義自己的iterator對象呢?其實(shí)也就是按照上面的定義,實(shí)現(xiàn)__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]
運(yùn)行結(jié)果如:
通過這一陣折騰,next()功能就實(shí)現(xiàn)了。Python有不少意外的功能,還等著我們不斷去探究,也許這就是Python的魅力及極客之處。
總結(jié)
以上就是這篇文章的全部內(nèi)容了,希望本文的內(nèi)容對大家學(xué)習(xí)或者使用python能帶來一定的幫助,如果有疑問大家可以留言交流。
相關(guān)文章
Python使用FTP上傳文件的實(shí)現(xiàn)示例
本文主要介紹了Python使用FTP上傳文件的實(shí)現(xiàn)示例,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2023-03-03Python 模擬生成動態(tài)產(chǎn)生驗(yàn)證碼圖片的方法
這篇文章主要介紹了Python 模擬生成動態(tài)產(chǎn)生驗(yàn)證碼圖片的方法,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-02-02Django3基于WebSocket實(shí)現(xiàn)WebShell的詳細(xì)過程
最近工作中需要開發(fā)前端操作遠(yuǎn)程虛擬機(jī)的功能,簡稱WebShell,普通應(yīng)用大部分用的都是wsgi.py配合nginx部署線上服務(wù). 這次主要使用asgi.py,具體實(shí)現(xiàn)過程跟隨小編一起看看吧2021-08-08關(guān)于Python中空格字符串處理的技巧總結(jié)
在我們?nèi)粘9ぷ髦薪?jīng)常會遇到字符串處理,大家應(yīng)該都不陌生,但空格字符串呢?會不會就不太熟悉了呢?所以下面這篇文章就來給大家總結(jié)了關(guān)于Python中空格字符串處理的技巧,需要的朋友可以參考借鑒,下面來一起看看吧。2017-08-08Python異常處理try語句應(yīng)用技巧實(shí)例探究
異常處理在Python中是至關(guān)重要的,try-except是用于捕獲和處理異常的核心機(jī)制之一,本文就帶大家深入了解如何使用try-except,處理各種異常情況2024-01-01