在Python中,可迭代对象(Iterable) 是指可以被遍历(例如用 for
循环逐项访问)的对象,而 不可迭代对象(Non-Iterable) 无法直接遍历。以下是详细分类和示例:
一、可迭代对象(Iterable)
可迭代对象需要实现 __iter__()
方法,或支持通过索引访问的 __getitem__()
方法。常见类型包括:
1. 基础容器类型
- 列表(
list
):[1, 2, 3]
- 元组(
tuple
):(1, 2, 3)
- 字符串(
str
):"hello"
- 字典(
dict
):{"a": 1, "b": 2}
(遍历键) - 集合(
set
):{1, 2, 3}
2. 文件对象
- 打开的文件(
TextIO
):逐行遍历内容。with open("file.txt") as f: for line in f: # 逐行读取 print(line)
3. 生成器(Generator)
-
生成器函数(使用
yield
):def count(n): i = 0 while i < n: yield i i += 1 for num in count(5): print(num) # 输出 0,1,2,3,4
-
生成器表达式:
squares = (x**2 for x in range(5)) # 可迭代
4. 其他可迭代对象
range
对象:range(5)
- 枚举对象(
enumerate
):enumerate(["a", "b"])
zip
对象:zip([1,2], [3,4])
- 自定义可迭代类(需实现
__iter__()
或__getitem__()
):class MyIterable: def __iter__(self): return iter([1, 2, 3]) for item in MyIterable(): print(item) # 输出 1,2,3
二、不可迭代对象(Non-Iterable)
不可迭代对象通常是简单数据类型或未实现迭代协议的对象。例如:
1. 基本数据类型
- 整数(
int
):5
- 浮点数(
float
):3.14
- 布尔值(
bool
):True
(虽然bool
是int
的子类,但不可迭代) None
:None
2. 函数、模块等
- 函数对象:
def f(): pass
→f
不可迭代 - 模块:
import math
→math
不可迭代 - 类对象:直接遍历类会报错(除非实现
__iter__
)。
三、如何判断对象是否可迭代?
方法 1:尝试用 iter()
函数
如果对象不可迭代,会抛出 TypeError
:
obj = 123
try:
iter(obj) # 触发 TypeError
except TypeError:
print("不可迭代")
方法 2:使用 isinstance()
和 Iterable
更规范的检测方式:
from collections.abc import Iterable
print(isinstance([1,2,3], Iterable)) # True
print(isinstance(123, Iterable)) # False
四、易混淆点:可迭代对象 vs 迭代器
- 可迭代对象(Iterable):可以被遍历(如列表、字符串)。
- 迭代器(Iterator):必须实现
__next__()
方法,用于逐个返回元素(如生成器)。
转换关系:
- 可迭代对象 → 迭代器:通过
iter()
转换。my_list = [1, 2, 3] iterator = iter(my_list) # 转为迭代器 print(next(iterator)) # 输出 1
五、示例代码
可迭代对象遍历:
# 遍历字典的键值对
d = {"a": 1, "b": 2}
for key, value in d.items():
print(key, value)
不可迭代对象错误:
num = 100
for x in num: # 触发 TypeError: 'int' is not iterable
print(x)
总结
类型 | 可迭代 | 示例 |
---|---|---|
列表、元组、字符串 | ✔️ | [1, 2] , "abc" |
字典、集合 | ✔️ | {"a": 1} , {1, 2} |
生成器、文件对象 | ✔️ | (x for x in range(3)) |
整数、浮点、None | ❌ | 123 , 3.14 , None |
理解可迭代对象是掌握Python循环、生成器、推导式等高级用法的关键! 🚀