当前位置: 首页 > article >正文

Python设计模式详解之15 ——迭代器模式

Python 中的 Iterator(迭代器)设计模式 是一种行为型设计模式,用于逐一访问集合对象中的元素而不暴露其底层实现。Python 本身对迭代器模式提供了良好的支持,迭代器通常通过 __iter____next__ 方法实现。


迭代器模式的组成

  1. 迭代器对象:实现了 __iter__()__next__() 方法。

    • __iter__():返回自身的迭代器对象(通常是 self)。
    • __next__():返回集合中的下一个元素。如果没有更多元素,则抛出 StopIteration 异常。
  2. 可迭代对象:实现了 __iter__() 方法,返回一个迭代器对象。


如何实现迭代器模式

以下是一个自定义实现的示例:

示例:一个范围的自定义迭代器
class MyRange:
    def __init__(self, start, end):
        self.start = start
        self.end = end

    def __iter__(self):
        return MyRangeIterator(self.start, self.end)


class MyRangeIterator:
    def __init__(self, start, end):
        self.current = start
        self.end = end

    def __iter__(self):
        return self

    def __next__(self):
        if self.current >= self.end:
            raise StopIteration
        value = self.current
        self.current += 1
        return value


# 使用自定义迭代器
for num in MyRange(1, 5):
    print(num)

输出:

1
2
3
4

Python 内置迭代器支持

在 Python 中,许多内置对象(如列表、字典、集合等)本身就实现了迭代器协议。您可以直接使用 iter()next() 来操作这些对象:

# 迭代器操作
nums = [1, 2, 3]
iter_nums = iter(nums)  # 获取迭代器
print(next(iter_nums))  # 输出 1
print(next(iter_nums))  # 输出 2
print(next(iter_nums))  # 输出 3

生成器与迭代器

生成器是创建迭代器的一种简单方式。生成器通过函数实现,使用 yield 语句逐步生成值。

def my_range(start, end):
    current = start
    while current < end:
        yield current
        current += 1

# 使用生成器
for num in my_range(1, 5):
    print(num)

输出与上面的自定义迭代器一致。


场景与优点

  • 延迟计算:迭代器一次生成一个值,适合处理大数据或无限数据流。
  • 抽象与封装:通过迭代器,可以隐藏数据结构的内部实现。

总结

Python 的迭代器设计模式在日常开发中非常常见,可以通过自定义类或生成器灵活实现。实际开发中,优先选择生成器实现,因为它更简洁易读,同时符合 Pythonic 风格。


http://www.kler.cn/a/411672.html

相关文章:

  • css—轮播图实现
  • Oracle RAC 环境下数据文件误建在本地目录的处理过程
  • C语言学习 12(指针学习1)
  • 超高流量多级缓存架构设计!
  • android 性能分析工具(03)Android Studio Profiler及常见性能图表解读
  • 今天你学C++了吗?——C++中的类与对象(第二集)
  • 异常检测 | 高斯分布拟合算法异常数据检测(Matlab)
  • JavaScript面向对象
  • <项目代码>YOLOv8 航拍行人识别<目标检测>
  • 准备学习boost::fiber库
  • RabbitMQ代码实战2
  • Leetcode322.零钱兑换(HOT100)
  • 训练的decoder模型文本长度不一致,一般设置为多大合适,需要覆盖最长的文本长度么
  • Spring集成RabbitMQ
  • 【spark-spring boot】学习笔记
  • IDEA某个Impl下的引入的文件红色
  • mp4视频流推送的学习
  • IDEA插件CamelCase,快速转变命名格式
  • 《硬件架构的艺术》笔记(八):消抖技术
  • css:转换
  • SQL优化笔记--explain看执行计划--主要还是看用了哪些索引,所以你是否失效--分库分表的注意事项(未完)
  • C#中面试的常见问题008
  • 列表代码思路
  • 前端技术选型之uniapp
  • MySQL中char和varchar的区别详解
  • JavaWeb——请求响应(5/8)-请求:日期参数json参数(使用场景及封装类型、接收方式、在 Postman 中传递、在服务端接收)