03-迭代器应用:自定义列表

目标

  • 能够自定义一个列表

image-20180822154542407

1. 自定义迭代器Iterator

一个类实现了__iter__方法和__next__方法的对象,就是自定义迭代器。

自定义迭代器类,必须满足如下:
1)实现 __iter__() 方法
2)实现 __next__() 方法
  • 当调用iter(迭代器对象)时,会调用对象的 __iter__()方法
  • 当调用next(迭代器对象)时,会调用对象的 __next__() 方法

  • 迭代器自身正是一个迭代器,所以迭代器的__iter__方法返回自身即可。

from collections import Iterable
# 自定义列表类
class MyList():
    # 定义构造方法,用于初始化实例属性
    def __init__(self):
        # 定义实例属性 item ,并初始化值为空列表
        self.item = list()

    # 添加元素
    def addItem(self, data):
        # 把数据保存到实例属性中
        self.item.append(data)

    # 获取对象的迭代器
    def __iter__(self):
        # 返回迭代器对象
        mylist_iterator = MyListIterator(self.item)
        return mylist_iterator


# 自定义迭代器类
class MyListIterator():

    # 定义构造方法
    def __init__(self, item):
        # 保存数据到当前类的实例变量中
        self.item = item

        # 初始化迭代器默认下标
        self.current_index = 0

    # 必须含有方法一: __iter__()
    def __iter__(self):
        pass

    # 必须含有方法二:__next__()
    def __next__(self):

        # 判断迭代器是否到了列表末尾
        if self.current_index < len(self.item):

            # 获取列表元素值
            data1 = self.item[self.current_index]
            # 让列表下表值+1
            self.current_index += 1
            # 返回获取的列表值
            return data1

        else:
            # 抛出异常
            raise StopIteration


if __name__ == '__main__':

    # 实例化对象 mylist
    mylist = MyList()
    # 添加元素
    mylist.addItem("张三")
    mylist.addItem("李四")
    mylist.addItem("C罗")

    # 判断是否是可迭代对象
    result = isinstance(mylist, Iterable)
    print(result)

    # 遍历自定义列表对象
    for value in mylist:
        print(value)

image-20180704185515374

2. for...in...循环的本质

for item in Iterable 循环的本质就是先通过iter()函数获取可迭代对象Iterable的迭代器,然后对获取到的迭代器不断调用next()方法来获取下一个值并将其赋值给item,当遇到StopIteration的异常后循环结束。

image-20180704190234219