摘要:迭代器迭代器用于循環(huán)構(gòu)建和擴(kuò)展集合類型逐行遍歷文本文件列表推導(dǎo)字典推導(dǎo)和集合推導(dǎo)元組拆包調(diào)用函數(shù)時(shí),使用拆包實(shí)參解釋器需要迭代對(duì)象時(shí),會(huì)自動(dòng)調(diào)用內(nèi)置的函數(shù),有以下功能檢查對(duì)象是否實(shí)現(xiàn)了方法,如果實(shí)現(xiàn)了就調(diào)用它,獲取一個(gè)迭代器。
迭代器
迭代器用于:
for 循環(huán)
構(gòu)建和擴(kuò)展集合類型
逐行遍歷文本文件
列表推導(dǎo)、 字典推導(dǎo)和集合推導(dǎo)
元組拆包
調(diào)用函數(shù)時(shí), 使用 * 拆包實(shí)參
解釋器需要迭代對(duì)象x時(shí),會(huì)自動(dòng)調(diào)用iter(x);
內(nèi)置的iter函數(shù),有以下功能:
檢查對(duì)象是否實(shí)現(xiàn)了 _iter _ 方法, 如果實(shí)現(xiàn)了就調(diào)用它,獲取一個(gè)迭代器。
如果沒有實(shí)現(xiàn) _iter _ 方法,但是實(shí)現(xiàn)了 _getitem _ 方法,Python 會(huì)創(chuàng)建一個(gè)迭代器,嘗試按順序(從索引 0 開始)獲取元素。
如果嘗試失敗,Python拋出TypeError異常,通常會(huì)提示"C objectis not iterable"(C 對(duì)象不可迭代),其中C是目標(biāo)對(duì)象所屬的類。
__next__ #返回下一個(gè)可用的元素,如果沒有元素了,拋出StopIteration異常 __iter__ #返回self, 以便在應(yīng)該使用可迭代對(duì)象的地方使用迭代器,例如在for循環(huán)中
import re RE_WORD = re.compile("w+") class Sentence: # 可迭代的對(duì)象 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: 實(shí)現(xiàn)__iter__方法,并返回了一個(gè)迭代器實(shí)例SentenceIterator,所以是可迭代的對(duì)象;
{#}23: 實(shí)現(xiàn)__next__和__iter__,并返回了迭代器本身;
{#}123:說(shuō)明:迭代器可以迭代,但是可迭代的對(duì)象不是迭代器;
生成器 生成器函數(shù)只要Python函數(shù)的定義體中有yield關(guān)鍵字,那么事實(shí)上定義的是一個(gè)generator function,調(diào)用這個(gè)generator function返回值是一個(gè)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:雖然函數(shù)gen_AB沒有return,但是依然返回了生成器對(duì)象;
{#}2:此時(shí)沒有執(zhí)行函數(shù)gen_AB的內(nèi)容;
{#}3:生成器一定是迭代器(反之不成立);
{#}3: 當(dāng)調(diào)用generator的next方法,generator會(huì)執(zhí)行到y(tǒng)ield表達(dá)式處,返回yield表達(dá)式的內(nèi)容,然后暫停(掛起)在這個(gè)地方,等待下個(gè)next的執(zhí)行;
生成器表達(dá)式(generator expression)生成器表達(dá)式可以理解為列表推導(dǎo)的惰性版本: 不會(huì)迫切地構(gòu)建列表,
而是返回一個(gè)生成器, 按需惰性生成元素。
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:列表推導(dǎo)迫切迭代函數(shù)gen_AB,打印出start continue end. res1=[AAA,BBB];
{#}2: 輸出AAA,BBB;
{#}3:把生成器表達(dá)式返回的值賦值給res2。只需調(diào)用gen_AB()函數(shù),雖然調(diào)用時(shí)會(huì)返回一個(gè)生成器,但是這里并不使用;
參考流暢的Python.
https://www.cnblogs.com/MnCu8...
http://www.cnblogs.com/xybaby...
http://python.jobbole.com/87805/
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://m.hztianpu.com/yun/41585.html
摘要:本文重點(diǎn)掌握可迭代的對(duì)象的定義掌握可迭代對(duì)象迭代器與生成器之間的關(guān)系和異同熟悉標(biāo)準(zhǔn)庫(kù)中生成器。二迭代器迭代器介紹迭代器用于從集合中取出元素的對(duì)象。若想再次迭代須重建迭代器。迭代器檢查方式調(diào)用,。區(qū)別可迭代的對(duì)象不是迭代器。 導(dǎo)語(yǔ):本文章記錄了本人在學(xué)習(xí)Python基礎(chǔ)之控制流程篇的重點(diǎn)知識(shí)及個(gè)人心得,打算入門Python的朋友們可以來(lái)一起學(xué)習(xí)并交流。 本文重點(diǎn): 1、掌握可迭代的對(duì)象的...
摘要:來(lái)說(shuō)說(shuō)迭代器和生成器,還有可迭代對(duì)象和生成器表達(dá)式。有點(diǎn)繞是不是,其實(shí),一般只要知道可迭代對(duì)象以及它是如何實(shí)現(xiàn)的就行了,中常常用生成器來(lái)代替迭代器,可以說(shuō),生成器就是迭代器。 來(lái)說(shuō)說(shuō)迭代器和生成器,還有可迭代對(duì)象和生成器表達(dá)式。 之前簡(jiǎn)單的提到過(guò),一個(gè)對(duì)象是可迭代的可以理解為能夠使用for循環(huán)。這樣說(shuō)其實(shí)不太準(zhǔn)確,某個(gè)對(duì)象可迭代是因?yàn)樗鼉?nèi)部實(shí)現(xiàn)了$__iter__$這個(gè)特殊方法。比如在...
摘要:可迭代的對(duì)象迭代器和生成器理念迭代是數(shù)據(jù)處理的基石??傻膶?duì)象與迭代器的對(duì)比從可迭代的對(duì)象中獲取迭代器標(biāo)準(zhǔn)的迭代器接口有兩個(gè)方法。此外,也沒有辦法還原迭代器。最終,函數(shù)的定義體返回時(shí),外層的生成器對(duì)象會(huì)拋出異常這一點(diǎn)與迭代器協(xié)議一致。 可迭代的對(duì)象、迭代器和生成器 理念 迭代是數(shù)據(jù)處理的基石。掃描內(nèi)存中放不下的數(shù)據(jù)集時(shí),我們要找到一種惰性獲取數(shù)據(jù)項(xiàng)的方式,即按需一次獲取一個(gè)數(shù)據(jù)項(xiàng)。這...
摘要:導(dǎo)語(yǔ)本文章匯總了本人在學(xué)習(xí)基礎(chǔ)之緒論篇數(shù)據(jù)結(jié)構(gòu)篇函數(shù)篇面向?qū)ο笃刂屏鞒唐驮幊唐獙W(xué)習(xí)筆記的鏈接,打算入門的朋友們可以按需查看并交流。 導(dǎo)語(yǔ):本文章匯總了本人在學(xué)習(xí)Python基礎(chǔ)之緒論篇、數(shù)據(jù)結(jié)構(gòu)篇、函數(shù)篇、面向?qū)ο笃?、控制流程篇和元編程篇學(xué)習(xí)筆記的鏈接,打算入門Python的朋友們可以按需查看并交流。 第一部分:緒論篇 1、Python數(shù)據(jù)模型 第二部分:數(shù)據(jù)結(jié)構(gòu)篇 2、序列構(gòu)成...
文章內(nèi)容主要是詳細(xì)介紹了pythonmemory_profiler庫(kù)制作器和迭代器cpu占用的時(shí)間分析,文章內(nèi)容緊扣主題進(jìn)行詳盡的基本介紹,感興趣的朋友可以了解一下 不進(jìn)行計(jì)算時(shí),生成器和list空間占用 importtime frommemory_profilerimportprofile profile(precision=4) deflist_fun(): start...
閱讀 2652·2021-11-23 09:51
閱讀 2569·2021-09-30 09:48
閱讀 1166·2021-09-10 10:51
閱讀 2288·2021-08-12 13:22
閱讀 3642·2021-08-11 10:24
閱讀 2244·2019-08-30 15:55
閱讀 708·2019-08-30 14:05
閱讀 3267·2019-08-30 13:03