iterator遍历数组的核心是将数组转为可迭代对象并用__iter__和__next__协议逐个取值;python原生序列直接iter()即可,for循环自动调用该协议,自定义类只需实现__iter__方法。

Iterator 遍历数组的核心在于:**把数组变成可迭代对象,再用迭代器协议逐个取值**。它不依赖索引,也不暴露内部结构,而是通过统一接口(__iter__ 和 __next__)驱动遍历,天然适配所有遵循该协议的场景。
数组本身就是可迭代对象,直接调用 iter() 即可
Python 中的 list、tuple、str 等原生序列类型都实现了 __iter__() 方法,因此无需额外封装:
-
✅ 正确做法:
it = iter([10, 20, 30])→ 得到一个迭代器对象 - ❌ 错误理解: 认为要“手动实现 Iterator 类”才能遍历数组——其实完全不必
- 后续用
next(it)可依次获取10、20、30;第 4 次调用会抛出StopIteration
for 循环自动完成迭代器适配
你写的 for x in [1, 2, 3]: 表面是遍历数组,底层其实是三步自动完成:
- 调用
iter([1, 2, 3])获取迭代器 - 反复调用
next()取值 - 捕获
StopIteration后安全退出循环
这意味着:只要对象支持 iter(),就能直接用于 for,包括自定义类(只要实现 __iter__)。
适配非原生数组(如 NumPy 数组、自定义结构)
若数据源不是 Python 原生 list(比如 numpy.ndarray 或你自己写的容器),需确保它满足可迭代协议:
- 方法一:在类中定义
__iter__(self),返回一个含__next__的对象(如生成器yield) - 方法二:直接在
__iter__中用yield from self.data(最简捷) - 示例:
class MyArray:<br> def __init__(self, data): self.data = data<br> def __iter__(self): yield from self.data
→for x in MyArray([4, 5, 6]): print(x)就能正常工作
跨语言适配要点(Java/C++ 对照)
虽然语法不同,但 Iterator 的抽象逻辑一致:
-
Java:数组本身不可直接
iterator(),需转成List(如Arrays.asList(arr).iterator()) -
C++:用
std::vector<int> v = {1,2,3}; auto it = v.begin();</int>,配合it != v.end()和++it遍历 - 共性:都用“起始 + 结束”边界(
[begin, end)左闭右开)控制范围,不暴露存储细节











