严格来说,任何实现了__iter__方法或__getitem__方法的对象都可以被遍历。
但是要注意,不是所有东西都适合遍历,比如数字(整数、浮点数)就不能直接遍历,除非将其包装成范围或序列。
在Python中,我们通常说"可迭代对象"(Iterable)是指那些能够一次返回一个元素的对象。例如,在for循环中,我们遍历的就是可迭代对象。
不是所有东西都可以直接遍历,但Python中大多数容器和序列都可以! 主要有以下几类可遍历的对象:
一、可以直接遍历的常见类型:
1. 字符串 - 遍历字符
python
s = "hello"
for char in s: # 'h' → 'e' → 'l' → 'l' → 'o'
print(char)
2. 列表 - 遍历元素
python
lst = [1, 2, 3]
for item in lst: # 1 → 2 → 3
print(item)
3. 元组 - 遍历元素
python
tup = (1, 2, 3)
for item in tup: # 1 → 2 → 3
print(item)
4. 字典 - 默认遍历键,也可遍历值或键值对
python
d = {'a': 1, 'b': 2}
# 默认遍历键
for key in d: # 'a' → 'b'
print(key)
# 遍历值
for value in d.values(): # 1 → 2
print(value)
# 遍历键值对
for key, value in d.items(): # ('a', 1) → ('b', 2)
print(key, value)
5. 集合 - 遍历元素(无序)
python
s = {1, 2, 3}
for item in s: # 顺序不确定
print(item)
6. range对象 - 遍历数字序列
python
for i in range(5): # 0 → 1 → 2 → 3 → 4
print(i)
7. 文件对象 - 遍历行
python
with open('file.txt') as f:
for line in f: # 一行一行读取
print(line)
二、需要特殊方法才能遍历的:
8. enumerate对象 - 同时获取索引和值
python
s = "abc"
for i, char in enumerate(s): # (0,'a') → (1,'b') → (2,'c')
print(i, char)
9. zip对象 - 同时遍历多个序列
python
names = ["Alice", "Bob"]
ages = [25, 30]
for name, age in zip(names, ages): # ("Alice",25) → ("Bob",30)
print(name, age)
10. 生成器 - 惰性遍历
python
# 生成器表达式
gen = (x*2 for x in range(3)) # 0 → 2 → 4
for num in gen:
print(num)
三、不能直接遍历的常见类型:
1. 数字(整数、浮点数) - ❌ 不能遍历
python
num = 123
for digit in num: # ❌ TypeError: 'int' object is not iterable
print(digit)
需要先转换:
python
num = 123
for digit in str(num): # '1' → '2' → '3'
print(digit)
2. 布尔值 - ❌ 不能遍历
python
flag = True
for item in flag: # ❌ TypeError: 'bool' object is not iterable
print(item)
3. None - ❌ 不能遍历
python
value = None
for item in value: # ❌ TypeError: 'NoneType' object is not iterable
print(item)
4. 单个对象 - ❌ 需要容器包装
python
obj = "I'm a string, but..."
for char in obj: # ✅ 可以,因为字符串是可迭代的
print(char)
num = 42
for item in num: # ❌ 不行
print(item)
# 需要包装成容器
for item in [num]: # ✅ 可以
print(item)
四、判断是否能遍历的技巧:
python
from collections.abc import Iterable
print(isinstance("hello", Iterable)) # ✅ True
print(isinstance([1,2,3], Iterable)) # ✅ True
print(isinstance(123, Iterable)) # ❌ False
print(isinstance(True, Iterable)) # ❌ False
print(isinstance(None, Iterable)) # ❌ False
总结:
- 可以遍历的:字符串、列表、元组、字典、集合、range、文件等容器
- 不能直接遍历的:数字、布尔值、None等单一值
- 核心原则:如果包含多个元素(序列、集合、映射),通常可以遍历;如果是单个值,通常不能直接遍历
记住:当你看到 for x in y: 时,y 必须是一个可迭代对象(包含多个元素)。