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

news/2024/11/30 11:08:45/

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


迭代器模式的组成

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

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


如何实现迭代器模式

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

示例:一个范围的自定义迭代器
python">class MyRange:def __init__(self, start, end):self.start = startself.end = enddef __iter__(self):return MyRangeIterator(self.start, self.end)class MyRangeIterator:def __init__(self, start, end):self.current = startself.end = enddef __iter__(self):return selfdef __next__(self):if self.current >= self.end:raise StopIterationvalue = self.currentself.current += 1return value# 使用自定义迭代器
for num in MyRange(1, 5):print(num)

输出:

1
2
3
4

Python 内置迭代器支持

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

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

生成器与迭代器

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

python">def my_range(start, end):current = startwhile current < end:yield currentcurrent += 1# 使用生成器
for num in my_range(1, 5):print(num)

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


场景与优点

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

总结

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


http://www.ppmy.cn/news/1551178.html

相关文章

[网络安全]sqli-labs Less-5 解题详析

判断注入类型 GET1 and 11 回显如下&#xff1a;GET1 and 12没有回显&#xff0c;说明该漏洞类型为GET型单引号字符型注入 判断注入点个数 GET1 order by 3 --&#xff0c;回显如下&#xff1a;GET1 order by 4 --&#xff0c;回显如下&#xff1a;故注入点为3个 该题若查询…

Perforce SAST专家详解:自动驾驶汽车的安全与技术挑战,Klocwork、Helix QAC等静态代码分析成必备合规性工具

自动驾驶汽车安全吗&#xff1f;现代汽车的软件包含1亿多行代码&#xff0c;支持许多不同的功能&#xff0c;如巡航控制、速度辅助和泊车摄像头。而且&#xff0c;这些嵌入式系统中的代码只会越来越复杂。 随着未来汽车的互联程度越来越高&#xff0c;这一趋势还将继续。汽车越…

OpenCV_Code_LOG

孔洞填充 void fillHole(const Mat srcBw, Mat &dstBw) {Size m_Size srcBw.size();Mat TempMat::zeros(m_Size.height2,m_Size.width2,srcBw.type());//延展图像srcBw.copyTo(Temp(Range(1, m_Size.height 1), Range(1, m_Size.width 1)));cv::floodFill(Temp, Point(…

备赛蓝桥杯--算法题目(1)

1. 链表求和 . - 力扣&#xff08;LeetCode&#xff09; class Solution { public:ListNode* addTwoNumbers(ListNode* l1, ListNode* l2) {ListNode *head nullptr, *tail nullptr;int carry 0;while (l1 || l2) {int n1 l1 ? l1->val: 0;int n2 l2 ? l2->val:…

华为机试HJ73 计算日期到天数转换

首先看一下题 描述 根据输入的日期&#xff0c;计算是这一年的第几天。 保证年份为4位数且日期合法。 进阶&#xff1a;时间复杂度&#xff1a;O(n) &#xff0c;空间复杂度&#xff1a;O(1) 输入描述&#xff1a; 输入一行&#xff0c;每行空格分割&#xff0c;分别是年&…

理解Parquet文件和Arrow格式:从Hugging Face数据集的角度出发

parquet发音&#xff1a;美 [pɑrˈkeɪ] 镶木地板&#xff1b;拼花木地板 理解Parquet文件和Arrow格式&#xff1a;从Hugging Face数据集的角度出发 引言 在机器学习和大数据处理中&#xff0c;数据的存储和传输格式对于性能至关重要。两种广泛使用的格式是 Parquet 和 Arr…

电机驱动MCU介绍

电机驱动MCU是一种专为电机控制设计的微控制器单元&#xff0c;它集成了先进的控制算法和高性能的功率输出能力。 电机驱动MCU采用高性能的处理器核心&#xff0c;具有快速的运算速度和丰富的外设接口。它内置了专业的电机控制算法&#xff0c;包括PID控制、FOC&#xff08;Fi…

Linux,如何将文件从一台服务器传到另一台服务器上

摘要 将文件从一台服务器上传到另一台服务器上用到了scp命令。 scp&#xff08;Secure Copy Protocol&#xff09;命令用于在本地和远程主机之间或两个远程主机之间安全地复制文件或目录。它基于SSH协议&#xff0c;因此文件传输过程中会进行加密。以下是scp命令的详细解释及…