生成器应用 ,越懒越优秀

版权声明: https://blog.csdn.net/dashoumeixi/article/details/83868210

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

猜你喜欢

转载自blog.csdn.net/dashoumeixi/article/details/83868210
今日推荐