Python自学 - 类进阶(迭代器)

embedded/2025/1/12 18:54:42/

<< 返回目录

1 Python自学 - 类进阶(迭代器)

  迭代器是一个实现了 __iter____next__ 方法的对象。实现这两个方法是Python迭代行为一种约定。
  为什么要用迭代器?迭代器的好处是不占内存,它并不会像列表一样,把每个成员都占满。

1.1 迭代器的实现

1.1.1 实现__iter__()方法

__iter__ 方法必须返回迭代器对象本身,即 self。该方法使对象可迭代,意味着可以使用 for 循环遍历。

def __iter__(self):return self

1.1.2 实现__next__()方法

__next__ 方法返回迭代器的下一个元素。当没有更多元素时,应该引发 StopIteration 异常。
完整示例:

class HeavenlyEarthlyIterator:def __init__(self, maxlen):self.heavenly_stems = ["甲", "乙", "丙", "丁", "戊", "己", "庚", "辛", "壬", "癸"]self.earthly_branches = ["子", "丑", "寅", "卯", "辰", "巳", "午", "未", "申", "酉", "戌", "亥"]self.stem_index = 0self.branch_index = 0self.maxlen = maxlenself.index = 1def __iter__(self):return selfdef __next__(self):if self.index <= self.maxlen:if self.stem_index >= len(self.heavenly_stems):self.stem_index = 0if self.branch_index >= len(self.earthly_branches):self.branch_index = 0result = self.heavenly_stems[self.stem_index] + self.earthly_branches[self.branch_index]self.stem_index += 1self.branch_index += 1self.index += 1return resultelse:raise StopIteration()# 使用示例
for i in HeavenlyEarthlyIterator(60):print(i, end=",")

输出:

甲子,乙丑,丙寅,丁卯,戊辰,己巳,庚午,辛未,壬申,癸酉,甲戌,乙亥,丙子,丁丑,戊寅,己卯,庚辰,辛巳,壬午,癸未,甲申,乙酉,丙戌,丁亥,戊子,己丑,庚寅,辛卯,壬辰,癸巳,甲午,乙未,丙申,丁酉,戊戌,己亥,庚子,辛丑,壬寅,癸卯,甲辰,乙巳,丙午,丁未,戊申,己酉,庚戌,辛亥,壬子,癸丑,甲寅,乙卯,丙辰,丁巳,戊午,己未,庚申,辛酉,壬戌,癸亥,

示例中声明了迭代器的长度由对象创建时的参数maxlen指定,在__next__()函数中,对self.index进行递增和判断,当达到最大长度时,抛出StopIteration异常(这是迭代器的标准动作),for循环会检测StopIteration异常后停止。

1.2 内置函数iter()next()

  • iter()函数可以把一个可迭代对象变成一个迭代器,如果对象已经是迭代器,则返回对象本身。
  • next()函数可以获取迭代器的下一个成员
my_list = [1, 2, 3]
my_iterator = iter(my_list)
print(next(my_iterator))  # 输出: 1
print(next(my_iterator))  # 输出: 2
print(next(my_iterator))  # 输出: 3
# 引发 StopIteration 异常
print(next(my_iterator))

作者声明:本文用于记录和分享作者的学习心得,可能有部分文字或示例来源自豆包AI,由于本人水平有限,难免存在表达错误,欢迎留言交流和指教!
Copyright © 2022~2025 All rights reserved.
<< 返回目录


http://www.ppmy.cn/embedded/153356.html

相关文章

使用Struts2遇到的Context[项目名称]启动失败问题解决(Java Web学习笔记)

1 引言 读的书中12.1小节的《下载和安装Struts 2 框架》时&#xff0c;按照书中的方法&#xff0c;手工创建一个Web项目&#xff0c;却启动失败。下面完整复原该问题产生过程。 所用环境为&#xff1a; 名称版本Tomcat8.5.78Java1.8Struts2.3.16 在webapps下创建一个目录te…

git问题

拉取项目代码后&#xff0c;出现 1、找回未commit的代码 2、记录不全&#xff0c;只是显示部分代码记录

PySpark广播表连接解决数据倾斜的完整案例

使用PySpark解决数据倾斜问题的完整案例&#xff0c;通过广播表连接的方式来优化性能。 准备数据 假设我们有两张表&#xff0c;一张大表 big_table 和一张小表 small_table &#xff0c;小表将作为广播表。 from pyspark.sql import SparkSession# 初始化SparkSession spar…

车载音频开发(二):对音频数据作音量调节

通过前一个章节打下的基础车载音频开发&#xff08;一&#xff09;&#xff1a;从看懂wav开始https://blog.csdn.net/Hellomino_/article/details/140873133?fromshareblogdetail&sharetypeblogdetail&sharerId140873133&sharereferPC&sharesourceHellomino_&…

webpack03

什么是source-map 将代码编译压缩之后&#xff0c;&#xff0c;可以通过source-map映射会原来的代码&#xff0c;&#xff0c;&#xff0c;在调试的时候可以准确找到原代码报错位置&#xff0c;&#xff0c;&#xff0c;进行修改 source-map有很多值&#xff1a; eval &#…

2025年第三届“华数杯”国际大学生数学建模竞赛【A题】Problem A: Can He Swim Faster

问题1&#xff1a;运动员的出色比赛表现通常得益于艰苦且持续的专业训练&#xff0c;这不仅提升了游泳技能&#xff0c;也增强了生理储备。比赛中&#xff0c;科学控制游泳速度是关键&#xff0c;包括保持个人节奏、寻求最佳身体状态节奏和合理分配体力。针对自由泳项目&#x…

【计算机网络】IPSec的安全协议和封装模式

根据上一篇文章我们讲了IPSec的基本框架&#xff0c;这一篇我们将对IPSec的协议和封装模式进行讲解。 IPSec安全协议 AH(Authentication Header)报文头验证协议&#xff0c;主要提供完整性、真实性、防重放功能&#xff1b;然而&#xff0c;AH并不加密数据报文(机密性)。IP协议…

国产3D CAD将逐步取代国外软件

在工业软件的关键领域&#xff0c;计算机辅助设计&#xff08;CAD&#xff09;软件对于制造业的重要性不言而喻。近年来&#xff0c;国产 CAD 的发展态势迅猛&#xff0c;展现出巨大的潜力与机遇&#xff0c;正逐步改变着 CAD 市场长期由国外软件主导的格局。 国产CAD发展现状 …