成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

Python迭代和迭代器詳解

開發 后端
一個對象,物理或者虛擬存儲的序列。list,tuple,strins,dicttionary,set以及生成器對象都是可迭代的,整型數是不可迭代的。如果你不確定哪個可迭代哪個不可以,你需要用python內建的iter()來幫忙。

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

可迭代

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

 

 

  1. >>> iter([1,2,3]) 
  2. <listiterator object at 0x026C8970
  3.  
  4. >>> iter({1:22:4}) 
  5. <dictionary-keyiterator object at 0x026CC1B0
  6.  
  7. >>> iter(1234
  8. Traceback (most recent call last): 
  9.   File "<pyshell#145>", line 1, in <module> 
  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. <iterator object at 0x026C8150

在String類中需要一個’__iter__’方法把String類型變成可迭代的,這就是說’iter’內部調用了’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. <iterator object at 0x0273AC10

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

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

自動迭代

for循環會自動迭代

  1. for x in iterable: 
  2.     print x 

我們可以不用for循環來實現嗎?

  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循環的功能。我們先看迭代器,等下回再過頭來。

迭代器

關于迭代器先說幾條………..

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

  • 2. 它會在迭代結束后發出StopIteration異常。

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

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

我們試一試模仿for循環

 

  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會返回迭代器對象。

現在我們試著理解迭代器類的設計。

 

  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. 1 
  11. >>> next(it) 
  12. 2 
  13. >>> next(it) 
  14. 34 
  15. >>> next(it) 
  16.  
  17. Traceback (most recent call last): 
  18.   File "<pyshell#254>", line 1, in <module> 
  19.     next(it) 
  20.   File "<pyshell#228>", line 13, in next 
  21.     raise StopIteration() 
  22. StopIteration 
  23.  
  24. xrange 

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

我們來看看

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

幾個關鍵點:

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

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

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

  1. >>> iter(xrange(10)) 
  2. <rangeiterator object at 0x0264EFE0

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

讓我們用最少的xrange函數實現自己的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 

我喜歡在這里總結這篇文章,歡迎發表評論和疑問。

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

責任編輯:王雪燕 來源: 碼農網
相關推薦

2013-08-19 16:44:15

.Net

2021-11-28 08:03:41

Python迭代器對象

2017-06-26 16:26:15

Python迭代對象迭代器

2022-10-26 08:25:06

Python編程迭代器

2020-11-24 08:00:22

JavaScript對象迭代器

2024-09-18 13:49:42

2009-12-15 14:58:19

Ruby迭代器

2011-07-13 13:56:06

STL迭代器

2024-11-08 12:42:34

Rustmapfilter

2009-08-26 16:26:37

C#迭代器模式

2009-08-11 13:59:41

迭代器模式C# Iterator

2009-08-19 15:18:53

迭代器

2020-11-06 09:01:46

迭代器模式

2021-01-04 09:43:24

Python 開發編程語言

2023-11-15 13:35:00

迭代器生成器Python

2020-09-21 09:55:06

Python迭代器開發

2022-10-26 09:27:59

Python編程迭代器協議

2023-03-01 00:07:32

JavaScript迭代器生成器

2021-07-07 05:07:15

JDKIterator迭代器

2023-11-07 10:10:36

設計模式元素
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 91久久精品一区二区二区 | 久久国产亚洲 | 国内久久精品 | 91精品国产高清久久久久久久久 | 中文字幕视频在线观看免费 | 国产精品揄拍一区二区久久国内亚洲精 | 久久久久久久久久久久久9999 | 成人深夜福利 | 欧美激情综合色综合啪啪五月 | 欧美日韩久久精品 | 91精品在线看 | 亚洲国产成人久久综合一区,久久久国产99 | 国产精品久久久久久福利一牛影视 | 日韩精品成人网 | 免费在线一区二区 | av在线免费网 | 国产一区久久 | 91精品国产麻豆 | 欧美精品久久久 | 国产精品亚洲精品 | 国产综合在线视频 | 亚洲视频在线看 | 久久美女网 | 久在线精品视频 | 天天干狠狠操 | 日韩一区精品 | 日韩在线免费 | 欧美成人精品激情在线观看 | 日韩一区二区成人 | 婷婷不卡 | 中文字幕欧美在线观看 | 91麻豆精品国产91久久久更新资源速度超快 | 欧美精品一区二区三区四区五区 | 亚洲播放一区 | 国产一区二区精品在线观看 | 久久久做 | 国产免费一区二区三区网站免费 | 91色综合 | 成人欧美一区二区三区黑人孕妇 | 浴室洗澡偷拍一区二区 | 精品在线一区 |