python--006--迭代器协议和for循环工作机制

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__()

 

 

 

 看视频,做笔记,坚持学习

posted @ 2019-10-31 16:19  会长大的  阅读(230)  评论(0编辑  收藏  举报