Python中的迭代器协议与可迭代对象
字数 929 2025-11-09 07:50:05

Python中的迭代器协议与可迭代对象

描述
在Python中,迭代器协议是支持迭代操作的核心机制。理解可迭代对象(Iterable)和迭代器(Iterator)的区别与联系,以及__iter__()__next__()方法的作用,是掌握Python迭代机制的关键。

知识点详解

  1. 可迭代对象(Iterable)

    • 定义:任何实现了__iter__()方法的对象,或者实现了__getitem__()方法且支持从0开始索引的对象。
    • 作用:可被用于for循环、列表推导式等迭代上下文中。
    • 常见例子:列表、元组、字符串、字典、集合。
    • 原理:当使用for item in iterable时,Python首先调用iter(iterable),该函数会返回一个迭代器对象。
  2. 迭代器(Iterator)

    • 定义:实现了__iter__()__next__()方法的对象。__iter__()返回迭代器自身(即self),__next__()返回下一个元素,若无元素则抛出StopIteration异常。
    • 特性:
      • 迭代器是惰性计算的,每次只产生一个元素,节省内存。
      • 迭代器只能向前迭代,不能回退或重置。
    • 注意:迭代器本身也是可迭代对象(因实现了__iter__())。
  3. 协议执行流程

    • 步骤1:对可迭代对象调用iter(),获取其迭代器。
    • 步骤2:重复调用迭代器的__next__()方法,直到捕获StopIteration异常。
    • 示例:for循环的底层行为等价于:
      iterator = iter(iterable)  # 调用iterable.__iter__()
      while True:
          try:
              item = next(iterator)  # 调用iterator.__next__()
          except StopIteration:
              break
          # 循环体处理item
      

示例与对比

  • 列表是可迭代对象,但不是迭代器(因其未实现__next__())。
  • 通过iter(list)返回的列表迭代器是真正的迭代器。
  • 自定义可迭代对象需实现__iter__(),并返回一个迭代器对象;若自身同时实现__next__(),则__iter__()可返回self(即自身作为迭代器)。

总结

  • 可迭代对象:提供迭代的能力,但不直接执行迭代。
  • 迭代器:实际执行迭代操作,维护迭代状态。
  • 协议通过__iter____next__方法解耦迭代逻辑,支持多种数据结构的灵活迭代。
Python中的迭代器协议与可迭代对象 描述 : 在Python中,迭代器协议是支持迭代操作的核心机制。理解可迭代对象(Iterable)和迭代器(Iterator)的区别与联系,以及 __iter__() 和 __next__() 方法的作用,是掌握Python迭代机制的关键。 知识点详解 : 可迭代对象(Iterable) 定义:任何实现了 __iter__() 方法的对象,或者实现了 __getitem__() 方法且支持从0开始索引的对象。 作用:可被用于 for 循环、列表推导式等迭代上下文中。 常见例子:列表、元组、字符串、字典、集合。 原理:当使用 for item in iterable 时,Python首先调用 iter(iterable) ,该函数会返回一个迭代器对象。 迭代器(Iterator) 定义:实现了 __iter__() 和 __next__() 方法的对象。 __iter__() 返回迭代器自身(即 self ), __next__() 返回下一个元素,若无元素则抛出 StopIteration 异常。 特性: 迭代器是惰性计算的,每次只产生一个元素,节省内存。 迭代器只能向前迭代,不能回退或重置。 注意:迭代器本身也是可迭代对象(因实现了 __iter__() )。 协议执行流程 步骤1:对可迭代对象调用 iter() ,获取其迭代器。 步骤2:重复调用迭代器的 __next__() 方法,直到捕获 StopIteration 异常。 示例: for 循环的底层行为等价于: 示例与对比 : 列表是可迭代对象,但不是迭代器(因其未实现 __next__() )。 通过 iter(list) 返回的列表迭代器是真正的迭代器。 自定义可迭代对象需实现 __iter__() ,并返回一个迭代器对象;若自身同时实现 __next__() ,则 __iter__() 可返回 self (即自身作为迭代器)。 总结 : 可迭代对象:提供迭代的能力,但不直接执行迭代。 迭代器:实际执行迭代操作,维护迭代状态。 协议通过 __iter__ 和 __next__ 方法解耦迭代逻辑,支持多种数据结构的灵活迭代。