【Python3_进阶系列_009】Python3-迭代器

一、迭代器

迭代器对象是支持迭代器协议的对象,在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迭代器

 

posted @ 2018-08-02 14:51  爱寂寞撒的谎言  阅读(86)  评论(0编辑  收藏  举报