type
status
date
slug
summary
tags
category
icon
password
在[[Python]]中,
for ... in ...
循环的原理是基于[[迭代器]]协议,这是Python的一种协议(或者说是一组规范),它需要被迭代的对象提供两个特殊方法:__iter__()
和__next__()
。这两个方法允许Python的for
循环重复地获取一个序列的下一个元素。迭代器协议的工作流程如下:
- 初始化迭代器:
当循环开始时,Python首先调用被迭代对象的
__iter__()
方法。这个方法应该返回一个迭代器对象,该对象必须实现__next__()
方法。
- 迭代元素:
接着,Python在迭代器对象上不断调用
__next__()
方法来获取序列的下一个元素。
- 处理StopIteration异常:
当迭代器没有更多元素可供返回时,
__next__()
方法应该抛出一个StopIteration
异常。Python捕获这个异常来识别迭代的结束,并退出for
循环。
举个例子:
这里的
Repeater
类实现了__iter__()
方法,它返回一个RepeaterIterator
实例。RepeaterIterator
类实现了__next__()
方法,它不断返回相同的值。当使用
for ... in ...
循环迭代Repeater
实例时,以下步骤会发生:for
循环调用repeater.__iter__()
获取迭代器对象(一个RepeaterIterator
实例)。
for
循环在这个迭代器对象上调用__next__()
方法来获取下一个元素(在这个例子中,总是self.source.value
)。
- 由于
RepeaterIterator
的__next__()
方法没有抛出StopIteration
异常,这个循环将无限继续下去,除非外部机制(比如一个break
语句)中断它。
以下是一个使用例子:
当这段代码运行时,它将无限次地打印出字符串"Hello"。每次迭代时,
Repeater
的实例repeater
都会通过它的__iter__
方法提供一个新的RepeaterIterator
实例,而这个迭代器的__next__
方法总是返回相同的字符串。实际上,这段循环可以等价于:
注意,由于这个迭代器是无限的,上面的for循环将永远运行下去,除非你通过某种方式(比如通过捕获一个异常或使用一个明确的break语句)中断它。
- Author:Jarrett Au
- URL:https://blog.coding-park.top//article/python-for-in
- Copyright:All articles in this blog, except for special statements, adopt BY-NC-SA agreement. Please indicate the source!