1. 程式人生 > >生成器應用 ,越懶越優秀

生成器應用 ,越懶越優秀

生成器基礎: 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))