要知道for循环原理,首先我们要知道什么是迭代器
# 迭代器对象从集合的第一个元素开始访问,直到所有的元素被访问完结束。迭代器只能往前不会后退。
#
# 迭代器有两个基本的方法:iter() 和 next()。
#例如
list=[1,2,3,4]
it = iter(list) # 创建迭代器对象
print (next(it)) # 输出迭代器的下一个元素
#1
print (next(it))
#2
# 字符串,列表或元组对象都可用于创建迭代器:
# 可迭代对象时具有__iter__(self,参数)方法的类创建的对象
# 迭代器对象时具有__iter__和__next__方法的类创建的对象
# 迭代器的作用时记录数据当前位以后获取下个位置的值,并返回
# iter函数:获取可迭代对象的迭代器, 会调用可迭代对象身上的__iter__方法
# __iter__ 返回一个特殊的迭代器对象, 这个迭代器对象实现了 __next__() 方法并通过 StopIteration 异常标识迭代的完成
#
# StopIteration
# StopIteration 异常用于标识迭代的完成,防止出现无限循环的情况,在 __next__() 方法中我们可以设置在完成指定循环次数后触发 StopIteration 异常来结束迭代。。
# next函数:获取迭代器中下一个值,会调用迭代器对象身上的__next__方法
# for 循环的本质: 如果遍历的对象是可迭代对象那么会通过iter函数返回可迭代对象,再通过__next__函数返回下一个数据
class student_iter:
def __init__(self,__stu):
self.__stu=__stu
self.__index=0
def __next__(self):
"""
用列表下标定位
:return: 返回下一个数据
"""
if self.__index<len(self.__stu):
temp=self.__stu[self.__index]
self.__index+=1
return temp
else:
#越界,抛出异常
raise StopIteration
class studentManger:
def __init__(self):
self.list_student=[]
def add_student(self,name):
self.list_student.append(name)
def __iter__(self):
"""
创建迭代器对象,传递需要迭代的数据
:return:返回可迭代对象
"""
return student_iter(self.list_student)
s1=studentManger()
s1.add_student("小明")
s1.add_student("小红")
s1.add_student("小蓝")
stu_iter=s1.__iter__()
while True:
try:
stu_info=stu_iter.__next__()#返回数据
print(stu_info)
except StopIteration:
#如果异常就停止循环
break
"""
输出结果:
小明
小红
小蓝
"""
for item in s1:
#s1为可迭代对象
print(item,end=" ")
#小明 小红 小蓝
print()
a=iter(s1)#创建迭代器对象
print(next(a))#输出迭代器的下一个对象
print(next(a))#输出迭代器的下一个对象
print(next(a))#输出迭代器的下一个对象
"""
小明
小红
小蓝
"""
#for循环的原理是什么?
# 答:1. 获取迭代器
# 2. 循环获取下一个元素
# 3. 遇到异常停止迭代
# 可以被for的条件是什么?
# 答:能被for的对象必须具备__iter__方法
# 答:能被for的对象是可迭代对象