在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 |
以上为个人经验,希望能给大家一个参考,也希望大家多多支持代码网。
发表评论