先直接贴代码,并附加了详细注释
'''示意可迭代对象的定义'''
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__函数,解释不准确的地方也请大家指正,互相学习!