日本综合一区二区|亚洲中文天堂综合|日韩欧美自拍一区|男女精品天堂一区|欧美自拍第6页亚洲成人精品一区|亚洲黄色天堂一区二区成人|超碰91偷拍第一页|日韩av夜夜嗨中文字幕|久久蜜综合视频官网|精美人妻一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時(shí)間:8:30-17:00
你可能遇到了下面的問題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營(yíng)銷解決方案
Python迭代和迭代器詳解

我們將要來學(xué)習(xí)python的重要概念迭代和迭代器,通過簡(jiǎn)單實(shí)用的例子如列表迭代器和xrange。

創(chuàng)新互聯(lián)-專業(yè)網(wǎng)站定制、快速模板網(wǎng)站建設(shè)、高性價(jià)比貴南網(wǎng)站開發(fā)、企業(yè)建站全套包干低至880元,成熟完善的模板庫,直接使用。一站式貴南網(wǎng)站制作公司更省心,省錢,快速模板網(wǎng)站建設(shè)找我們,業(yè)務(wù)覆蓋貴南地區(qū)。費(fèi)用合理售后完善,十余年實(shí)體公司更值得信賴。

可迭代

一個(gè)對(duì)象,物理或者虛擬存儲(chǔ)的序列。list,tuple,strins,dicttionary,set以及生成器對(duì)象都是可迭代的,整型數(shù)是不可迭代的。如果你不確定哪個(gè)可迭代哪個(gè)不可以,你需要用python內(nèi)建的iter()來幫忙。

 
 
  1. >>> iter([1,2,3]) 
  2.  
  3.  
  4. >>> iter({1:2, 2:4}) 
  5.  
  6.  
  7. >>> iter(1234) 
  8. Traceback (most recent call last): 
  9.   File "", line 1, in  
  10.     iter(1234) 
  11. TypeError: 'int' object is not iterable 

iter()為list返回了listiterator對(duì)象,為dictionary返回了dictionary-keyiterator對(duì)象。類似對(duì)其他可迭代類型也會(huì)返回迭代器對(duì)象。

iter()用在自定義的類型會(huì)怎樣呢?我們先自己定義一個(gè)String類:

 
 
  1. class String(object): 
  2.   def __init__(self, val): 
  3.     self.val = val 
  4.   def __str__(self): 
  5.     return self.val 
  6.  
  7. st = String('sample string') 

那么,st是可迭代的嗎?

 
 
  1. >>> iter(st) 
  2. TypeError: 'String' object is not iterable 

你可能會(huì)有幾個(gè)問題要問:

  • 怎么讓自定義的類型可迭代?

  • iter()究竟做了些什么?

讓我們補(bǔ)充String類來找找答案

 
 
  1. class String(object): 
  2.     def __init__(self, val): 
  3.         self.val = val 
  4.     def __str__(self): 
  5.         return self.val 
  6.     def __iter__(self): 
  7.         print "This is __iter__ method of String class" 
  8.         return iter(self.val)  #self.val is python string so iter() will return it's iterator 
  9.  
  10. >>> st = String('Sample String') 
  11. >>> iter(st) 
  12. This is __iter__ method of String class 
  13.  

在String類中需要一個(gè)’__iter__’方法把String類型變成可迭代的,這就是說’iter’內(nèi)部調(diào)用了’iterable.__iter__()’

別急,不是只有增加’__iter()’方法這一種途徑

 
 
  1. class String(object): 
  2.     def __init__(self, val): 
  3.         self.val = val 
  4.     def __str__(self): 
  5.         return self.val 
  6.     def __getitem__(self, index): 
  7.         return self.val[index] 
  8.  
  9. >>> st = String('Sample String') 
  10. >>> iter(st) 
  11.  

‘itr’也會(huì)調(diào)用’iterable.__getitem__()’,所以我們用’__getitem__’方法讓String類型可迭代。

如果在String類中同時(shí)使用’__iter__()’和’__getitem__()’,就只有’__iter__’會(huì)起作用。

自動(dòng)迭代

for循環(huán)會(huì)自動(dòng)迭代

 
 
  1. for x in iterable: 
  2.     print x 

我們可以不用for循環(huán)來實(shí)現(xiàn)嗎?

 
 
  1. def iterate_while(iterable): 
  2.     index = 0 
  3.     while(i< len(iterable)): 
  4.         print iterable[i] 
  5.         i +=1 

這樣做對(duì)list和string是管用的,但對(duì)dictionary不會(huì)奏效,所以這絕對(duì)不是python式的迭代,也肯定不能模擬for循環(huán)的功能。我們先看迭代器,等下回再過頭來。

迭代器

