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

相关推荐
冬奇Lab2 小时前
【Kotlin系列14】编译器插件与注解处理器开发:在编译期操控Kotlin
android·开发语言·kotlin·状态模式
程序员小白条2 小时前
面试 Java 基础八股文十问十答第二十一期
java·开发语言·数据库·面试·职场和发展
GGGLF2 小时前
Qt网络/串口通信开发:QByteArray 数据类型转换方法解析
开发语言·qt
深蓝电商API2 小时前
Selenium Grid分布式执行爬虫任务
爬虫·python·selenium
superman超哥2 小时前
Actix-web 性能优化技巧:从原理到实践
开发语言·rust·编程语言·actix-web
橙露2 小时前
C语言执行四大流程详解:从源文件到可执行程序的完整生命周期
java·c语言·开发语言
czliutz2 小时前
R语言gm玩音乐示例代码Rmarkdown
开发语言·r语言
凯酱2 小时前
Java8 遍历List 使用stream().parallel()并发安全
数据结构·windows·list