一、使用两个对象创建一个可被for循环遍历的迭代器
1、要求:使用两个对象自定义一个可以被for循环遍历的迭代器
2、注意事项:
a、Demo类中的【__iter__】方法中返回的迭代器引用,
并将当前类对象当作参数传入到迭代器中。
作用:可将Demo类中的数据引用传入至ClassIterator类中使用。
b、ClassIterator类中的要定义一个【__init__】方法,用于接收Demo类传入过来的引用。
c、为了能使用for循环正常遍历,ClassIterator类中的【__next__】方法中、
需要使用if语句进行判断是否下标越界。
d、最后要主动抛出StopIteration异常,用于for循环取值后停止遍历。
e、示例
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
class Demo(object):
def __init__(self):
self.names = list()
def add(self, name):
self.names.append(name)
def __iter__(self):
return ClassIterator(self) # 返回一个迭代器引用,并将obj当作参数传递
class ClassIterator(object):
def __init__(self, obj):
self.obj = obj
self.current_num = 0 # 设定下标的初始值
def __iter__(self):
pass
def __next__(self):
if self.current_num < len(self.obj.names): # 判断是否下标越界
ret = self.obj.names[self.current_num] # 取值
self.current_num += 1 # 每取一次值,下标进行加1操作
return ret # 返回取到的值,可通过next函数或for循环遍历取到值
else:
raise StopIteration # 主动抛出StopIteration异常
obj = Demo()
# 向列表中添加数据
obj.add("hw")
obj.add("lhq")
obj.add("xz")
# 使用for循环遍历obj对象,进行取值。
for name in obj:
print(name)
运行结果:
hw
lhq
xz
二、使用一个对象创建一个可被for循环遍历的迭代器(重点)
1、要求:使用一个对象自定义一个可以被for循环遍历的迭代器
2、注意事项:
a、Demo类中的【__iter__】方法中返回的迭代器引用中要传入【self】。
作用:可将Demo类中的数据引用传入至ClassIterator类中使用。
b、ClassIterator类中的要定义一个【__init__】方法,用于接收Demo类传入过来的引用。
c、为了能使用for循环正常遍历,ClassIterator类中的【__next__】方法中、
需要使用if语句进行判断是否下标越界。
d、最后要主动抛出StopIteration异常,用于for循环取值后停止遍历。
3、示例
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
class Demo(object):
def __init__(self):
self.names = list()
self.current_num = 0
def add(self, name):
self.names.append(name)
def __iter__(self):
return self # 返回对象自己
def __next__(self):
if self.current_num < len(self.names): # 判断是否下标越界
ret = self.names[self.current_num] # 取值
self.current_num += 1 # 每取一次值,下标进行加1操作
return ret # 返回取到的值,可通过next函数或for循环遍历取到值
else:
raise StopIteration # 主动抛出StopIteration异常
obj = Demo()
# 向列表中添加数据
obj.add("hw")
obj.add("lhq")
obj.add("xz")
# 使用for循环遍历obj对象,进行取值。
for name in obj:
print(name)
运行结果:
hw
lhq
xz