這篇文章主要講解了“關(guān)于Python迭代器的問題有哪些”,文中的講解內(nèi)容簡(jiǎn)單清晰,易于學(xué)習(xí)與理解,下面請(qǐng)大家跟著小編的思路慢慢深入,一起來研究和學(xué)習(xí)“關(guān)于Python迭代器的問題有哪些”吧!
站在用戶的角度思考問題,與客戶深入溝通,找到新干網(wǎng)站設(shè)計(jì)與新干網(wǎng)站推廣的解決方案,憑借多年的經(jīng)驗(yàn),讓設(shè)計(jì)與互聯(lián)網(wǎng)技術(shù)結(jié)合,創(chuàng)造個(gè)性化、用戶體驗(yàn)好的作品,建站類型包括:網(wǎng)站建設(shè)、網(wǎng)站設(shè)計(jì)、企業(yè)官網(wǎng)、英文網(wǎng)站、手機(jī)端網(wǎng)站、網(wǎng)站推廣、域名注冊(cè)、網(wǎng)站空間、企業(yè)郵箱。業(yè)務(wù)覆蓋新干地區(qū)。
第一個(gè)問題:什么是迭代器?
迭代器,英文 Iterator,它首先是個(gè)對(duì)象,其次它是訪問可迭代序列(Iterable)的一種方式。通常其從序列的第一個(gè)元素開始訪問,直到所有的元素都被訪問才結(jié)束。
迭代器又是一個(gè)特殊的對(duì)象,特殊在于它必須實(shí)現(xiàn)兩個(gè)方法:__iter__和__next__.
第二個(gè)問題:為什么要有迭代器?
迭代器存在的一個(gè)最重要價(jià)值:節(jié)省內(nèi)存,這在小數(shù)據(jù)量時(shí)無(wú)足輕重。
但是,當(dāng)數(shù)據(jù)量大或者對(duì)程序要求性能高時(shí),它的價(jià)值凸顯。
第三個(gè)問題:迭代器怎么節(jié)省內(nèi)存了?
只知道使用迭代器能節(jié)省內(nèi)存,但卻不知道怎么使用才能節(jié)省內(nèi)存,下面就來回答這個(gè)問題。
首先創(chuàng)建一個(gè)list:
In [1]: a=[1,3,5,9,10]
其次,列表內(nèi)每個(gè)元素+1,創(chuàng)建一個(gè)新列表
In [2]: a1 = [i+1 for i in a]
依次打印a1中每個(gè)元素:
In [8]: for i in a1: ...: print(i)
上面操作等價(jià)于:
a1 = [] for i in a: a1.append(i+1) for i in a1: print(i)
空間復(fù)雜度為 O(n),n為列表a內(nèi)元素個(gè)數(shù)。
但是,使用迭代器實(shí)現(xiàn)上面的元素+1并打印的空間復(fù)雜度是多少呢?
ait = (i+1 for i in a) # 得到生成器,也是一種特殊的迭代器 for i in ait: print(i)
上面操作等價(jià)于:
for i in a: print(i+1)
不需要額外空間,所以使用迭代器加1并打印的空間復(fù)雜度為O(1).
結(jié)論:迭代器更加節(jié)省空間!
第四個(gè)問題:如何自定義一個(gè)迭代器?
上面說過,迭代器對(duì)象必須要實(shí)現(xiàn)兩個(gè)方法,為了更加具體,我們演示如何自定義一個(gè)迭代器。
自定義一個(gè)迭代器,實(shí)現(xiàn)斐波那契數(shù)列:
#斐波那契數(shù)列 class Fabs(): def __init__(self,max): self.max=max self.n,self.a,self.b=0,0,1 #定義__iter__方法 def __iter__(self): return self #定義__next__方法 def __next__(self): if self.n<self.max: tmp=self.b self.a,selfself.b=self.b,self.a+self.b self.n+=1 return tmp raise StopIteration
使用這個(gè)迭代器,打印斐波那契數(shù)列前10項(xiàng):
In [13]: for item in Fabs(10): ...: print(item,end=' ') 1 1 2 3 5 8 13 21 34 55
第五個(gè)問題:迭代器使用有哪些注意事項(xiàng)?
迭代器只能前進(jìn)不能回退!
也就是說一旦迭代結(jié)束,要想再使用此迭代器對(duì)象從頭開始遍歷元素,將是不可行的!
In [14]: a=iter([1,4,5]) In [16]: next(a) Out[16]: 1 In [17]: next(a) Out[17]: 4 In [18]: next(a) Out[18]: 5 # 要想再使用此迭代器對(duì)象從頭開始遍歷元素,將是不可行的! In [19]: next(a) # 拋出異常:StopIteration:
使用內(nèi)置函數(shù)iter,可將Iterable序列轉(zhuǎn)化為迭代器。
感謝各位的閱讀,以上就是“關(guān)于Python迭代器的問題有哪些”的內(nèi)容了,經(jīng)過本文的學(xué)習(xí)后,相信大家對(duì)關(guān)于Python迭代器的問題有哪些這一問題有了更深刻的體會(huì),具體使用情況還需要大家實(shí)踐驗(yàn)證。這里是創(chuàng)新互聯(lián),小編將為大家推送更多相關(guān)知識(shí)點(diǎn)的文章,歡迎關(guān)注!
網(wǎng)頁(yè)題目:關(guān)于Python迭代器的問題有哪些
分享地址:http://jinyejixie.com/article8/gpipop.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)頁(yè)設(shè)計(jì)公司、手機(jī)網(wǎng)站建設(shè)、網(wǎng)站維護(hù)、Google、網(wǎng)站排名、品牌網(wǎng)站設(shè)計(jì)
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)