python中的迭代器與生成器

2021-06-21 11:21:25 字數 2071 閱讀 1996

實現乙個迭代器,應滿足如下條件:

簡單示例

#!/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 ...