逐个获取元素的过程,就是「迭代」。
例如:
# iteration
# 用 for 循环迭代序列
a_list = [1, 2, 3]
for i in a_list:
print(i)
实现了方法 __iter__
的对象是可迭代的。
如果你暂时听不懂,那可以简单地理解为:如果我们可以从一个对象中逐个地获取元素,那么我们就说这个对象是「可迭代」的。
Python 中的顺序类型,都是可迭代的,例如 list
、 tuple
,、string
;另外 dict
、set
、 file
也是可迭代的。
实现了方法 __next__
的对象是迭代器。
当你调用方法 __next__
(可不提供任何参数)时,迭代器应返回下一个值。如果迭代器没有可供返回的值,应引发 StopIteration 异常。
你还可使用内置的便利函数 next
,在这种情况下,next(it)
与 it.__next__()
等效。
迭代器协议指的是容器类需要包含一个特殊方法,这个特殊方法就是 __iter__()
方法。
如果一个容器类提供了 __iter__()
方法,并且该方法能返回一个能够逐个访问容器内所有元素的迭代器,则我们说该容器类实现了迭代器协议。
讲这个例子,是为了更好地理解迭代器协议。
# iterator protocol and for loop
for x in something:
print(x)
Python 处理 for
循环时,首先会调用 something.__iter__()
,返回 something
对应的迭代器(假设叫 it
);而后,for
循环会调用 it.__next__()
,获取迭代器的下一个元素,并赋值给 x
,然后执行循环体;执行完后,for
循环会继续调用 it.__next__()
,获取迭代器的下一个元素,并赋值给 x
,执行循环体 …… 当 for
循环调用 it.__next__()
产生 StopIteration
异常时,循环结束。
咱们可以用下面的代码模拟一下:
>>> a_list = [1,2,3,4]
>>> it = a_list.__iter__() # 获取迭代器
>>> it.__next__() # 让迭代器返回下一个值
1
>>> it.__next__()
2
>>> it.__next__()
3
>>> it.__next__()
4
>>> it.__next__() # 迭代器没有可供返回的值,引发 StopIteration 异常
Traceback (most recent call last):
File "" , line 1, in <module>
StopIteration
>>>
参考资料
【1】《Python基础教程》(人民邮电出版社,第3版)
【2】 Python 中的黑暗角落(一):理解 yield 关键字