實現乙個迭代器,應滿足如下條件:簡單示例
#!/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__方法。
簡單示例
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關鍵字取代。
簡單**
def sample_generator():
"""sample generator
>>> g = (x for x in range(3))
>>> type(g)
>>> d = {}
>>> d[g] = 1 #no error,hashable type
>>> type(sample_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中的迭代器與生成器
有 iter 方法的就是可迭代物件 列舉些可迭代物件 str,list,tuple,dict,set,range,檔案控制代碼 獲取乙個物件的所有的方法dir 把每個方法以字串的格式放在乙個列表中返回回來 s1 asdfas print dir s1 結果 add class contains de...
python中的迭代器與生成器
1 迭代器 迭代器協議是指 物件必須提供乙個next方法,執行該方法要麼返回迭代中的下一項,要麼就引起乙個 stopiteration異常,以終止迭代 只能往後走不能往前退 可迭代物件 實現了迭代器協議的物件 如何實現 物件內部定義乙個 iter 方法 協議是一種約定,可迭代物件實現了迭代器協議,p...
Python生成器與迭代器
生成器只有在用的時候會出現在記憶體中,對比列表全部存在記憶體中,減少了記憶體占用 next 函式 依次取生成器的值 s x 2 for x in range 1000 中括號是列表解析,小括號表示生成一系列值,就是生成器 s at 0x7fa20aa8b048 print next s 用next ...