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

Python入门——iter迭代器—__iter__()方法__next__()方法

iter迭代器

在 Python 中,迭代器(Iterator)是一个可以记住遍历位置的对象。迭代器对象从集合的第一个元素开始访问,直到所有的元素被访问完毕后结束。迭代器只能往前走,不能回退。

迭代器的核心概念

迭代器协议: 任何实现了 __iter__()和 __next__()方法的对象都是迭代器。__iter__(): 返回迭代器对象本身。
__next__(): 返回容器的下一个元素,直到没有元素时抛出 `StopIteration` 异常。

示例:

# 自定义一个简单的迭代器
class MyIterator:def __init__(self, data):self.data = dataself.index = 0  # 用来记录当前访问的位置def __iter__(self):return self  # 迭代器的 __iter__ 方法返回自身def __next__(self):if self.index < len(self.data):value = self.data[self.index]self.index += 1return valueelse:raise StopIteration  # 当没有更多元素时,抛出 StopIteration 异常# 使用该迭代器
my_list = [1, 2, 3, 4]
my_iter = MyIterator(my_list)for item in my_iter:print(item)		# 结果 1'\n' 2.. 3.. 4..
"""
解释:
这个 MyIterator 类实现了 __iter__() 和 __next__() 方法,因此它是一个迭代器。
在 for 循环中,Python 自动调用 __iter__() 方法来获取迭代器对象,并在每次循环时调用 __next__() 来获取下一个元素。
当所有元素都遍历完后,__next__() 方法抛出 StopIteration,循环就会结束。
"""

内置迭代器

Python 的许多内置数据类型都是可迭代的,比如列表、元组、字符串、字典和集合等。你可以通过 iter() 函数将这些对象转换为迭代器。

my_list = [1, 2, 3, 4]
my_iter = iter(my_list)print(next(my_iter))  # 输出: 1
print(next(my_iter))  # 输出: 2
print(next(my_iter))  # 输出: 3
print(next(my_iter))  # 输出: 4
print(next(my_iter))  # 抛出 StopIteration 异常
# Traceback (most recent call last):File "<stdin>", line 1, in <module>
StopIteration

迭代器与可迭代对象的区别

  • 可迭代对象(Iterable):实现了 __iter__() 方法,返回一个迭代器对象的对象。如列表、元组、字典、集合等。
  • 迭代器(Iterator):实现了 __iter__()__next__() 方法的对象。

可迭代对象可以通过 iter() 函数得到一个迭代器,迭代器可以用 next() 函数不断获取元素直到抛出 StopIteration 异常。

迭代器的应用场景

迭代器适用于遍历数据,不要求将所有数据一次性加载到内存中,特别适合处理大量数据或流数据。

文件读取示例

with open('test.txt', 'r') as file:for line in file:  # 文件对象是一个迭代器,每次读取一行print(line.strip())

总结

  • 迭代器是一种可以记住访问位置的对象,遵循迭代器协议(__iter__()__next__() 方法)。
  • 迭代器可以高效地处理数据流,避免将整个数据集一次性加载到内存中。
  • 许多内置对象都是可迭代的,并且可以通过 iter() 转换为迭代器。

http://www.mrgr.cn/news/62253.html

相关文章:

  • 7-4 西安距离
  • Denavit-Hartenberg DH MDH坐标系
  • LVGL移植高通点阵字库GT30L24A3W
  • 基于Python机器学习、深度学习技术提升气象、海洋、水文领域实践应用-以ENSO预测为例讲解
  • LabVIEW启动时Access Violation 0xC0000005错误
  • Cesium加载地形
  • 详解RabbitMQ三种队列类型
  • Rust编程中的浮点数比较
  • 多线程显示 CSV 2 PNG 倒计时循环播放
  • Redis 淘汰策略 问题
  • leetcode hot100【LeetCode 230. 二叉搜索树中第K小的元素】java实现
  • DOM---鼠标事件类型(移入移出)
  • Java AQS Semaphore 源码
  • 天润融通突破AI客服局限,三大关键提升文本机器人问答效果
  • [SWPUCTF 2021 新生赛]easy_sql的write up
  • 虚拟机Ubuntu实现和宿主机之间的数据传输(只能复制粘贴,包过)
  • JVM系列之内存布局
  • RK3568平台(PWM篇)红外遥控适配
  • 高效构建仓库AGV管理系统:基于Python的路径规划与货架管理
  • 电动车进入电梯数据集、自行车进入电梯数据集 电动车进入电梯VOC数据标注数据集
  • 带你用Go实现二维码小游戏(中)
  • Java AQS 源码
  • 利用双指针法解题
  • RNN在训练中存在的问题
  • 大模型入门综述---从模型,训练,部署全方面认识大模型
  • 如何解决Matplotlib报错:none of the following families were found: SimHei