Python可迭代对象,迭代器,生成器的区别
三者简要关系图
可迭代对象与迭代器
可迭代对象与迭代器不同点
1)可迭代对象包含迭代器。
2)如果一个对象拥有__iter__方法,其是可迭代对象;如果一个对象拥有next方法,其是迭代器。
3)定义可迭代对象,必须实现__iter__方法;定义迭代器,必须实现__iter__和next方法。
你也许会问,结论3与结论2是不是有一点矛盾?既然一个对象拥有了next方法就是迭代器,那为什么迭代器必须同时实现两方法呢?
因为结论1,迭代器也是可迭代对象,因此迭代器必须也实现__iter__方法。
介绍一下上面涉及到的两个方法:
1)iter()
该方法返回的是当前对象的迭代器类的实例。因为可迭代对象与迭代器都要实现这个方法,因此有以下两种写法。
写法一:用于可迭代对象类的写法,返回该可迭代对象的迭代器类的实例。
写法二:用于迭代器类的写法,直接返回self(即自己本身),表示自身即是自己的迭代器。
也许有点晕,没关系,下面会给出两写法的例子,我们结合具体例子看。
2)next()
返回迭代的每一步,实现该方法时注意要最后超出边界要抛出StopIteration异常。
可迭代对象和可迭代器实例
'''这是自定义的可迭代对象实现
Iterable 判断可迭代
Iterator 迭代器
生成器是特殊的迭代器
'''
from collections import Iterable, Iterator
# 这是可迭代对象
class MyList(object):
def __init__(self):
self.items = list()
def append_item(self, obj):
self.items.append(obj)
def __iter__(sel