摘要:迭代器迭代器用于循環構建和擴展集合類型逐行遍歷文本文件列表推導字典推導和集合推導元組拆包調用函數時,使用拆包實參解釋器需要迭代對象時,會自動調用內置的函數,有以下功能檢查對象是否實現了方法,如果實現了就調用它,獲取一個迭代器。
迭代器
迭代器用于:
for 循環
構建和擴展集合類型
逐行遍歷文本文件
列表推導、 字典推導和集合推導
元組拆包
調用函數時, 使用 * 拆包實參
解釋器需要迭代對象x時,會自動調用iter(x);
內置的iter函數,有以下功能:
檢查對象是否實現了 _iter _ 方法, 如果實現了就調用它,獲取一個迭代器。
如果沒有實現 _iter _ 方法,但是實現了 _getitem _ 方法,Python 會創建一個迭代器,嘗試按順序(從索引 0 開始)獲取元素。
如果嘗試失敗,Python拋出TypeError異常,通常會提示"C objectis not iterable"(C 對象不可迭代),其中C是目標對象所屬的類。
__next__ #返回下一個可用的元素,如果沒有元素了,拋出StopIteration異常 __iter__ #返回self, 以便在應該使用可迭代對象的地方使用迭代器,例如在for循環中
import re RE_WORD = re.compile("w+") class Sentence: # 可迭代的對象 def __init__(self, text): self.text = text self.words = RE_WORD.findall(text) def __iter__(self): # 1 return SentenceIterator(self.words) class SentenceIterator: # 迭代器 def __init__(self, words): self.words = words self.index = 0 def __next__(self): # 2 try: word = self.words[self.index] except IndexError: raise StopIteration() self.index += 1 return word def __iter__(self): # 3 return self s = Sentence(""The time has come," the Walrus said,") for word in s: print(word) -------------------- The time has come the Walrus said
{#}1: 實現__iter__方法,并返回了一個迭代器實例SentenceIterator,所以是可迭代的對象;
{#}23: 實現__next__和__iter__,并返回了迭代器本身;
{#}123:說明:迭代器可以迭代,但是可迭代的對象不是迭代器;
生成器 生成器函數只要Python函數的定義體中有yield關鍵字,那么事實上定義的是一個generator function,調用這個generator function返回值是一個generator。
def gen_AB(): print("start") yield "A" print("continue") yield "B" print("end.") print(gen_AB()) # 1 gen_AB() # 2 for item in gen_AB(): # 3 print("--->", item) ----------------start ---> A continue ---> B end.
{#}1:雖然函數gen_AB沒有return,但是依然返回了生成器對象;
{#}2:此時沒有執行函數gen_AB的內容;
{#}3:生成器一定是迭代器(反之不成立);
{#}3: 當調用generator的next方法,generator會執行到yield表達式處,返回yield表達式的內容,然后暫停(掛起)在這個地方,等待下個next的執行;
生成器表達式(generator expression)生成器表達式可以理解為列表推導的惰性版本: 不會迫切地構建列表,
而是返回一個生成器, 按需惰性生成元素。
def gen_AB(): print("start") yield "A" print("continue") yield "B" print("end.") res1 = [x*3 for x in gen_AB()] # 1 for i in res1: print("-->", i) # 2 res2 = (x*3 for x in gen_AB()) # 3 for i in res2: print("--->", i) ---------------- start continue end. --> AAA --> BBB start ---> AAA continue ---> BBB end.
{#}1:列表推導迫切迭代函數gen_AB,打印出start continue end. res1=[AAA,BBB];
{#}2: 輸出AAA,BBB;
{#}3:把生成器表達式返回的值賦值給res2。只需調用gen_AB()函數,雖然調用時會返回一個生成器,但是這里并不使用;
參考流暢的Python.
https://www.cnblogs.com/MnCu8...
http://www.cnblogs.com/xybaby...
http://python.jobbole.com/87805/
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/41585.html
摘要:本文重點掌握可迭代的對象的定義掌握可迭代對象迭代器與生成器之間的關系和異同熟悉標準庫中生成器。二迭代器迭代器介紹迭代器用于從集合中取出元素的對象。若想再次迭代須重建迭代器。迭代器檢查方式調用,。區別可迭代的對象不是迭代器。 導語:本文章記錄了本人在學習Python基礎之控制流程篇的重點知識及個人心得,打算入門Python的朋友們可以來一起學習并交流。 本文重點: 1、掌握可迭代的對象的...
摘要:來說說迭代器和生成器,還有可迭代對象和生成器表達式。有點繞是不是,其實,一般只要知道可迭代對象以及它是如何實現的就行了,中常常用生成器來代替迭代器,可以說,生成器就是迭代器。 來說說迭代器和生成器,還有可迭代對象和生成器表達式。 之前簡單的提到過,一個對象是可迭代的可以理解為能夠使用for循環。這樣說其實不太準確,某個對象可迭代是因為它內部實現了$__iter__$這個特殊方法。比如在...
摘要:可迭代的對象迭代器和生成器理念迭代是數據處理的基石。可迭代的對象與迭代器的對比從可迭代的對象中獲取迭代器標準的迭代器接口有兩個方法。此外,也沒有辦法還原迭代器。最終,函數的定義體返回時,外層的生成器對象會拋出異常這一點與迭代器協議一致。 可迭代的對象、迭代器和生成器 理念 迭代是數據處理的基石。掃描內存中放不下的數據集時,我們要找到一種惰性獲取數據項的方式,即按需一次獲取一個數據項。這...
摘要:導語本文章匯總了本人在學習基礎之緒論篇數據結構篇函數篇面向對象篇控制流程篇和元編程篇學習筆記的鏈接,打算入門的朋友們可以按需查看并交流。 導語:本文章匯總了本人在學習Python基礎之緒論篇、數據結構篇、函數篇、面向對象篇、控制流程篇和元編程篇學習筆記的鏈接,打算入門Python的朋友們可以按需查看并交流。 第一部分:緒論篇 1、Python數據模型 第二部分:數據結構篇 2、序列構成...
文章內容主要是詳細介紹了pythonmemory_profiler庫制作器和迭代器cpu占用的時間分析,文章內容緊扣主題進行詳盡的基本介紹,感興趣的朋友可以了解一下 不進行計算時,生成器和list空間占用 importtime frommemory_profilerimportprofile profile(precision=4) deflist_fun(): start...
閱讀 2569·2021-11-23 09:51
閱讀 2481·2021-09-30 09:48
閱讀 1076·2021-09-10 10:51
閱讀 2213·2021-08-12 13:22
閱讀 3568·2021-08-11 10:24
閱讀 2167·2019-08-30 15:55
閱讀 646·2019-08-30 14:05
閱讀 3211·2019-08-30 13:03