迭代器(高级)
什么是迭代器
由iter(x)函数返回,可以通过next(it)函数取值的对象就是迭代器迭代器协议:
迭代器协议是指对象能够使用next()函数获取下一项数据,没有下一项数据时触发一个StopIteration异常来终止迭代的约定迭代器协议的实现方法:
def next(self):
….注:此方法需要实现迭代器协议
什么是可迭代对象:
是指能用iter(obj)函数返回迭代器的对象(实例)
可迭代对象内部要定义__iter__(self)方法来返回迭代器对象
# 此示例示意将自定义的类创建的对象制作成为可迭代对象
class Mylist():
'''这是一个自定义的列表类型,此类型的对象是
用data属性绑定的列表来存储数据'''
def __init__(self, iterable=()):
self.data = [x for x in iterable]
def __repr__(self):
return 'Mylist(%s)' % self.data
# myl = Mylist([2, 3, 5, 7])
# for x in myl:
# print(x) # 报错,这个不是可迭代对象
# TypeError: 'Mylist' object is not iterable
print('--------修改为----------------------------')
class Mylist():
'''这是一个自定义的列表类型,此类型的对象是
用data属性绑定的列表来存储数据'''
def __init__(self, iterable=()):
self.data = [x for x in iterable]
def __repr__(self):
return 'Mylist(%s)' % self.data
def __iter__(self):
'''此方法用于返回一个能访问self对象的迭代器'''
print('__iter__() 方法被调用') # 调试用, 此方法仅会被一次用
return MylistIterator(self.data)
class MylistIterator:
'''写一个类,专门用来描述能够访问Mylist类型对象的迭代器'''
def __init__(self, lst):
self.data_lst = lst
self.cur_index = 0 # 迭代器访问的其实位置
def __next__(self):
'''此方法用来实现迭代器协议'''
if self.cur_index >= len(self.data_lst):
raise StopIteration
r = self.data_lst[self.cur_index]
self.cur_index += 1
return r
myl = Mylist([2, 3, 5, 7])
it = iter(myl) # 等同于调用 it = myl.__iter__()
print(next(it)) # 2
print(next(it)) # 3
for x in myl:
print(x)