在 Python 中,迭代是数据处理的核心机制。无论是遍历列表、读取文件,还是使用 map/filter 等函数式编程工具,都离不开可迭代对象。避免混淆可迭代对象、迭代器、序列等概念,是写出更优雅高效的代码前提。
一、基本概念
1. 什么是迭代
An object capable of returning its members one at a time. 可迭代对象是一种能够一次返回其一个成员的对象。Examples of iterables include all sequence types (such as list, str, and tuple) and some non-sequence types like dict, file objects, and objects of any classes you define with an iter() method or with a getitem() method that implements sequence semantics. 可迭代对象的例子包括所有的序列类型(例如 list、str 和 tuple)和一些非序列类型,比如 dict、文件对象,以及任何定义了 iter() 方法或定义了实现序列语义的 getitem() 方法的类所创建的对象。
- '迭代'词义:汉语词汇,拼音为 dié dài,原指事物更相代替、轮换的过程,在计算机科学领域中,迭代通常涉及将每次迭代的结果作为下一次迭代的初始值,从而实现对问题的逐步求解。
- 所以'迭代'是解决问题的方法论。
2. 可迭代对象 vs 不可迭代对象
1). 判断标准
我们判断一个对象是否可迭代,最重要的特征就是,任何能够一次返回其一个成员的对象都称为可迭代对象。它不一定是一个'存储好的'完整序列(如列表),而可以是按需生成下一个值的对象,例如 range() 函数。
- 列表:
[1, 2, 3]→ 你可以逐个取出 - 字符串:'hello' → 你可以逐个字符读取
- 字典:
{"a": 1}→ 你可以逐个取出键 - 文件对象:可以逐行读取
例如:会依次返回 1、2、3:
for item in [1, 2, 3]:
print(item)
2). 尝试迭代不可迭代对象就会报错
下面案例中可以看到,我们对数值型变量进行遍历时,程序会报错:TypeError: 'int' object is not iterable:
item = 123
for i in item:
print(i)
3). 区分可迭代对象、不可迭代对象
- 能使用
for循环遍历的 → 可迭代对象 - 能使用
iter()函数获取迭代器的 → 可迭代对象 - 能用
isinstance(obj, Iterable)返回True的 → 可迭代对象
from collections.abc import Iterable
# 判断常见类型是否为可迭代对象
(([, , ], Iterable))
((, Iterable))
(((, , ), Iterable))
(({, , }, Iterable))
(({: }, Iterable))
((, Iterable))

