巧用Buildroot一站式解决OpenCV交叉编译依赖难题
2026/4/14 17:18:23
迭代器模式是一种行为型设计模式,其核心目的是:
提供一种方法顺序访问一个聚合对象(容器)中的各个元素,而又无需暴露该对象的内部表示。
形象比喻:就像翻书——你只需要调用“下一页”操作,就能依次阅读内容,而不需要知道书是怎么装订的、页码怎么存储的。
Python 语言内置了对迭代器模式的最完美支持,通过迭代协议(Iteration Protocol)实现:
__iter__()和__next__()方法的对象都是迭代器__iter__()方法的对象都是可迭代对象(Iterable)for循环、list()、tuple()、sum()等都自动使用迭代器协议因此,在 Python 中,迭代器模式几乎不需要手动实现,但理解其原理有助于写出更高效、更优雅的代码。
# 列表本身是可迭代对象(Iterable)my_list=[1,2,3,4]# 获取其迭代器it=iter(my_list)# 调用 my_list.__iter__()print(next(it))# 1 调用 it.__next__()print(next(it))# 2print(next(it))# 3print(next(it))# 4# print(next(it)) # 抛出 StopIteration 异常,表示迭代结束for循环内部就是这样工作的:
foriteminmy_list:print(item)# 等价于:it=iter(my_list)whileTrue:try:item=next(it)print(item)exceptStopIteration:breakclassReverseIterator:"""反向迭代器"""def__init__(self,data):self.data=data self.index=len(data)# 从末尾开始def__iter__(self):returnselfdef__next__(self):ifself.index==0:raiseStopIteration self.index-=1returnself.data[self.index]classMyCollection:"""容器类"""def__init__(self,items):self.items=itemsdef__iter__(self):returniter(self.items)# 正向迭代(使用内置)defreverse_iter(self):returnReverseIterator(self.items)# 提供反向迭代器# 使用collection=MyCollection([1,2,3,4,5])print("正向遍历:")forxincollection:print(x)print("\n反向遍历:")forxincollection.reverse_iter():print(x)输出:
正向遍历: 1 2 3 4 5 反向遍历: 5 4 3 2 1生成器是 Python 中实现迭代器的最简洁方式,使用yield关键字。
defreverse_generator(data):"""生成器函数:反向遍历"""foriinrange(len(data)-1,-1,-1):yielddata[i]deffibonacci_generator(n):"""生成斐波那契数列(惰性计算)"""a,b=0,1for_inrange(n):yielda a,b=b,a+b# 使用data=[1,2,3,4,5]print("反向生成器:")forxinreverse_generator(data):print(x)print("\n斐波那契数列前 10 项:")fornuminfibonacci_generator(10):print(num,end=" ")# 输出:0 1 1 2 3 5 8 13 21 34生成器自动实现了__iter__()和__next__(),并且支持StopIteration。
Python 标准库itertools提供了大量高效的迭代器工具:
importitertools data=[1,2,3]# 无限循环# for x in itertools.cycle(data): ...# 重复元素print(list(itertools.repeat(10,3)))# [10, 10, 10]# 累积print(list(itertools.accumulate([1,2,3,4])))# [1, 3, 6, 10]# 组合print(list(itertools.combinations('ABC',2)))# [('A', 'B'), ('A', 'C'), ('B', 'C')]# 过滤print(list(itertools.takewhile(lambdax:x<5,[1,4,6,7,1])))# [1, 4]# 链式连接print(list(itertools.chain('ABC','DEF')))# ['A', 'B', 'C', 'D', 'E', 'F']| 角色 | Python 中的对应 |
|---|---|
| Iterator | 实现__iter__()和__next__()的对象 |
| ConcreteIterator | 自定义迭代器类或生成器 |
| Aggregate | 可迭代对象(实现__iter__()) |
| ConcreteAggregate | list、tuple、dict、set、str 等 |
| 概念 | 是否可多次遍历 | 是否惰性计算 | 示例 |
|---|---|---|---|
| 可迭代对象 | 是 | 否 | list, tuple, str |
| 迭代器 | 否(一次用完) | 是 | iter(lst), 自定义迭代器 |
| 生成器 | 否 | 是 | yield 函数, (x for x in) |
for line in open('file.txt'):(惰性读取,不一次性加载)zip()、enumerate()、reversed()、sorted()等返回迭代器yield而不是手动实现类__iter__():让它支持for循环# 推荐:惰性读取大文件defread_large_file(file_path):withopen(file_path)asf:forlineinf:# 每次只读一行yieldline.strip()在 Python 中,迭代器模式不是“需要实现”的模式,而是**语言核心特性**。
掌握迭代协议和生成器,你就掌握了 Python 中最强大的数据处理工具之一。
如果你想看更高级的例子(如自定义可迭代容器、树结构遍历器、无限迭代器、协程与生成器的结合),或者如何用迭代器实现数据管道(Pipeline),欢迎继续问!