Python迭代和迭代器_第1頁
Python迭代和迭代器_第2頁
Python迭代和迭代器_第3頁
Python迭代和迭代器_第4頁
Python迭代和迭代器_第5頁
已閱讀5頁,還剩4頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

1、我們將要來學(xué)習(xí)python的重要概念迭代和迭代器,通過簡(jiǎn)單實(shí)用的例子如列表迭代器和xrange。可迭代一個(gè)對(duì)象,物理或者虛擬存儲(chǔ)的序列。list,tuple,strins,dicttionary,set以及生成器對(duì)象都是可迭代的,整型數(shù)是不可迭代的。如果你不確定哪個(gè)可迭代哪個(gè)不可以,你需要用python內(nèi)建的iter()來幫忙。>>> iter(1,2,3)<listiterator object at 0x026C8970>>>> iter(1:2, 2:4)<dictionary-keyiterator object at 0x026C

2、C1B0>>>> iter(1234)Traceback (most recent call last): File "<pyshell#145>", line 1, in <module> iter(1234)TypeError: 'int' object is not iterableiter()為list返回了listiterator對(duì)象,為dictionary返回了dictionary-keyiterator對(duì)象。類似對(duì)其他可迭代類型也會(huì)返回迭代器對(duì)象。iter()用在自定義的類型會(huì)怎樣呢?我們先自己定

3、義一個(gè)String類:class String(object): def _init_(self, val): self.val = val def _str_(self): return self.valst = String('sample string')那么,st是可迭代的嗎?>>> iter(st)TypeError: 'String' object is not iterable你可能會(huì)有幾個(gè)問題要問:· 怎么讓自定義的類型可迭代?· iter()究竟做了些什么?讓我們補(bǔ)充String類來找找答案class St

4、ring(object): def _init_(self, val): self.val = val def _str_(self): return self.val def _iter_(self): print "This is _iter_ method of String class" return iter(self.val) #self.val is python string so iter() will return it's iterator>>> st = String('Sample String')>

5、>> iter(st)This is _iter_ method of String class<iterator object at 0x026C8150>在String類中需要一個(gè)_iter_方法把String類型變成可迭代的,這就是說iter內(nèi)部調(diào)用了iterable._iter_()別急,不是只有增加_iter()方法這一種途徑class String(object): def _init_(self, val): self.val = val def _str_(self): return self.val def _getitem_(self, index)

6、: return self.valindex>>> st = String('Sample String')>>> iter(st)<iterator object at 0x0273AC10>itr也會(huì)調(diào)用iterable._getitem_(),所以我們用_getitem_方法讓String類型可迭代。如果在String類中同時(shí)使用_iter_()和_getitem_(),就只有_iter_會(huì)起作用。自動(dòng)迭代for循環(huán)會(huì)自動(dòng)迭代for x in iterable: print x我們可以不用for循環(huán)來實(shí)現(xiàn)嗎?def iter

7、ate_while(iterable): index = 0 while(i< len(iterable): print iterablei i +=1這樣做對(duì)list和string是管用的,但對(duì)dictionary不會(huì)奏效,所以這絕對(duì)不是python式的迭代,也肯定不能模擬for循環(huán)的功能。我們先看迭代器,等下回再過頭來。迭代器關(guān)于迭代器先說幾條.· 1. 迭代器對(duì)象在迭代過程中會(huì)會(huì)產(chǎn)生可迭代的值,next()或者_(dá)next()_是迭代器用來產(chǎn)生下一個(gè)值的方法。· 2. 它會(huì)在迭代結(jié)束后發(fā)出StopIteration異常。· 3. iter()函數(shù)返回迭代

8、器對(duì)象· 4. 如果iter()函數(shù)被用在迭代器對(duì)象,它會(huì)返回對(duì)象本身我們?cè)囈辉嚹7耭or循環(huán)def simulate_for_loop(iterable): it = iter(iterable) while(True):try: print next(it)except StopIteration: break>>> simulate_for_loop(23,12,34,56)23123456前面我們看過了iterable類,我們知道iter會(huì)返回迭代器對(duì)象?,F(xiàn)在我們?cè)囍斫獾黝惖脑O(shè)計(jì)。class Iterator: def _init_(self, ite

9、rable) self.iterable = iterable . . def _iter_(self): #iter should return self if called on iterator return self def next(self): #Use _next_() in python 3.x if condition: #it should raise StopIteration exception if no next element is left to return raise StopIteration我們學(xué)了夠多的迭代和迭代器,在python程序中不會(huì)用到比這更深

10、的了。但是為了學(xué)習(xí)的目的我們就到這兒。列表迭代器你可能會(huì)在面試中寫這個(gè),所以打起精神來注意了class list_iter(object): def _init_(self, list_data): self.list_data = list_data self.index = 0 def _iter_(self): return self def next(self): #Use _next_ in python 3.x if self.index < len(self.list_data): val = self.list_dataself.index self.index += 1

11、 return val else: raise StopIteration()我們來用list_iter自己定義一個(gè)列表迭代器class List(object): def _init_(self, val): self.val = val def _iter_(self): return list_iter(self.val)>>> ls = List(1,2,34)>>> it = iter(ls)>>> next(it)1>>> next(it)2>>> next(it)34>>>

12、 next(it)Traceback (most recent call last): File "<pyshell#254>", line 1, in <module> next(it) File "<pyshell#228>", line 13, in next raise StopIteration()StopIterationxrange從一個(gè)問題開始xrange是迭代還是迭代器?我們來看看>>> x = xrange(10)>>> type(x)<type '

13、xrange'>幾個(gè)關(guān)鍵點(diǎn):· 1. iter(xrange(num)應(yīng)該被支持· 2. 如果iter(xrange(num)返回同樣的對(duì)象(xrange類型)那xrange就是迭代器· 3. 如果iter(xrange(num)返回一個(gè)迭代器對(duì)象那xrange就是迭代>>> iter(xrange(10)<rangeiterator object at 0x0264EFE0>它返回了rangeiterator,所以我們完全可以叫它迭代器。讓我們用最少的xrange函數(shù)實(shí)現(xiàn)自己的xrangexrange_iteratorclass xrange_iter(object): def _init_(self, num): self.num = num self.start = 0 def _iter_(self): return self def next(self): if self.start < self.num: val = self.start self.start += 1 return val else: raise Sto

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論