最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Python中Iterator迭代器的使用雜談

 更新時(shí)間:2016年06月20日 15:53:23   作者:TypingQuietly  
Python中的迭代器意義不僅是在iter函數(shù)上的運(yùn)用,更是一種處理可迭代對(duì)象的迭代器模式,這里我們來簡(jiǎn)單聊聊Python中Iterator迭代器的使用雜談:

迭代器是一種支持next()操作的對(duì)象。它包含一組元素,當(dāng)執(zhí)行next()操作時(shí),返回其中一個(gè)元素;當(dāng)所有元素都被返回后,生成一個(gè)StopIteration異常。

>>>a=[1,2,3]
>>>ia=iter(a)
>>>next(ia)
1
>>>next(ia)
2
>>>next(ia)
3
>>>next(ia)
Traceback (most recent call last):
 File "<stdin>", line 1, in <module>
StopIteration

ite()可以接受多種Python對(duì)象為參數(shù),比如list,tuple, dict, set等,并將其轉(zhuǎn)化為迭代器。迭代器可以用于for語句或in語句中。很多常用操作也是支持迭代器的,比如sum(), max()等。

>>> b=[4,5,6]
>>> ib=iter(b)
>>> for x in ib:
...   print(x)
...
4
5
6
>>> ic=iter(b)
>>> sum(ic)
15
>>> id=iter(b)
>>> max(ic)
6

毋庸置疑,迭代器有很多好處:

1.“流式”數(shù)據(jù)處理方式減少內(nèi)存消耗:
比如處理文件,一下猛地把全部數(shù)據(jù)全部取出來放到內(nèi)存里面進(jìn)行處理會(huì)導(dǎo)致程序消耗大量?jī)?nèi)存,有時(shí)甚至沒法做到,一般我們會(huì)一部分一部分的對(duì)文件內(nèi)容進(jìn)行處理:

for text_line in open("xx.txt"):
 print text_line

2.或者對(duì)xml文件進(jìn)行處理的時(shí)候:

tree = etree.iterparse(xml, ['start', 'end'])
for event, elem in tree:
  if event == "end"
    result = etree.tostring(elem)
    elem.clear()
    print result

內(nèi)置函數(shù)open返回的file對(duì)象和etree.iterparse序列化的xml tree都是可迭代對(duì)象,能夠讓我們漸進(jìn)式地對(duì)文件的內(nèi)容進(jìn)行處理。

3.支持方便用for語句對(duì)數(shù)據(jù)進(jìn)行消費(fèi):
python內(nèi)置的一些常見的像類型像數(shù)組、列表甚至字符串等都是可迭代類型,這樣我們就能方便for語句這個(gè)語法糖方便對(duì)數(shù)據(jù)進(jìn)行消費(fèi),不需要自己記錄索引位置,人肉循環(huán):

for i in [1, 2, 3, 4]
 print i,

簡(jiǎn)單了解了一下迭代器的好處后,我們正正經(jīng)經(jīng)的聊聊python的迭代器模式。
在這里我們引入兩個(gè)比較繞口的名詞:可迭代對(duì)象和迭代器對(duì)象,個(gè)人覺得從這兩個(gè)概念下手會(huì)對(duì)迭代器有比較好的理解。在放例子前先對(duì)這兩個(gè)概念給一個(gè)不入流的解釋:

可迭代對(duì)象:對(duì)象里面包含__iter()__方法的實(shí)現(xiàn),對(duì)象的iter函數(shù)經(jīng)調(diào)用之后會(huì)返回一個(gè)迭代器,里面包含具體數(shù)據(jù)獲取的實(shí)現(xiàn)。
迭代器:包含有next方法的實(shí)現(xiàn),在正確范圍內(nèi)返回期待的數(shù)據(jù)以及超出范圍后能夠拋出StopIteration的錯(cuò)誤停止迭代。
放個(gè)例子邊看邊說:

class iterable_range:
  def __init__(self, n):
    self.n = n

  def __iter__(self):
    return my_range_iterator(self.n)

