Python中一切都是对象,下面我们来学习下可迭代对象和迭代器的异同
1可迭代对象
PS: 可迭代对象和迭代器之间的联系是,我们(程序员)从可迭代对象中获取迭代器。用iter获取,next遍历
一般来说,可迭代对象有下面几种描述方法。
- 使用 iter 内置函数可以获取迭代器的对象。
- eg:list,set,tuple,dict
- 实现了
__iter__
方法的对象- ps:iter(对象)返回一个迭代器
- 实现了
__getitem__
方法且参数是从零开始的索引- 如果没有实现
__iter__
方法,但是实现了__getitem__
方法,Python 会创建一个迭代器,尝试按顺序(从索引 0 开始)获取元素。如果尝试失败, Python 抛出 TypeError 异常,通常会提示“C object
is not iterable”
- 如果没有实现
一个可迭代对象例子
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 __getitem__(self, index):
return self.words[index]
def __len__(self):
return len(self.words)
def __repr__(self):
return 'Sentence(%s)' % reprlib.repr(self.text)
2 迭代器(对象)
一般来说,迭代器有着下面的描述
- 实现了无参数的
__next__
方法,返回序列中的下一个元素;如果没有元素了,那么抛出 StopIteration 异常 - Python 中的迭代器还实现了
__iter__
方法,因此迭代器也可以迭代。 该方法返回自身实例
一个标准的迭代器类
class SentenceIterator:
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):
return self
修改一下之前的Sentence类
class Sentence:
def __init__(self, text):
self.text = text
self.words = RE_WORD.findall(text)
...
def __iter__(self):
# 返回了一个迭代器
return SentenceIterator(self.words)
3 符合Python习惯的迭代器–生成器函数
PS:只要 Python 函数中包含关键字 yield,该函数就是生成器函数。且生成器是迭代器
class Sentence:
def __init__(self, text):
self.text = text
self.words = RE_WORD.findall(text)
...
def __iter__(self):
# 生成器函数
for word in self.words:
yield word
这使得我们不用单独再定义一个迭代器类~