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