搜尋
首頁後端開發Python教學Python中Iterator迭代器的使用杂谈

迭代器是一种支持next()操作的对象。它包含一组元素,当执行next()操作时,返回其中一个元素;当所有元素都被返回后,生成一个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对象为参数,比如list,tuple, dict, set等,并将其转化为迭代器。迭代器可以用于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.“流式”数据处理方式减少内存消耗:
比如处理文件,一下猛地把全部数据全部取出来放到内存里面进行处理会导致程序消耗大量内存,有时甚至没法做到,一般我们会一部分一部分的对文件内容进行处理:

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

2.或者对xml文件进行处理的时候:

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

内置函数open返回的file对象和etree.iterparse序列化的xml tree都是可迭代对象,能够让我们渐进式地对文件的内容进行处理。

3.支持方便用for语句对数据进行消费:
python内置的一些常见的像类型像数组、列表甚至字符串等都是可迭代类型,这样我们就能方便for语句这个语法糖方便对数据进行消费,不需要自己记录索引位置,人肉循环:

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

简单了解了一下迭代器的好处后,我们正正经经的聊聊python的迭代器模式。
在这里我们引入两个比较绕口的名词:可迭代对象和迭代器对象,个人觉得从这两个概念下手会对迭代器有比较好的理解。在放例子前先对这两个概念给一个不入流的解释:

可迭代对象:对象里面包含__iter()__方法的实现,对象的iter函数经调用之后会返回一个迭代器,里面包含具体数据获取的实现。
迭代器:包含有next方法的实现,在正确范围内返回期待的数据以及超出范围后能够抛出StopIteration的错误停止迭代。
放个例子边看边说:

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是一个可迭代对象,所以我们也能够对它用for语句来进行迭代:

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

大家可以仔细地看一下输出的日志:

  • 数据确实是“流式”处理的
  • iterator是真正在背后做事的人
  • for语句能够非常方便的迭代对象的数据。

可迭代对象其实更像是整个迭代器模式模式的上层,像一种约束一种契约一种规范,它能够保证自己能够返回一个在实际工作中干活的迭代器对象。for、sum等接受一个可迭代对象的方法都是遵循这样的规范:调用对象的__iter__函数,返回迭代器,对迭代器对象返回的每个值进行处理抑或需要一些汇总的操作。拿for举个例子:

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这个语法糖背后的逻辑差不多就是上面例子中代码所示的那样:首先获取可迭代对象返回的迭代器对象,然后调用迭代器对象的next方法获取每个值,在获取值的过程中随时检测边界-也就是检查是否抛出了StopIteration这样的错误,如果迭代器对象抛出错误则迭代停止(note:从这个例子可以看出,对于那些接受可迭代对象的方法,如果我们传一个单纯的迭代器对象其实也是无法工作的,可能会报出类似于TypeError: iteration over non-sequence的错误)。
当然了,一般在应用过程中我们不会将他们特意的分开,我们能够稍微对迭代器对象进行修改一下,添加__iter__方法的实现,这样对象本身就既是可迭代对象也是一个迭代器对象了:

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

陳述
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
Python:探索其主要應用程序Python:探索其主要應用程序Apr 10, 2025 am 09:41 AM

Python在web開發、數據科學、機器學習、自動化和腳本編寫等領域有廣泛應用。 1)在web開發中,Django和Flask框架簡化了開發過程。 2)數據科學和機器學習領域,NumPy、Pandas、Scikit-learn和TensorFlow庫提供了強大支持。 3)自動化和腳本編寫方面,Python適用於自動化測試和系統管理等任務。

您可以在2小時內學到多少python?您可以在2小時內學到多少python?Apr 09, 2025 pm 04:33 PM

兩小時內可以學到Python的基礎知識。 1.學習變量和數據類型,2.掌握控制結構如if語句和循環,3.了解函數的定義和使用。這些將幫助你開始編寫簡單的Python程序。

如何在10小時內通過項目和問題驅動的方式教計算機小白編程基礎?如何在10小時內通過項目和問題驅動的方式教計算機小白編程基礎?Apr 02, 2025 am 07:18 AM

如何在10小時內教計算機小白編程基礎?如果你只有10個小時來教計算機小白一些編程知識,你會選擇教些什麼�...

如何在使用 Fiddler Everywhere 進行中間人讀取時避免被瀏覽器檢測到?如何在使用 Fiddler Everywhere 進行中間人讀取時避免被瀏覽器檢測到?Apr 02, 2025 am 07:15 AM

使用FiddlerEverywhere進行中間人讀取時如何避免被檢測到當你使用FiddlerEverywhere...

Python 3.6加載Pickle文件報錯"__builtin__"模塊未找到怎麼辦?Python 3.6加載Pickle文件報錯"__builtin__"模塊未找到怎麼辦?Apr 02, 2025 am 07:12 AM

Python3.6環境下加載Pickle文件報錯:ModuleNotFoundError:Nomodulenamed...

如何提高jieba分詞在景區評論分析中的準確性?如何提高jieba分詞在景區評論分析中的準確性?Apr 02, 2025 am 07:09 AM

如何解決jieba分詞在景區評論分析中的問題?當我們在進行景區評論分析時,往往會使用jieba分詞工具來處理文�...

如何使用正則表達式匹配到第一個閉合標籤就停止?如何使用正則表達式匹配到第一個閉合標籤就停止?Apr 02, 2025 am 07:06 AM

如何使用正則表達式匹配到第一個閉合標籤就停止?在處理HTML或其他標記語言時,常常需要使用正則表達式來�...

如何繞過Investing.com的反爬蟲機制獲取新聞數據?如何繞過Investing.com的反爬蟲機制獲取新聞數據?Apr 02, 2025 am 07:03 AM

攻克Investing.com的反爬蟲策略許多人嘗試爬取Investing.com(https://cn.investing.com/news/latest-news)的新聞數據時,常常�...

See all articles

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

AI Hentai Generator

AI Hentai Generator

免費產生 AI 無盡。

熱門文章

R.E.P.O.能量晶體解釋及其做什麼(黃色晶體)
3 週前By尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.最佳圖形設置
3 週前By尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.如果您聽不到任何人,如何修復音頻
3 週前By尊渡假赌尊渡假赌尊渡假赌
WWE 2K25:如何解鎖Myrise中的所有內容
3 週前By尊渡假赌尊渡假赌尊渡假赌

熱工具

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

DVWA

DVWA

Damn Vulnerable Web App (DVWA) 是一個PHP/MySQL的Web應用程序,非常容易受到攻擊。它的主要目標是成為安全專業人員在合法環境中測試自己的技能和工具的輔助工具,幫助Web開發人員更好地理解保護網路應用程式的過程,並幫助教師/學生在課堂環境中教授/學習Web應用程式安全性。 DVWA的目標是透過簡單直接的介面練習一些最常見的Web漏洞,難度各不相同。請注意,該軟體中

SAP NetWeaver Server Adapter for Eclipse

SAP NetWeaver Server Adapter for Eclipse

將Eclipse與SAP NetWeaver應用伺服器整合。

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

ZendStudio 13.5.1 Mac

ZendStudio 13.5.1 Mac

強大的PHP整合開發環境