Python面试题更新 2026-08-05

在 Python 中,iterable(可迭代对象)和 iterator(迭代器)有哪些不同之处?请从它们的定义、所实现的方法、使用场景以及内存效率等方面进行说明。

技术原理Python

考察说明

考查对 Python 迭代协议中可迭代对象与迭代器定义、方法和使用区别的掌握。

回答思路

  1. 【回答框架 1】可迭代对象是实现了 __iter__ 方法的对象,该方法返回一个迭代器。迭代器是实现了 __iter__ 和 __next__ 方法的对象,其中 __next__ 返回序列中的下一个元素,并在没有元素时抛出 StopIteration 异常。例如,列表、元组、字符串都是可迭代对象,但不是迭代器。
  2. 【回答框架 2】迭代器是一个有状态的、一次性使用的对象。它可以通过内置函数 iter() 从可迭代对象获得,并且只能向前遍历,不能回退。每次调用 __next__ 都会保留内部状态,追踪当前位置。而可迭代对象本身不持有遍历状态,可以被多次迭代,每次迭代都生成新的迭代器。
  3. 【回答框架 3】从内存效率看,迭代器是惰性求值的,只在需要时生成下一个元素,因此适合处理大规模或无限的数据流,如使用生成器表达式或 yield 的函数返回的生成器。可迭代对象如列表会一次性加载所有元素到内存中,而迭代器则加载更少的数据,因此在处理大数据时迭代器更内存友好。
  4. 【回答框架 4】在 Python 中,for 循环会先调用 iter() 将可迭代对象转换为迭代器,然后反复调用 __next__ 直到捕获 StopIteration 异常。这是它们核心的使用机制。理解这个区别有助于设计更高效的数据处理流程。
  5. 【回答框架 5】对于可迭代对象,可以使用 iter() 和 next() 的函数接口操作。例如,it = iter([1,2,3]) 后,next(it) 依次返回 1、2、3,再次调用则抛出 StopIteration。这是与显式使用索引或遍历不同的迭代协议实现方式。
  6. 【关键点 1】可迭代对象实现 __iter__,迭代器实现 __iter__ 和 __next__。
  7. 【关键点 2】迭代器有状态且只能遍历一次,可迭代对象可重复迭代。
  8. 【关键点 3】迭代器惰性求值,内存效率高,适合大数据流。
  9. 【关键点 4】for 循环通过 iter() 和 next() 隐式使用迭代协议。
  10. 【易错点 1】不要混淆可迭代对象和迭代器,例如列表是可迭代的但不是迭代器,不能直接调用 next()。
  11. 【易错点 2】迭代器的一次性特性意味着对其多次遍历需要重新生成迭代器,否则会得到空结果。
  12. 【易错点 3】生成器是迭代器的一种,但并非所有迭代器都是生成器。