for循环可以迭代序列对象,从左到右遍历序列对象的元素。这里for循环属于迭代工具,而序列属于可迭代对象,两者通过迭代协议联系。
python提供了内置函数next,以迭代器做输入,每次返回序列的下一元素,直到序列末尾,引发异常:
>>>i = iter([1, 2, 3, 4])
>>>next(i)
1
>>>next(i)
2
>>>next(i)
3
>>>next(i)
4
>>>next(i)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
StopIteration
而迭代器自身包含next()方法,效果和内置函数next()是一样的。这就是所谓的迭代协议:有next()方法的对象读取下一个元素,直到末尾触发StopIteration异常。所有的迭代工具内部都是在每次迭代时调用next()方法。
注意,文件对象本身就是其迭代器,有next()方法。而列表、元组、字典虽然是可迭代对象,但本身并不是迭代器,需要显式地转换成迭代器:i = iter(L)
,然后才能调用next()方法。