03-迭代器应用:自定义列表
目标¶
- 能够自定义一个列表
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)
2. for...in...循环的本质¶
for item in Iterable 循环的本质就是先通过iter()函数获取可迭代对象Iterable的迭代器,然后对获取到的迭代器不断调用next()方法来获取下一个值并将其赋值给item,当遇到StopIteration的异常后循环结束。