一、迭代器
迭代器对象是支持迭代器协议的对象,在Python中,支持迭代器协议就是实现对象的__iter__()和__next__()方法。其中__iter__()方法返回迭代器对象本身;next()方法返回容器的下一个元素,在结尾时引发StopIteration异常。
可迭代对象:对象只要包含__iter__方法,就可以成为可迭代对象,就可以通过iter函数返回迭代器。
迭代器:对象同时包含__iter__和__next__方法,就是一个迭代器。可以通过next()获取值,也可以直接obj.__next__()获取值
例子1:购物车迭代器实现
class ShoppingCart(object): def __init__(self): self.index = 0 self.good = [1, 3, 5, 6] def __iter__(self): return self def next(self): return self.__next__() def __next__(self): if self.index < len(self.good): data = self.good[self.index] self.index += 1 return data else: raise StopIteration if __name__ == '__main__': cart = ShoppingCart() print(cart.next()) print(cart.next()) print(cart.next()) 输出: 1 3 5
例子2:可迭代对象的获取(序列类型都是可迭代的,都包含__iter__方法)
>>>l1 = [1,2,3,4] >>>l2 = l1.__iter__() ##对象调用__iter__()方法会返回一个新的iterable对象(可迭代的对象),next()方法传入可迭代对象是返回值 >>>next(l2) 1 >>>next(l2) 2 >>>next(l2) ..... next(l2) Traceback (most recent call last): File "<input>", line 1, in <module> StopIteration
l1 = [1,2,3]
l2 = l1.__iter__()
dir(l1)
['__add__', '__class__', '__contains__', '__delattr__', '__delitem__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__getitem__', '__gt__', '__hash__', '__iadd__', '__imul__', '__init__', '__init_subclass__', '__iter__', '__le__', '__len__', '__lt__', '__mul__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__reversed__', '__rmul__', '__setattr__', '__setitem__', '__sizeof__', '__str__', '__subclasshook__', 'append', 'clear', 'copy', 'count', 'extend', 'index', 'insert', 'pop', 'remove', 'reverse', 'sort']
dir(l2)
['__class__', '__delattr__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__iter__', '__le__', '__length_hint__', '__lt__', '__ne__', '__new__', '__next__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__setstate__', '__sizeof__', '__str__', '__subclasshook__']
type(l1)
<class 'list'>
type(l2)
<class 'list_iterator'>
可以看出:我们经常说序列是可迭代的(iterable)实际就是因为序列类型包含了(__iter__)方法,这个方法返回的是一个迭代器(同时包含:__iter__和__next__方法)。可以看到l2的类型是一个list迭代器