自己写一个迭代器,然后重写list类,即MyList类,实现部分和list一样的特性

先直接贴代码,并附加了详细注释

'''示意可迭代对象的定义'''
class MyList:
    '''将此类改为可迭代对象'''
    def __init__(self, iterable):
        self.data = [x for x in iterable]
        return None  # __init__不返回或者只能返回None

    def __repr__(self):  # 返回输出的表达式字符串
        return "Mylist( % s)" % self.data

    def __len__(self):
        '''此方法是len()函数调用,此方法返回的必须是整数
        bool(self)找不到__bool__时,将调用这个函数,若返回0为家,大于0 为真
        '''  # 文档字符串换行需要三引号哟
        count = 0
        for x in self.data:
            if x:
                count += 1
        return count

    def __iter__(self):
        '''有此方法的对象可以称之为可迭代对象
        此方法必须返回迭代器,即需要自己做迭代器
        '''
        return MyListIterator(self.data)  # 创建迭代器

class MyListIterator:
    '''此类的对象是用于访问MyList对象的迭代器
        此类要作为迭代器则必须有__next__(self)方法来实现迭代器协议
    '''  # 换行需要用三引号
    def __init__(self, data):
        self.data = data  # 绑定可迭代对象的数据
        self.index = 0  # 代表self.data的索引
    def __next__(self):  # 这个里面就是实现了迭代器协议
        '''有次方法的类可以称之为迭代器'''
        if self.index >= len(self.data):
            raise StopIteration  # 这里我们抛出StopIteration,就不再提供数据,这个异常是给for语句的和while语句
        r = self.data[self.index]  # 另外的,如果self.index等于len(self.data)时,若前面使用if self.index >= len(self.data),
        # 编译器将报错,异常结果为IndexError: list index out of range
        self.index += 1
        return r

# for x in MyList("ABC"):  # 其中for语句内置了处理StopIteration异常的机制
#     print(x)  # 为定义迭代器的时候,会报错。TypeError: 'MyList' object is not iterable

# 以上语句等同于
myl = MyList("123")
it = iter(myl)  # TypeError: 'MyList' object is not iterable,没有定义__iter__会报错
while True:
    try:
        x = next(it)   # x = it.__next__()
        print(x)  #
    except StopIteration:
        break

以上代码就是实现一个迭代器,并重写一个类似于list类型的MyList类,代码中最核心的内容就是如何定义__iter__函数和__next__函数,解释不准确的地方也请大家指正,互相学习!

猜你喜欢

转载自blog.csdn.net/u010199356/article/details/84576182