enumerate() 是一个非常实用的内置函数,它用于将一个可迭代对象(如列表、元组、字符串等)组合成一个索引序列,同时列出数据和数据下标。

核心功能
enumerate() 会返回一个枚举对象,当你遍历这个对象时,会得到每个元素的索引和值组成的元组。
基本用法:
fruits = ['apple', 'banana', 'cherry']
for index, value in enumerate(fruits):
print(f"索引: {index}, 值: {value}")
输出:
索引: 0, 值: apple
索引: 1, 值: banana
索引: 2, 值: cherry
enumerate() 的参数
enumerate() 函数有两个可选参数:

iterable: 这是第一个参数,也是唯一一个必需的参数,它可以是任何可迭代对象,比如列表、元组、字符串、字典、生成器等。start: 这是第二个参数,是可选的,它指定了索引的起始值,默认为0。
iterable (必需参数)
这是你想要遍历并获取索引的对象。
# 示例1:列表
my_list = ['a', 'b', 'c']
for i, v in enumerate(my_list):
print(i, v)
# 示例2:字符串
my_string = "hello"
for i, v in enumerate(my_string):
print(i, v)
# 示例3:元组
my_tuple = (10, 20, 30)
for i, v in enumerate(my_tuple):
print(i, v)
start (可选参数)
这个参数让你可以自定义索引的起始值,这在某些场景下非常有用。
语法: enumerate(iterable, start=0)
示例:从 1 开始计数

这是最常见的用法之一,尤其是在处理用户列表时,人们习惯从 1 开始计数。
students = ['Alice', 'Bob', 'Charlie']
# 默认从 0 开始
print("从 0 开始:")
for index, student in enumerate(students):
print(f"{index + 1}. {student}")
# 使用 start=1 参数
print("\n使用 start=1:")
for index, student in enumerate(students, start=1):
print(f"{index}. {student}")
输出:
从 0 开始:
1. Alice
2. Bob
3. Charlie
使用 start=1:
1. Alice
2. Bob
3. Charlie
其他起始值示例:
# 从 100 开始计数
data = ['item1', 'item2']
for idx, item in enumerate(data, start=100):
print(f"ID: {idx}, Name: {item}")
输出:
ID: 100, Name: item1
ID: 101, Name: item2
enumerate() 的高级用法和技巧
获取枚举对象本身
enumerate() 返回的是一个 enumerate 对象,它是一个迭代器,如果你想查看它的内容,可以将其转换为列表。
fruits = ['apple', 'banana', 'cherry'] enum_obj = enumerate(fruits) print(enum_obj) # <enumerate object at 0x...> # 转换为列表查看 enum_list = list(enum_obj) print(enum_list)
输出:
<enumerate object at 0x...>
[(0, 'apple'), (1, 'banana'), (2, 'cherry')]
注意: 枚举对象是迭代器,只能遍历一次,第一次遍历后,它就耗尽了,第二次遍历将不会得到任何结果。
numbers = [10, 20, 30]
enum_nums = enumerate(numbers)
# 第一次遍历
print("第一次遍历:")
for i, n in enum_nums:
print(i, n)
# 第二次遍历
print("\n第二次遍历:")
for i, n in enum_nums:
print(i, n) # 不会有任何输出
在列表推导式中使用
enumerate() 也可以用在列表推导式中,非常灵活。
示例:找出列表中所有值为 'banana' 的索引
fruits = ['apple', 'banana', 'cherry', 'banana', 'date'] # 使用列表推导式 banana_indices = [index for index, value in enumerate(fruits) if value == 'banana'] print(banana_indices) # 输出: [1, 3]
与 zip() 结合使用
enumerate() 和 zip() 经常一起使用,当你需要同时遍历多个列表,并同时需要索引时。
场景: 比较两个列表的对应元素。
list_a = [1, 2, 3]
list_b = ['a', 'b', 'c', 'd'] # 注意:长度不同
for i, (a, b) in enumerate(zip(list_a, list_b)):
print(f"索引 {i}: {a} vs {b}")
输出:
索引 0: 1 vs a
索引 1: 2 vs b
索引 2: 3 vs c
zip() 会在最短的可迭代对象处停止,所以即使 list_b 更长,也只比较到 list_a 的长度。
enumerate() vs 传统 for 循环
使用 enumerate() 通常比传统的 for 循环更 Pythonic(更符合 Python 风格),也更简洁。
传统方式(不推荐):
fruits = ['apple', 'banana', 'cherry']
index = 0
for fruit in fruits:
print(f"索引: {index}, 值: {fruit}")
index += 1
使用 enumerate()(推荐):
fruits = ['apple', 'banana', 'cherry']
for index, fruit in enumerate(fruits):
print(f"索引: {index}, 值: {fruit}")
后者代码更短、更易读,并且避免了手动管理索引变量 index 可能带来的错误(例如忘记 index += 1)。
| 参数 | 类型 | 是否必需 | 描述 |
|---|---|---|---|
iterable |
iterable |
是 | 要枚举的可迭代对象(列表、元组、字符串等)。 |
start |
int |
否 | 指定索引的起始值,默认为 0。 |
核心要点:
- 目的:在遍历可迭代对象时,同时获取索引和值。
- 语法:
for index, value in enumerate(iterable, start=0): - 返回值:一个
enumerate迭代器对象。 - 优点:代码更简洁、可读性更强,是 Pythonic 的写法。
- 高级用法:可与列表推导式、
zip()等结合使用,实现更复杂的逻辑。
