Python 当中的 for 循环并不是一种完全独立的语法机制,它在底层运行的过程当中,实际上建立在相对应的迭代协议基础之上。其中主要会涉及 Iterable、Iterator、iter()、next() 以及 StopIteration等相关概念。
这些概念表面上看起来比较分散,但是它们之间存在着较为明确的调用关系。一个对象能不能被for 循环正常遍历,取决于它是否具备相对应的可迭代能力;在真正开始获取数据的时候,还需要借助迭代器按照顺序逐个返回元素。当数据已经全部获取完成之后,则会通过StopIteration 来表示本次迭代过程已经结束。
生成器可以被理解成一种相对特殊的迭代器实现方式。主要通过yield 保存函数当前的执行状态,并且在每一次需要数据的时候,再继续从上一次暂停的位置向下开展运行。通过这样的方式,生成器不需要一次性把所有结果都计算出来,而是能够根据实际需要逐步产出相对应的数据。