国产av日韩一区二区三区精品,成人性爱视频在线观看,国产,欧美,日韩,一区,www.成色av久久成人,2222eeee成人天堂

Python迭代和迭代器詳解

Original 2017-01-12 14:54:00 299
abstract:迭代器迭代器(iterator)有時又稱游標(cursor)是程式設計的軟件設計模式,可在容器物件(container,例如鏈表或陣列)上遍訪的界面,設計人員無需關心容器物件的內(nèi)存分配的實現(xiàn)細節(jié)。摘自維基百科也就是說迭代器類似于一個游標,卡到哪里就是哪里,可以通過這個來訪問某個可迭代對象的元素;同時,也不是只有Python有這個特性。比如C++的STL中也有這個,如 vector<int&g

迭代器

迭代器(iterator)有時又稱游標(cursor)是程式設計的軟件設計模式,可在容器物件(container,例如鏈表或陣列)上遍訪的界面,設計人員無需關心容器物件的內(nèi)存分配的實現(xiàn)細節(jié)。

摘自維基百科

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

Python可迭代對象(Iterable)

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

Python迭代器(iterator)

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

In [38]: s = 'ab' 
In [39]: it = iter(s) 
In [40]: it
Out[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:

  

自己實現(xiàn)一個迭代器,如下(參見官網(wǎng)文檔):

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]
m
a
p
s

生成器(Generators)

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

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

生成器最佳應用場景是:你不想同一時間將所有計算出來的大量結(jié)果集分配到內(nèi)存當中,特別是結(jié)果集里還包含循環(huán)。比方說,循環(huán)打印1000000個數(shù),我們一般會使用 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()

將可迭代對象轉(zhuǎn)化為迭代器。

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'

生成器表達式

和列表推導式唯一的區(qū)別就是中括號換成了小括號,如下:

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

更多關于Python迭代和迭代器詳解請關注PHP中文網(wǎng)(m.miracleart.cn)其他文章!   


Release Notes

Popular Entries