一、迭代器
實現一個迭代器,應滿足如下條件:
- python2中,實現next()方法的類(python3可用__next__()取代)
- 可變對象,unhashable type
- 總是返回當前迭代位置之前的值(有限長度的迭代器,無法迭代最後值)
- 產生StopIteration異常,證明到達迭代器末尾
簡單示例
#!/usr/bin/env python class SampleIter: """ sample iterator >>> sampleIter = SampleIter() >>> sampleIter.next() 'a' >>> sampleIter.next() 'b' >>> sampleIter.next() Traceback (most recent call last): ... StopIteration """ def __init__(self, start='a', end='c'): self.next_letter = start self.end = end def next(self): """In python3, better to use __next__""" if self.next_letter == self.end: raise StopIteration current = self.next_letter self.next_letter = chr(ord(current)+1) return current if __name__ == '__main__': import doctest doctest.testmod()
二、可迭代對象
能被for語句遍歷的對象是可迭代的,一個迭代對象需要實現__iter__方法。
- 可迭代對象需要在__iter__方法裏返回一個迭代器
- 同一個可迭代對象可以被迭代多次
- 通常將迭代器實現爲可迭代對象
簡單示例
class SampleIterable: """ sample iterator >>> sampleIterable = SampleIterable() >>> sampleIter = sampleIterable.__iter__() >>> sampleIter.next() 'a' >>> sampleIter.next() 'b' >>> sampleIter.next() Traceback (most recent call last): ... StopIteration >>> for letter in sampleIterable: ... letter 'a' 'b' """ def __init__(self, start='a', end='c'): self.start = start self.end = end def __iter__(self): return SampleIter(self.start, self.end)
三、生成器
生成器是迭代器的一種類型,不再用return關鍵字返回值,而是用yield關鍵字取代。
- 當調用包含yield的方法時,並不會直接執行方法,而是返回一個generator對象
- 函數執行到yield關鍵字的時候,會返回yield後面表達式的值,然後掛起方法直到下一次循環
簡單代碼
def sample_generator(): """ sample generator >>> g = (x for x in range(3)) >>> type(g) <type 'generator'> >>> d = {} >>> d[g] = 1 #no error,hashable type >>> type(sample_generator()) <type 'generator'> >>> for letter in sample_generator(): ... letter 'a' 'b' """ current = 'a' while current < 'c': yield current current = chr(ord(current)+1)
四、總結
通常,list能完成我們對序列化數據的所有需求。可是當我們處理大數據序列或者無限序列時,list這種將數據直接寫入內存中處理方式就不再適用了。這種情況下,迭代器是一個很好的解決方案——它用一種lazy computation處理方式在需要時生成數據,消耗的內存空間微乎其微。
python中的迭代器與生成器
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.