【python基础】常见的数据结构的遍历

严格来说,任何实现了__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 必须是一个可迭代对象(包含多个元素)。

相关推荐
草履虫建模11 小时前
力扣算法 1768. 交替合并字符串
java·开发语言·算法·leetcode·职场和发展·idea·基础
naruto_lnq13 小时前
分布式系统安全通信
开发语言·c++·算法
学嵌入式的小杨同学14 小时前
【Linux 封神之路】信号编程全解析:从信号基础到 MP3 播放器实战(含核心 API 与避坑指南)
java·linux·c语言·开发语言·vscode·vim·ux
Re.不晚14 小时前
Java入门17——异常
java·开发语言
精彩极了吧14 小时前
C语言基本语法-自定义类型:结构体&联合体&枚举
c语言·开发语言·枚举·结构体·内存对齐·位段·联合
好家伙VCC15 小时前
### WebRTC技术:实时通信的革新与实现####webRTC(Web Real-TimeComm
java·前端·python·webrtc
南极星100515 小时前
蓝桥杯JAVA--启蒙之路(十)class版本 模块
java·开发语言
baidu_2474386115 小时前
Android ViewModel定时任务
android·开发语言·javascript
Dev7z15 小时前
基于 MATLAB 的铣削切削力建模与仿真
开发语言·matlab
不能隔夜的咖喱16 小时前
牛客网刷题(2)
java·开发语言·算法