Python裡的迭代器

來源:互聯網
上載者:User

標籤:字串   dict   str1   隨機   迴圈   soft   資料結構   UNC   事先   

迭代器(iterator)協議

· 在Python中,支援迭代器協議就是實現對象的__iter__()和__next__()方法。

  1.__iter__()方法:返回迭代器對象本身;

        2.__next__()方法:返回容器中的下一個元素,在結尾時引發Stoplteration異常終止迭代器。

可迭代對象(iterable)

·  實現了迭代器協議的對象,就是可迭代對象。

·  如何?迭代器協議:對象內部定義了一個__iter__()方法。

·  在Python中,字串、tuple、list、dict、set、檔案都是可迭代對象。總之能用Python內建函數調用出__iter__()方法的,都是可迭代對象。

如下:

  1. # str1=‘hello‘
  2. # list1=[1,2,3]
  3. # tup1=(1,2,3)
  4. # dic={‘x‘:1}
  5. # s1={‘a‘,‘b‘,‘c‘}
  6. # f=open(‘a.txt‘,‘w‘,encoding=‘utf-8‘)

都能用__iter__()調試出來。

迭代器對象

· 迭代器對象:

指的是既內建有__iter__方法,又內建有__next__方法的對象。僅有檔案才是迭代器對象
如下:
  1. # f=open(‘db.txt‘,‘rt‘,encoding=‘utf-8‘)
  2. # print(f.__next__())
  3. # print(f.__next__())
  4. # print(next(f))
迭代器的缺點
1.迭代器的取值不如按照索引的方式更靈活,因為它只能往後取不能往前退
2.無法預測迭代器值的個數
如下:
  1. name=[‘egon‘,‘alex_sb‘,‘wxx_sb‘]
  2. res=name.__iter__()
  3. print(res.__next__())
  4. print(name[0])

 

迭代器優點

 

  • 對於支援隨機訪問的資料結構:list、tuple等,迭代器和經典的for迴圈(索引訪問)相比,並無優勢,反而失去了索引值。不過可以使用內建函數enumerate()找回這個索引值。但對於無法隨機訪問的資料結構:set(),迭代器是唯一的訪問元素的方式。
  • 省記憶體:迭代器不需要事先準備好整個迭代過程中的所有元素,僅僅在迭代到某個元素時才計算該元素,而在這之前或之後,元素可以不存在或銷毀。這也是迭代器的一大優點:適合用於遍曆一個巨大的或無限的集合,比如幾個G的檔案。下面用斐波那契數列為例: 
    • 代碼一直接在fab(max)中用print列印會導致函數的可複用性變差,因此fab返回None。其他函數無法獲得fab函數返回的數列;
    • 代碼二滿足了可複用性的需求,但是佔用了記憶體空間;
    • 代碼三Fabs類通過next()不斷返回數列的下一個,記憶體佔用始終為常數。
      #代碼一:def fab(max):     L = []    n, a, b = 0, 0, 1     while n < max:         L.append(b)         a, b = b, a + b         n = n + 1    return L#代碼二:  def fab(max):     n, a, b = 0, 0, 1     while n < max:         print b         a, b = b, a + b         n = n + 1#代碼三:class Fab(object):     def __init__(self, max):         self.max = max         self.n, self.a, self.b = 0, 0, 1     def __iter__(self):         return self     def next(self):         if self.n < self.max:             r = self.b             self.a, self.b = self.b, self.a + self.b             self.n = self.n + 1             return r         raise StopIteration()

Python裡的迭代器

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.