可迭代的对象、迭代器和生成器
迭代是数据处理的基石。扫描内存中方不下的数据集时,我们要找一种惰性获取数据项的方式,即按需一次获取一个数据项。这就是迭代器模式。
1可迭代对象
1.1序列可以迭代的原因
解释器需要迭代对象x时,会自动调用iter(x),内置的iter函数有以下作用:
检查对象是否实现了iter方法,如果实现了就调用它,获取一个迭代器。
如果没有实现iter方法,但是实现了getitem方法,python会创建一个迭代器,尝试按顺序(从索引0开始)获取元素
如果尝试失败,python抛出TypeError异常,通常会提示”C object is not iterable“,其中C是目标迭代对象
2 迭代器
2.1迭代器的接口
标准的迭代器接口有两个方法:
next:返回下一个可用的元素,如果没有元素了,抛出StopIteration
iter:返回self,以便在应该使用可迭代对象的地方使用迭代器,例如在for循环中
6.2.2 一个经典的迭代器
#可迭代对象和迭代器一定不能在一个对象中同时实现,一下为典型的迭代器
import re
import reprlib
RE_WORD = re.compile('\w+')
class Sentence:
def __init__(self,text):
self.text = text
self.words = RE_WORD.findall(text)
def __iter__(self):
return SentenceIterator(self.words)
def __repr__(self):
return 'Sentence(%s)' % reprlib.repr(self.text)
#实现迭代器
class SentenceIterator(self,words):
def init(self,words):
self.words = words
self.index = 0
def next(self):
try:
word = self.words[self.index]
except IndexError:
raise StopIteration()
self.index += 1
return word
def iter(self):