详解python中的迭代

11次阅读

python迭代是按需逐个访问元素的过程,由可迭代对象(含__iter__方法)和迭代器(含__next__方法)共同实现;for循环隐式调用二者,内置工具如enumerate、zip、reversed等增强迭代能力。

详解python中的迭代

Python中的迭代,本质是按需逐个访问数据集合中元素的过程,不是一次性加载全部内容,而是边取边用。它背后有一套统一的协议支撑,让不同数据类型能用同一种方式被遍历。

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

可迭代对象(如列表、字符串、字典、元组、集合)本身不直接提供“下一个元素”,但它有 __iter__() 方法,能返回一个真正的迭代器。迭代器才是那个带 __next__() 方法、能一步步吐出数据的对象。

  • 列表 [1,2,3] 是可迭代对象,但不是迭代器;调用 iter([1,2,3]) 才得到它的迭代器
  • 迭代器只能往前走,不能倒退;一旦用完,再次调用 next() 就会触发 StopIteration 异常
  • for 循环内部自动调用 __iter__() 和反复调用 __next__(),所以你平时写 for x in lst: 其实已经隐式用了整套机制

常见数据类型的迭代方式

不同容器默认迭代行为不同,掌握规律能少写很多冗余代码:

  • 列表/元组/字符串/集合:直接 for item in data: 就拿到每个元素
  • 字典for k in d: 迭代键;for v in d.values(): 迭代值;for k, v in d.items(): 同时拿键和值
  • 文件对象for line in f: 每次读一行,内存友好,不用 f.readlines() 全部载入

带索引或组合多个序列的迭代

纯元素遍历不够用时,Python 提供了几个内置迭代工具

立即学习Python免费学习笔记(深入)”;

  • enumerate():给元素自动加序号,for i, x in enumerate(['a','b','c'])(0,'a'), (1,'b'), (2,'c')
  • zip():把多个序列“拉链式”配对,for a, b in zip([1,2,3], ['x','y','z'])(1,'x'), (2,'y'), (3,'z')
  • reversed():生成反向迭代器,for x in reversed([1,2,3])3,2,1

手动控制迭代过程

理解 iter()next() 能帮你调试或实现特殊逻辑:

  • it = iter('abc') 创建迭代器
  • next(it) 返回 'a',再调一次得 'b',直到抛出 StopIteration
  • 可用 try/except 捕获异常来手动模拟 for 循环行为
  • 传入 next(it, default) 可设默认值,避免异常,适合不确定长度的场景
text=ZqhQzanResources