class my_range_iterator:
  def __init__(self, n):
    self.i = 0
    self.n = n

  def next(self):
    if self.i < self.n:
      i = self.i
      self.i += 1
      print 'iterator get number:', i
      return i
    else:
      raise StopIteration()

例子中的iterable_range是一個(gè)可迭代對(duì)象,所以我們也能夠?qū)λ胒or語句來進(jìn)行迭代:

temp = my_range(10)
for item in temp:
  print item,

輸出:

  my iterator get number: 0
  0
  my iterator get number: 1
  1
  my iterator get number: 2
  2
  my iterator get number: 3
  3
  my iterator get number: 4
  4
  my iterator get number: 5
  5
  my iterator get number: 6
  6
  my iterator get number: 7
  7
  my iterator get number: 8
  8
  my iterator get number: 9
  9

大家可以仔細(xì)地看一下輸出的日志:

  • 數(shù)據(jù)確實(shí)是“流式”處理的
  • iterator是真正在背后做事的人
  • for語句能夠非常方便的迭代對(duì)象的數(shù)據(jù)。

可迭代對(duì)象其實(shí)更像是整個(gè)迭代器模式模式的上層,像一種約束一種契約一種規(guī)范,它能夠保證自己能夠返回一個(gè)在實(shí)際工作中干活的迭代器對(duì)象。for、sum等接受一個(gè)可迭代對(duì)象的方法都是遵循這樣的規(guī)范:調(diào)用對(duì)象的__iter__函數(shù),返回迭代器,對(duì)迭代器對(duì)象返回的每個(gè)值進(jìn)行處理抑或需要一些匯總的操作。拿for舉個(gè)例子:

iterator_object = iterable_object.__iter__()
while True:
  try:
    value = iterator_object.next()
  except StopIteration:
    # StopIteration exception is raised after last element
    break

  # loop code
  print value

for這個(gè)語法糖背后的邏輯差不多就是上面例子中代碼所示的那樣:首先獲取可迭代對(duì)象返回的迭代器對(duì)象,然后調(diào)用迭代器對(duì)象的next方法獲取每個(gè)值,在獲取值的過程中隨時(shí)檢測(cè)邊界-也就是檢查是否拋出了StopIteration這樣的錯(cuò)誤,如果迭代器對(duì)象拋出錯(cuò)誤則迭代停止(note:從這個(gè)例子可以看出,對(duì)于那些接受可迭代對(duì)象的方法,如果我們傳一個(gè)單純的迭代器對(duì)象其實(shí)也是無法工作的,可能會(huì)報(bào)出類似于TypeError: iteration over non-sequence的錯(cuò)誤)。
當(dāng)然了,一般在應(yīng)用過程中我們不會(huì)將他們特意的分開,我們能夠稍微對(duì)迭代器對(duì)象進(jìn)行修改一下,添加__iter__方法的實(shí)現(xiàn),這樣對(duì)象本身就既是可迭代對(duì)象也是一個(gè)迭代器對(duì)象了:

class my_range_iterator:
   def __init__(self, n):
    self.i = 0
    self.n = n

   def __iter__(self):
    return self

   def next(self):
    if self.i < self.n:
      i = self.i

      self.i += 1
      print 'my iterator get number:', i
      return i
    else:
      raise StopIteration()

 for item in my_range_iterator(10):
   print item

輸出:

 

  my iterator get number: 0
  0
  my iterator get number: 1
  1
  my iterator get number: 2
  2
  my iterator get number: 3
  3
  my iterator get number: 4
  4
  my iterator get number: 5
  5
  my iterator get number: 6
  6
  my iterator get number: 7
  7
  my iterator get number: 8
  8
  my iterator get number: 9
  9

