生成器應用 ,越懶越優秀
阿新 • • 發佈:2018-11-10
生成器基礎: python 生成器基礎
下面的生成器例子都在類中實現.
一個可迭代的物件, 一般來說有 __iter__ 或者 __getitem__ ,後者的優先順序低.
要先搞清楚 可迭代物件 (__iter__) 與迭代器 (__next__ ) 的區別, 實現了 __iter__ 是一個可迭代物件, 實現了 __next__ 是一個迭代器
具體在下面例子中有註釋
import re Reg_Word = re.compile('(\w+)') class FindWord1: __slots__ = ("text") def __init__(self,text): self.text = text #word 是一個正則返回的list self.word = Reg_Word.findall(text); #看看有多少匹配專案 def __len__(self): return len(self.word) #如果不實現 __iter__ 則使用這個函式 def __getitem__(self, item): return self.word[item] def __repr__(self): return "FindWord1 (%s) " % repr(self.text) # 這是一個可迭代物件. 同時是一個生成器. # 當然可以 另定義一個類 : class XX_Iterator , 讓 __iter__ 返回即可.這裡直接使用生成器來代替 def __iter__(self): for item in self.word: yield item
下面這個例子 稍作修改, 更懶惰
import re Reg_Word = re.compile('(\w+)') #對上面例子中的類修改 class FindWord2: __slots__ = ("text") #不再構造裡呼叫 正則的匹配函數了. def __init__(self,text): self.text = text def __repr__(self): return "Sentence(%s)" % repr(self.text) #finditer 返回一個生成器, 每次迭代出一個 matchObject , 這樣就更懶惰了 def __iter__(self): for match in Reg_Word.finditer(self.text): yield match.group() #下面是一個可以用於替換版本的 __iter__ ,只是一個生成器表示式而已 def __iter(self): return (match.group() for match in Reg_Word.finditer(self.text))