日韩无码专区无码一级三级片|91人人爱网站中日韩无码电影|厨房大战丰满熟妇|AV高清无码在线免费观看|另类AV日韩少妇熟女|中文日本大黄一级黄色片|色情在线视频免费|亚洲成人特黄a片|黄片wwwav色图欧美|欧亚乱色一区二区三区

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

新聞中心

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

我們將要來學習python的重要概念迭代和迭代器,通過簡單實用的例子如列表迭代器和xrange。

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

可迭代

一個對象,物理或者虛擬存儲的序列。list,tuple,strins,dicttionary,set以及生成器對象都是可迭代的,整型數(shù)是不可迭代的。如果你不確定哪個可迭代哪個不可以,你需要用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對象,為dictionary返回了dictionary-keyiterator對象。類似對其他可迭代類型也會返回迭代器對象。

iter()用在自定義的類型會怎樣呢?我們先自己定義一個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 

你可能會有幾個問題要問:

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

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

讓我們補充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類中需要一個’__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’也會調(diào)用’iterable.__getitem__()’,所以我們用’__getitem__’方法讓String類型可迭代。

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

自動迭代

for循環(huán)會自動迭代

 
 
  1. for x in iterable: 
  2.     print x 

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

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

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

迭代器

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

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

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

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

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

我們試一試模仿for循環(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會返回迭代器對象。

現(xiàn)在我們試著理解迭代器類的設(shè)計。

 
 
  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 

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

但是為了學習的目的我們就到這兒。。。。

列表迭代器

你可能會在面試中寫這個,所以打起精神來注意了

 
 
  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`自己定義一個列表迭代器

 
 
  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 

從一個問題開始——xrange是迭代還是迭代器?

我們來看看

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

幾個關(guān)鍵點:

  • 1. `iter(xrange(num))`應(yīng)該被支持

  • 2. 如果`iter(xrange(num))`返回同樣的對象(xrange類型)那xrange就是迭代器

  • 3. 如果`iter(xrange(num))`返回一個迭代器對象那xrange就是迭代

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

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

讓我們用最少的xrange函數(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ā)表評論和疑問。

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


文章題目:Python迭代和迭代器詳解
文章源于:http://www.5511xx.com/article/dpoipoh.html