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

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

iter迭代器

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

迭代器的核心概念

迭代器协议: 任何实现了 __iter__()和 __next__()方法的对象都是迭代器。

__iter__(): 返回迭代器对象本身。
__next__(): 返回容器的下一个元素,直到没有元素时抛出 `StopIteration` 异常。

示例:

# 自定义一个简单的迭代器
class MyIterator:
    def __init__(self, data):
        self.data = data
        self.index = 0  # 用来记录当前访问的位置

    def __iter__(self):
        return self  # 迭代器的 __iter__ 方法返回自身

    def __next__(self):
        if self.index < len(self.data):
            value = self.data[self.index]
            self.index += 1
            return value
        else:
            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.kler.cn/a/372142.html

相关文章:

  • Unity复刻胡闹厨房复盘 模块一 新输入系统订阅链与重绑定
  • 企业数字化转型中的“烟囱效应”:从小烟囱到大烟囱的折中之道
  • dns一般设置为多少
  • 医疗大模型威胁攻击下的医院AI安全:挑战与应对策略
  • vue3入门教程:ref函数
  • 递归查询全量分页数据问题
  • Comsol CPU水冷散热系统流热固多场耦合仿真
  • 【重生之我要苦学C语言】操作符详解、结构体与表达式求值过程
  • Docker部署学习
  • SQL语言基础
  • 【Linux】centos7内核编译6.11.3版本及其所出现的问题解决方案(升级make、升级gcc)
  • 包和模块(上) python复习笔记
  • 汇流箱组件:光伏汇流采集装置 参数介绍
  • RTT工具学习
  • AI技术的应用前景如何?它会不会改变我们的生活和工作方式?
  • 阿里云VPC机器如何访问公网
  • Vue.observable vs Vuex:何时使用轻量级状态管理?
  • 【python】flash-attn安装
  • 【Clickhouse】客户端连接工具配置
  • 面试 Java 基础八股文十问十答第二十九期
  • Javaee:阻塞队列和生产者消费者模型
  • Brainpy的jit编译环境基础
  • 【LeetCode】跳跃游戏ⅠⅡ 解题报告
  • 如何在Linux系统中使用Netcat进行网络调试
  • Transformer中的Encoder
  • 基于STM32G0的USB PD协议学习(3)