版权声明: 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))