Python,使用for循环对容器对象中的元素进行迭代,其中容器对象包括列表(list)、元组(tuple)、字典(dict)、集合(set),ETC。。但是为什么可以使用for循环来操作这些对象呢?首先,定义一个简单的类并尝试一下:classTestRange:def__init__(self,num):self.num=numforiinTestRange(10):print(i)#OutputTraceback(mostrecentcalllast):File"",line1,inTypeError:'TestRange'objectisnotiterable错误信息提示'TestRange'objectisnotaniterableobject。那么,什么是可迭代对象?在可迭代对象中,需要实现一个__iter__魔术方法,该方法的返回值需要是一个迭代器。那么,什么是迭代器?迭代器只需要实现__next__魔术方法。以列表(list)为例:>>>nums=[13,12,33]>>>iter_ret=nums.__iter__()#x有这个方法,说明list是可迭代的,这个方法返回一个迭代器>>>iter_ret>>iter_ret.__next__()13>>>iter_ret.__next__()12>>>iter_ret.__next__()33>>>iter_ret.__next__()Traceback(最近调用last):File"",line1,inStopIteration分析:如上所示,listnums中实现了__iter__方法,返回一个迭代器,迭代器_method中实现了__next_。在不断调用__next__的过程中,不断返回nums中的元素,直到出现StopIteration错误。其实for语句的作用和这个差不多。for语句的内部机制是:首先判断对象是否为可迭代对象,即是否存在__iter__方法,如果存在则调用__iter__方法并返回一个迭代器;否则,直接抛出TypeError异常;不断调用迭代设备的__next__方法,每次调用依次迭代获取当前值;迭代完所有元素后,抛出异常StopIteration,由python解释器自行处理;之前的TestRange报错是因为没有实现iteratorprotocol里面的两个方法现在继续完善:classTestRange:def__init__(self,_max):self.i=0self._max=_maxdef__iter__(self):returnselfdef__next__(self):ifself.i