【学习心得】迭代器和可迭代对象

一、请阐述"迭代器对象"与"可迭代对象"的区别与联系

(1)迭代器对象

满足下面三个条件的对象就是迭代器对象。

  1. 类中同时实现了__iter__ 和 next 方法;
  2. iter 函数返回self,也就是自身;
  3. next 函数返回下一个值,如果没有下一个值则抛出StopIteration的异常。
python 复制代码
class MyRange():
    def __init__(self,num):
        self.num = num
        self.counter = -1     # 注意,counter是从-1开始的,所以第一次调用__next__函数,会返回0

    def __iter__(self):
        return self

    def __next__(self):
        self.counter += 1
        if self.counter == self.num:   # 如果迭代次数超过num,则触发异常StopIteration,停止迭代,并返回属性counter
            raise StopIteration()
        return self.counter

obj = MyRange(3)  # 设置迭代次数上限是3
print(next(obj))  # 输出0, 等价于 obj.__next__()  都是在调用obj这个实例中的__next__函数,输出下一个数据
print(next(obj))  # 输出1
print(next(obj))  # 输出2
print(next(obj))  # 由于迭代次数上限是3,所以第四次调用__next__函数时会报错

(2)可迭代对象

如果一个类中包含 iter 方法,并且返回一个迭代器,则称这个类创建的对象为可迭代对象。常见的如 list,dict,str 都是可迭代对象,但它们本身不是迭代器。

python 复制代码
# 可迭代对象
class Foo():
    def __iter__(self):
        return MyRange(3)
obj1 = Foo()  # 则obj1会是一个迭代器对象
# 因为obj1是一个迭代器对象,那么它可以用于for循环
# 在实际操作过程中,首先是通过__iter__获得迭代器对象,然后再通过next函数逐个取值
for item in obj1:
    pass

(3)两者的联系

迭代器一定是可迭代对象,但可迭代对象不一定是迭代器。可迭代对象的 iter 方法必须返回一个迭代器。

二、迭代器的优缺点

迭代器的设计哲学是**"用计算换空间"**。理解它的优缺点,是解决在项目中何时使用迭代器等容器类型的关键。

(1)优点

  1. 惰性求值,节省内存。这是迭代器的核心优点,它不需要一次性将所有数据加载到内存中,而是按需要生成下一个元素。迭代器在内存中相当于只占一个数据的空间,因为每次取值都上一条数据会在内存释放,加载当前的此条数据。
  2. 支持无限序列。由于不需要预知长度或存储所有元素,迭代器可以表示数学上无限的概念。

(2)缺点

  1. 单向、一次性消耗。迭代器因为有next函数,所有只能向前推进,不能回退、不能重置、不能重复遍历。一旦耗尽抛出StopIteration,就永久失效。
  2. 不支持随机访问和长度查询。

三、for循环的本质

for循环的工作原理可以描述为如下动作:

  1. 使用 iter 获得可迭代对象的迭代器;
  2. 再反复对迭代器使用 next ;
  3. 捕获StopIteration异常,退出循环。
相关推荐
李永奉1 小时前
C语言-指针函数与函数指针及回调函数的使用
c语言·开发语言
AC赳赳老秦1 小时前
采集行为合规自检:OpenClaw 自动校验 robots 协议与采集频率,规避违规采集风险
java·开发语言·c++·python·php·deepseek·openclaw
钱栈up1 小时前
mvn compile 卡死在 javac 阶段:一次类型不匹配的排查与修复
java·开发语言
迅猛龙办公室1 小时前
Python输出当前计算机的系统日期和时间
开发语言·前端·python
杨丰玮4182 小时前
C语言基础知识(一)————各类符号的含义与输入输出库(stdio)
c语言·开发语言
程序猿编码2 小时前
工业视觉多任务方案:可编程梯度信息视觉框架,训练评估 + C++ 部署完整实战
开发语言·c++·视觉·推理引擎
XiaoMaqqqq3 小时前
知名的IP驱动产业新场景新工具
网络·python·网络协议·tcp/ip
言乐63 小时前
Python实现语音审核模型
开发语言·python·django·virtualenv·pygame
朝朝辞暮i3 小时前
C++ 第 21 课:struct —— 把一组相关数据打包在一起
开发语言·c++·算法