相關(guān)文章

  • python 移動(dòng)圖片到另外一個(gè)文件夾的實(shí)例

    python 移動(dòng)圖片到另外一個(gè)文件夾的實(shí)例

    今天小編就為大家分享一篇python 移動(dòng)圖片到另外一個(gè)文件夾的實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧
    2019-01-01
  • pytorch框架的詳細(xì)介紹與應(yīng)用詳解

    pytorch框架的詳細(xì)介紹與應(yīng)用詳解

    這篇文章主要介紹了pytorch框架的詳細(xì)介紹與應(yīng)用,Torch?是一個(gè)經(jīng)典的對(duì)多維矩陣數(shù)據(jù)進(jìn)行操作的張量(tensor?)庫,在機(jī)器學(xué)習(xí)和其他數(shù)學(xué)密集型應(yīng)用有廣泛應(yīng)用,本文給大家詳細(xì)講解,需要的朋友可以參考下
    2023-04-04
  • python字典get()方法用法分析

    python字典get()方法用法分析

    這篇文章主要介紹了python字典get()方法用法,實(shí)例分析了使用get方法獲取字典值的技巧,非常具有實(shí)用價(jià)值,需要的朋友可以參考下
    2015-04-04
  • 人工智能深度學(xué)習(xí)OpenAI?baselines的使用方法

    人工智能深度學(xué)習(xí)OpenAI?baselines的使用方法

    這篇文章主要為大家介紹了人工智能深度學(xué)習(xí)OpenAI?baselines的使用方法,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-05-05
  • Pycharm掛代理后依舊插件下載慢的完美解決方法

    Pycharm掛代理后依舊插件下載慢的完美解決方法

    狠多朋友在使用Pycharm插件時(shí),反應(yīng)下載速度很慢,掛載了代理還是不夠,怎么解決這一問題呢,下面小編給大家代理了Pycharm插件下載慢的完美解決方法,需要的朋友參考下吧
    2021-08-08
  • Python控制臺(tái)輸出俄羅斯方塊移動(dòng)和旋轉(zhuǎn)功能

    Python控制臺(tái)輸出俄羅斯方塊移動(dòng)和旋轉(zhuǎn)功能

    這篇文章主要介紹了Python控制臺(tái)輸出俄羅斯方塊移動(dòng)和旋轉(zhuǎn)功能,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2021-04-04
  • Windows平臺(tái)Python編程必會(huì)模塊之pywin32介紹

    Windows平臺(tái)Python編程必會(huì)模塊之pywin32介紹

    在Windows平臺(tái)上,從原來使用C/C++編寫原生EXE程序,到使用Python編寫一些常用腳本程序,成熟的模塊的使用使得編程效率大大提高了
    2019-10-10
  • Python中的min及返回最小值索引的操作

    Python中的min及返回最小值索引的操作

    這篇文章主要介紹了Python中的min及返回最小值索引的操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧
    2021-05-05
  • Python線程之同步機(jī)制實(shí)際應(yīng)用場(chǎng)景舉例說明

    Python線程之同步機(jī)制實(shí)際應(yīng)用場(chǎng)景舉例說明

    這篇文章主要給大家分享的是Python線程之同步機(jī)制實(shí)際應(yīng)用場(chǎng)景舉例說明,銀行轉(zhuǎn)賬小栗子供大家參考學(xué)習(xí),希望對(duì)你有一定的幫助
    2022-02-02
  • pandas?如何將字符串映射為數(shù)字

    pandas?如何將字符串映射為數(shù)字

    這篇文章主要介紹了pandas?如何將字符串映射為數(shù)字,具有很好的參考價(jià)值,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-07-07

最新評(píng)論

乌拉特前旗| 天水市| 康平县| 永年县| 呈贡县| 合川市| 盱眙县| 汝南县| 泗洪县| 思南县| 黄陵县| 沈丘县| 颍上县| 沂水县| 梁平县| 岗巴县| 兴国县| 白山市| 石泉县| 井研县| 榆中县| 太原市| 稷山县| 谷城县| 兴仁县| 泾阳县| 乐清市| 临邑县| 安陆市| 富源县| 钟山县| 湘西| 芜湖县| 泰和县| 满洲里市| 宜章县| 泉州市| 中卫市| 重庆市| 凤翔县| 十堰市|