關(guān)于迭代器先說幾條………..

  • 1. 迭代器對(duì)象在迭代過程中會(huì)會(huì)產(chǎn)生可迭代的值,`next()`或者`__next()__`是迭代器用來產(chǎn)生下一個(gè)值的方法。

  • 2. 它會(huì)在迭代結(jié)束后發(fā)出StopIteration異常。

  • 3. `iter()`函數(shù)返回迭代器對(duì)象

  • 4. 如果`iter()`函數(shù)被用在迭代器對(duì)象,它會(huì)返回對(duì)象本身

我們?cè)囈辉嚹7耭or循環(huán)

 
 
  1. def simulate_for_loop(iterable): 
  2.     it = iter(iterable) 
  3.     while(True): 
  4. try: 
  5.      print next(it) 
  6. except StopIteration: 
  7.      break 
  8.  
  9. >>> simulate_for_loop([23,12,34,56]) 
  10. 23 
  11. 12 
  12. 34 
  13. 56 

前面我們看過了iterable類,我們知道iter會(huì)返回迭代器對(duì)象。

現(xiàn)在我們?cè)囍斫獾黝惖脑O(shè)計(jì)。

 
 
  1. class Iterator: 
  2.     def __init__(self, iterable) 
  3.         self.iterable = iterable 
  4.     . 
  5.     . 
  6.     def __iter__(self):  #iter should return self if called on iterator 
  7.         return self 
  8.     def next(self):  #Use __next__() in python 3.x 
  9.         if condition: #it should raise StopIteration exception if no next element is left to return 
  10.             raise StopIteration 

我們學(xué)了夠多的迭代和迭代器,在python程序中不會(huì)用到比這更深的了。

但是為了學(xué)習(xí)的目的我們就到這兒。。。。

列表迭代器

你可能會(huì)在面試中寫這個(gè),所以打起精神來注意了

 
 
  1. class list_iter(object): 
  2.     def __init__(self, list_data): 
  3.         self.list_data = list_data 
  4.         self.index = 0 
  5.     def __iter__(self): 
  6.         return self 
  7.     def next(self):   #Use __next__ in python 3.x 
  8.         if self.index < len(self.list_data): 
  9.             val = self.list_data[self.index] 
  10.             self.index += 1 
  11.             return val 
  12.         else: 
  13.             raise StopIteration() 

我們來用`list_iter`自己定義一個(gè)列表迭代器

 
 
  1. class List(object): 
  2.     def __init__(self, val): 
  3.         self.val = val 
  4.     def __iter__(self): 
  5.         return list_iter(self.val) 
  6.  
  7. >>> ls = List([1,2,34]) 
  8. >>> it = iter(ls) 
  9. >>> next(it) 
  10. >>> next(it) 
  11. >>> next(it) 
  12. 34 
  13. >>> next(it) 
  14.  
  15. Traceback (most recent call last): 
  16.   File "", line 1, in  
  17.     next(it) 
  18.   File "", line 13, in next 
  19.     raise StopIteration() 
  20. StopIteration 
  21.  
  22. xrange 

從一個(gè)問題開始——xrange是迭代還是迭代器?

我們來看看

 
 
  1. >>> x = xrange(10) 
  2. >>> type(x) 
  3.  

幾個(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就是迭代

 
 
  1. >>> iter(xrange(10)) 
  2.  

它返回了rangeiterator,所以我們完全可以叫它迭代器。

讓我們用最少的xrange函數(shù)實(shí)現(xiàn)自己的xrange

 
 
  1. xrange_iterator 
  2.  
  3. class xrange_iter(object): 
  4.     def __init__(self, num): 
  5.         self.num = num 
  6.         self.start = 0 
  7.     def __iter__(self): 
  8.         return self 
  9.     def next(self): 
  10.         if self.start < self.num: 
  11.             val = self.start 
  12.             self.start += 1 
  13.             return val 
  14.         else: 
  15.             raise StopIteration() 
  16.  
  17. my xrange 
  18.  
  19. class my_xrange(object): 
  20.     def __init__(self, num): 
  21.         self.num = num 
  22.     def __iter__(self): 
  23.         return xrange_iter(self.num) 
  24.  
  25. >>> for x in my_xrange(10): 
  26. print x, 
  27.  
  28. 0 1 2 3 4 5 6 7 8 9 

我喜歡在這里總結(jié)這篇文章,歡迎發(fā)表評(píng)論和疑問。

譯文鏈接:http://www.codeceo.com/article/python-iterable-and-iterator.html
英文原文:Python: Iterable and Iterator


本文名稱:Python迭代和迭代器詳解
轉(zhuǎn)載來源:http://www.dlmjj.cn/article/dpoipoh.html