標籤:字串 dict str1 隨機 迴圈 soft 資料結構 UNC 事先
迭代器(iterator)協議
· 在Python中,支援迭代器協議就是實現對象的__iter__()和__next__()方法。
1.__iter__()方法:返回迭代器對象本身;
2.__next__()方法:返回容器中的下一個元素,在結尾時引發Stoplteration異常終止迭代器。
可迭代對象(iterable)
· 實現了迭代器協議的對象,就是可迭代對象。
· 如何?迭代器協議:對象內部定義了一個__iter__()方法。
· 在Python中,字串、tuple、list、dict、set、檔案都是可迭代對象。總之能用Python內建函數調用出__iter__()方法的,都是可迭代對象。
如下:
- # str1=‘hello‘
- # list1=[1,2,3]
- # tup1=(1,2,3)
- # dic={‘x‘:1}
- # s1={‘a‘,‘b‘,‘c‘}
- # f=open(‘a.txt‘,‘w‘,encoding=‘utf-8‘)
都能用__iter__()調試出來。
迭代器對象
· 迭代器對象:
指的是既內建有__iter__方法,又內建有__next__方法的對象。僅有檔案才是迭代器對象
如下:
- # f=open(‘db.txt‘,‘rt‘,encoding=‘utf-8‘)
- # print(f.__next__())
- # print(f.__next__())
- # print(next(f))
迭代器的缺點
1.迭代器的取值不如按照索引的方式更靈活,因為它只能往後取不能往前退
2.無法預測迭代器值的個數
如下:
- name=[‘egon‘,‘alex_sb‘,‘wxx_sb‘]
- res=name.__iter__()
- print(res.__next__())
- 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裡的迭代器