文章目录
- 列表(list):[1, 2, 3] 元组(tuple):(1, 2, 3) 字符串(str):"hello" 字典(dict):{"a": 1, "b": 2}(遍历键) 集合(set):{1, 2, 3}
- 打开的文件(TextIO):逐行遍历内容。 with open(“file.txt”) as f: for line in f: # 逐行读取 print(line)
- 生成器函数(使用 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)) # 可迭代
- 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
目录
- 一、可迭代对象(Iterable)
- 1.基础容器类型
- 2.文件对象
- 3.生成器(Generator)
- 4.其他可迭代对象
- 二、不可迭代对象(Non-Iterable)
- 1.基本数据类型
- 2.函数、模块等
- 三、如何判断对象是否可迭代?
- 方法 1:尝试用iter()函数
- 方法 2:使用isinstance()和Iterable
- 四、易混淆点:可迭代对象 vs 迭代器
- 转换关系
- 五、示例代码
- 可迭代对象遍历
- 不可迭代对象错误
- 总结
在Python中,可迭代对象(Iterable) 是指可以被遍历(例如用 for 循环逐项访问)的对象,而 不可迭代对象(Non-Iterable) 无法直接遍历。以下是详细分类和示例:
可迭代对象需要实现 __iter__() 方法,或支持通过索引访问的 __getitem__() 方法。常见类型包括:
- 列表(
list):[1, 2, 3]
- 元组(
tuple):(1, 2, 3)
- 字符串(
str):"hello"
- 字典(
dict):{"a": 1, "b": 2}(遍历键)
- 集合(
set):{1, 2, 3}
list):[1, 2, 3]tuple):(1, 2, 3)str):"hello"dict):{"a": 1, "b": 2}(遍历键)set):{1, 2, 3}
打开的文件(TextIO):逐行遍历内容。
with open("file.txt") as f:
for line in f: # 逐行读取
print(line)
生成器函数(使用 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)) # 可迭代
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
range 对象:range(5)enumerate):enumerate(["a", "b"])zip 对象:zip([1,2], [3,4])__iter__() 或 __getitem__()):
不可迭代对象通常是简单数据类型或未实现迭代协议的对象。例如:
- 整数(
int):5
- 浮点数(
float):3.14
- 布尔值(
bool):True(虽然 bool 是 int 的子类,但不可迭代)
None:None
int):5float):3.14bool):True(虽然 bool 是 int 的子类,但不可迭代)None:None
- 函数对象:
def f(): pass → f 不可迭代
- 模块:
import math → math 不可迭代
- 类对象:直接遍历类会报错(除非实现
__iter__)。
def f(): pass → f 不可迭代import math → math 不可迭代__iter__)。
如果对象不可迭代,会抛出 TypeError:
obj = 123
try:
iter(obj) # 触发 TypeError
except TypeError:
print("不可迭代")
更规范的检测方式:
from collections.abc import Iterable print(isinstance([1,2,3], Iterable)) # True print(isinstance(123, Iterable)) # False
- 可迭代对象(Iterable):可以被遍历(如列表、字符串)。
- 迭代器(Iterator):必须实现
__next__() 方法,用于逐个返回元素(如生成器)。
__next__() 方法,用于逐个返回元素(如生成器)。
- 可迭代对象 → 迭代器:通过
iter() 转换。
my_list = [1, 2, 3]
iterator = iter(my_list) # 转为迭代器
print(next(iterator)) # 输出 1
iter() 转换。
# 遍历字典的键值对
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 |
以上为个人经验,希望能给大家一个参考,也希望大家多多支持风君子博客。
您可能感兴趣的文章:
- python3 cookbook解压可迭代对象赋值给多个变量的问题及解决方案
- python 遍历可迭代对象的实现方法
- python可迭代类型遍历过程中数据改变会不会报错
- 一文带你解密Python可迭代对象的排序问题
- Python中for循环可迭代对象迭代器及生成器源码学习
- 一文搞懂python可迭代对象,迭代器,生成器,协程