Python迭代和迭代器詳解_python

來源:互聯網
上載者:User

迭代器

迭代器(iterator)有時又稱遊標(cursor)是程式設計的軟體設計模式,可在容器物件(container,例如鏈表或陣列)上遍訪的介面,設計人員無需關心容器物件的記憶體配置的實現細節。

摘自維基百科

也就是說迭代器類似於一個遊標,卡到哪裡就是哪裡,可以通過這個來訪問某個可迭代對象的元素;同時,也不是只有Python有這個特性。比如C++的STL中也有這個,如 vector<int>::iterator it 。下面主要說一下Python中的可迭代對象和迭代器吧。

Python可迭代對象(Iterable)

Python中經常使用 for 來對某個對象進行遍曆,此時被遍曆的這個對象就是可迭代對象,像常見的 list , tuple 都是。如果給一個準確的定義的話,就是只要它定義了可以返回一個迭代器的 __iter__ 方法,或者定義了可以支援下標索引的 __getitem__ 方法(這些雙底線方法會在其他章節中全面解釋),那麼它就是一個可迭代對象。

Python迭代器(iterator)

迭代器是通過 next() 來實現的,每調用一次他就會返回下一個元素,當沒有下一個元素的時候返回一個 StopIteration 異常,所以實際上定義了這個方法的都算是迭代器。可以用通過下面例子來體驗一下迭代器:

In [38]: s = 'ab'In [39]: it = iter(s)In [40]: itOut[40]: <iterator at 0x1068e6d50>In [41]: print it<iterator object at 0x1068e6d50>In [42]: it.next()Out[42]: 'a'In [43]: it.next()Out[43]: 'b'In [44]: it.next()---------------------------------------------------------------------------StopIteration               Traceback (most recent call last)<ipython-input-44-54f0920595b2> in <module>()----> 1 it.next()StopIteration:

自己實現一個迭代器,如下(參見官網文檔):

class Reverse:  """Iterator for looping over a sequence backwards."""  def __init__(self, data):    self.data = data    self.index = len(data)  def __iter__(self):    return self  def next(self):    if self.index == 0:      raise StopIteration    self.index = self.index - 1    return self.data[self.index]rev = Reverse('spam')for char in rev:  print char[output]maps

產生器(Generators)

產生器是構造迭代器的最簡單有力的工具,與普通函數不同的只有在返回一個值的時候使用 yield 來替代 return ,然後 yield 會自動構建好 next() 和 iter() 。是不是很省事。例如:

def reverse(data):  for index in range(len(data)-1, -1, -1):    yield data[index]>>> for char in reverse('golf'):...   print char...flog

產生器最佳應用情境是:你不想同一時間將所有計算出來的大量結果集分配到記憶體當中,特別是結果集裡還包含迴圈。比方說,迴圈列印1000000個數,我們一般會使用 xrange() 而不是 range() ,因為前者返回的是產生器,後者返回的是列表(列表消耗大量空間)。

Help on built-in function range in module __builtin__:range(...)  range(stop) -> list of integers  range(start, stop[, step]) -> list of integers  Return a list containing an arithmetic progression of integers.  range(i, j) returns [i, i+1, i+2, ..., j-1]; start (!) defaults to 0.  When step is given, it specifies the increment (or decrement).  For example, range(4) returns [0, 1, 2, 3]. The end point is omitted!  These are exactly the valid indices for a list of 4 elements.class xrange(object) | xrange(stop) -> xrange object | xrange(start, stop[, step]) -> xrange object | | Like range(), but instead of returning a list, returns an object that | generates the numbers in the range on demand. For looping, this is | slightly faster than range() and more memory efficient.iter()

將可迭代對象轉化為迭代器。

In [113]: s = 'abc'In [114]: s.next()---------------------------------------------------------------------------AttributeError              Traceback (most recent call last)<ipython-input-114-5e5e6532ea26> in <module>()----> 1 s.next()AttributeError: 'str' object has no attribute 'next'In [115]: it = iter(s)In [116]: it.next()Out[116]: 'a'

產生器運算式

和列表推導式唯一的區別就是中括弧換成了小括弧,如下:

In [119]: num = (i for i in range(10))In [120]: sum(num)Out[120]: 45

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.