【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 必须是一个可迭代对象(包含多个元素)。

相关推荐
仰泳的熊猫1 小时前
题目2570:蓝桥杯2020年第十一届省赛真题-成绩分析
数据结构·c++·算法·蓝桥杯
似水明俊德4 小时前
02-C#.Net-反射-面试题
开发语言·面试·职场和发展·c#·.net
qq_417695054 小时前
机器学习与人工智能
jvm·数据库·python
漫随流水4 小时前
旅游推荐系统(view.py)
前端·数据库·python·旅游
Thera7775 小时前
C++ 高性能时间轮定时器:从单例设计到 Linux timerfd 深度优化
linux·开发语言·c++
罗超驿5 小时前
独立实现双向链表_LinkedList
java·数据结构·链表·linkedlist
yy我不解释5 小时前
关于comfyui的mmaudio音频生成插件时时间不一致问题(一)
python·ai作画·音视频·comfyui
炘爚5 小时前
C语言(文件操作)
c语言·开发语言
阿蒙Amon6 小时前
C#常用类库-详解SerialPort
开发语言·c#
凸头6 小时前
CompletableFuture 与 Future 对比与实战示例
java·开发语言