官方文档解释 【for循环语句】,明确说明“starred_list 表达式会被求值一次;它应当产生一个 iterable 对象。 将针对该可迭代对象创建一个 iterator。”其中starred_list是指for语句后边括号内的表达式,他需要产生一个iterable对象,然后再用这个iterable对象创建一个iterator。
何为iterable对象, 强烈建议阅读最权威的【官方文档】,大致如下:
- 任何定义了__iter__() 方法或实现了 sequence 语义的__getitem__() 方法的自定义类的对象。
再次强调尽量阅读官方资料,因为目前网上相关的教程大部分定义iterable对象的时候总是说实现了__iter__() 的对象,漏掉了__getitem__() ,这显然错误的,然后以诶传诶误人子弟。
言归正传,有了iterable对象for循环语句接下来会调用类方法__iter__()或者内置方法iter()创建一个iterator(迭代器),接着就可以调用这个iterator.next()去获取元素,当iterator所有元素都被迭代完会抛出StopIteration错误,for语句捕获到了这个错误就会结束循环。
总结下for循环的工作流程:
- 运行
for i in starred_list
中的starred_list语句一次 - starred_list语句的结果如果是一个iterable对象继续下一步,否则抛出
TypeError
异常 - 调用类方法__iter__()或者内置方法iter()用这个
iterable对象
创建一个iterator
(迭代器) - 调用
iterator
里的__next__()获得元素并且执行循环体代码段 - 捕获到
StopIteration
(迭代器结束异常)结束整个for循环