1. 迭代器协议和for循环工作机制
定义
1)迭代器协议是指:对象必须提供一个next方法,执行该方法要么返回迭代中的下一项,要么就引起一个stopIteration异常,已终止迭代(只能往后不能往前退)。
2)可迭代对象:实现了迭代器协议的对象(如何实现:对象内部定义一个__iter__()方法)
3)协议是一种约定,可迭代对象实现了迭代器协议,python的内部工具(如for循环,sum,min,max函数等)使用迭代器协议访问对象。
for循环机制
for循环本质:循环所有对象,全都是使用迭代器协议
注:(字符串、列表、元组、字典、集合、文件对象)这些都不是可迭代对象,只不过在for循环,调用了他们内部的__iter__方法,把他们变成了可迭代对象
然后for循环调用可迭代对象的__next__方法去取值,而且for循环会捕捉StopIteration异常,以终止迭代
str = "hello" for i in str: print(i) iter_test = str.__iter__() print(iter_test) print(iter_test.__next__()) print(iter_test.__next__()) print(iter_test.__next__()) print(iter_test.__next__()) print(iter_test.__next__()) # print(iter_test.__next__()) l = [1, 2, 3] for i in l: # for循环实际上执行的就是这两步:i_l = l.__inter__() i_l.__next__() print(i)
为何要有for循环
序列类型 像列表、字符串等都有下标,用下标方式遍历没有问题,但如果是非序列类型的字典、集合、文件对象就不适用了。而for循环就是基于迭代器协议提供一个统一的可比遍历所有对象的方法,在遍历之前调用对象的__iter__()方法将其转换成一个迭代器,然后适用迭代器协议去实现循环访问,这样所有的对象就可以通过for循环来遍历了。
next()函数:就相当于执行iter_l.__next__()
l=['die','erzi','sunzi','chongsunzi'] iter_l=l.__iter__() print(next(iter_l)) #next()--就相当于-->iter_l.__next__()
看视频,做笔记,坚持学习