9-1 自定义迭代器

2018-08-26  本文已影响0人  正在努力ing
class User:
    # 定义可迭代对象
    def __init__(self,name):
        self.name = name

    def __iter__(self):
        return MyIterator(self.name)  #返回该可迭代对象的迭代器的实例

from collections.abc import Iterable,Iterator

class MyIterator(object):
    #定义迭代器 , 继承Iterator就不要再去实现__iter__
    def __init__(self,name):
        self.index = 0
        self.iter_name = name

    def __iter__(self):
        return self         # 返回该对象的迭代器类的实例;因为自己就是迭代器,所以返回self

    def __next__(self):
        try:
            word = self.iter_name[self.index]
        except IndexError:
            raise StopIteration
        self.index += 1
        return word

if __name__ == "__main__":
    user = User(["zhou","bob","java"])
    for it in user:
        print(it)
        
>>>  
zhou
bob
java

迭代对象和迭代器是实现了 __iter__ 方法的

而迭代器是额外还需要实现了 __next__ 方法的

可迭代对象, 迭代器 ,生成器, 序列 ,字典的关系如下:

image

结论如下:
1)在可迭代对象基础上,继续实现 __next__ 就是迭代器。
2)如果一个对象拥有iter方法,其是可迭代对象;如果一个对象拥有next方法,其是迭代器。
3)定义可迭代对象,必须实现iter方法;定义迭代器,必须实现iter和next方法。

上一篇下一篇

猜你喜欢

热点阅读