Python迭代器
一 什么是迭代器协议
1迭代器协议:对象必须提供一个next()方法,执行该方法要么返回迭代中的下一项,要么就引起一个StopIteration异常,以终止迭代(只能往前,不能退后)!!!
2可迭代对象:实现了迭代器协议的对象(如何实现迭代器协议,对象内部中的_iter_()方法)
3协议是一种约定,可迭代对象实现了迭代器协议,Python的内部函数工具(如for循环,sum,min,max函数等)使用迭代器协议访问对象!!!
二Python中强大的for循环机制
for循环的本质,循环所有对象,都是使用迭代器协议
(字符串str,列表list,元组tunple,字典dict,,集合set,文件对象)这些都不是可迭代对象,是for循环,调用了他们的内部的_iter_方法,把他们变成了可迭代对象,(补充:为什么str,list,tunple可以有下标,例如list[0],因为他们是有序的)
for循环把他们变成了可迭代对象后,就调用可迭代对象的_next()_方法去取值,而且for循环会捕获StopIteration异常,以终止迭代!!!
l1 = [2,4,6,8,10] #定义l1列表 i_l1 = l1.__iter__() #把l1列表这个对象调用_iter_方法变成一个可迭代对象 print(i_l1) #打印结果是:<list_iterator object at 0x00000000029BD860>(一个可迭代的list对象)迭代器能节省内存!
#可迭代对象就有_netx_方法,如果超出了边界,就会捕获StopIteration print(i_l1.__next__()) print(i_l1.__next__()) print(i_l1.__next__()) print(i_l1.__next__()) print(i_l1.__next__()) print(i_l1.__next__()) #输出结果是: 2 4 6 8 10 Traceback (most recent call last): File "D:/py_files/my_first_py3/test1/test_1.py", line 377, in <module> print(i_l1.__next__()) StopIteration