for循环内部机制
-
Python中,使用for循环可以迭代容器对象中的元素
-
这里容器对象包括是列表(list)、元组(tuple)、字典(dict)、集合(set)等。
【一】迭代器
-
在可迭代的对象中,需要实现一个
__iter__
方法-
而且这个方法的返回值需要是一个迭代器。
-
-
迭代器只需要实现
__next__
方法。
{分析}
-
实现了
__iter__
方法,而且返回一个迭代器(iterator) -
迭代器中实现了
__next__
方法。 -
在不断调用
__next__
的过程中,就是在不断返回元素,直到出现StopIteration
的错误
【二】for循环内部机制
-
其实,for语句的作用与此类似。
-
for语句的内部机制为:
-
先判断对象是否为可迭代对象,即是否存在
__iter__
方法-
如果存在则调用
__iter__
方法,返回一个迭代器; -
否则,直接抛出TypeError异常;
-
-
不断地调用迭代器的
__next__
方法,每次调用按顺序迭代获取当前的值; -
迭代完所有元素,就抛出异常 StopIteration,
-
这个异常 python 解释器自己会处理;
-
-
-
前面的 TestRange 报错是因为它没有实现迭代器协议里面的这两个方法,现在继续改进:
class TestRange:
def __init__(self, _max):
self.i = 0
self._max = _max
def __iter__(self):
return self
def __next__(self):
if self.i < self._max:
i = self.i
self.i += 1
return i
else:
# 达到停止条件时,抛出此异常
raise StopIteration()
# 进行测试
for i in TestRange(3):
print(i)
# 输出
# 0
# 1
# 2
-
分析:
-
因为这个类中,已经实现了
__next__
方法,所以基于这个类所创建的对象,本身就是一个迭代器。 -
又因为可迭代对象需要有
__iter__
方法,而且返回一个迭代器,所以__iter__
返回对象本身self
即可。
-
【三】总结
-
for循环内部其实也报错了,只不过错误没让我们看见,内部处理了
-
for循环内部执行流程:
-
把关键字in后面的数据类型转为了迭代器 iter
-
循环next取值
-
next取值完毕之后也报错了,自动处理错误并且结束while循环
-