Python的可迭代对象与不可迭代对象详解
目录
- 一、可迭代对象(Iterable)
- 1.基础容器类型
- 2.文件对象
- 3.生成器(Generator)
- 4.其他可迭代对象
- 二、不可迭代对象(Non-Iterable)
- 1.基本数据类型
- 2.函数、模块等
- 三、如何判断对象是否可迭代?
- 方法 1:尝试用iter()函数
- 方法 2:使用isinstance()和Iterable
- 四、易混淆点:可迭代对象 vs 迭代器
- 转换关系
- 五、示例代码
- 可迭代对象遍历
- 不可迭代对象错误
- 总结
在python中,可迭代js对象(Iterable) 是指可以被遍历(例如用 for
循环逐项访问)的对象,而 不可迭代对象(Non-Iterable) 无法直接遍历。以下是详细分类和示例:
一、可迭代对象(Iterable)
可迭代对象需要实现 __iter__()
方法,或支持通过索引访问的 _http://www.devze.com_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 __itpythone编程客栈r__(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 |
以上为个人经验,希望能给大家一个参考,也希望大家多多支持编程客栈(www.devze.com)。
精彩评论