Python enumerate() 函数,用例子解释

本指南旨在向您展示如何在Python中使用enumerate()函数。

Python的enumerate()函数提供了一种简洁的方法,在遍历过程中同时访问元素及其对应的索引。

我们将从回顾如何使用简单的循环来访问元素和索引开始,然后深入了解Python的enumerate()函数的语法。 整个过程中,我们还会编写一些示例代码。

让我们开始吧。

在Python中使用for循环进行迭代

任何可以在Python中被逐个访问的对象都被称为可迭代对象。例如,Python的列表、元组、字典和字符串都是可迭代的。

让我们以如下代码块中定义的购物清单为例。

shopping_list = ["水果","饼干","麦片","蛋白棒","便利贴"]

在Python中,你可以使用for循环遍历任何可迭代对象。其语法如下:

for item in <iterable>:
    # 对item进行操作

# item:循环变量
# <iterable>:任何Python可迭代对象,如列表、元组、字典、字符串等。

现在,使用这个语法,让我们遍历shopping_list并访问每个元素。

for item in shopping_list:
  print(item)

# 输出
水果
饼干
麦片
蛋白棒
便利贴

这种结构可以帮助你直接访问元素。然而,有时你不仅需要访问元素本身,还需要访问元素的索引。

你可以使用一个索引变量,在循环体内部递增,如下所示:

index = 0
for item in shopping_list:
  print(f"索引:{index}, {item}")
  index += 1

# 输出
索引:0, 水果
索引:1, 饼干
索引:2, 麦片
索引:3, 蛋白棒
索引:4, 便利贴

但这并不是最高效的方法。如果你忘记增加索引,代码将无法按预期工作。

index = 0
for item in shopping_list:
  print(f"索引:{index}, {item}")
  # 循环体内没有更新索引
  # 索引永远不会更新,始终为0

# 输出
索引:0, 水果
索引:0, 饼干
索引:0, 麦片
索引:0, 蛋白棒
索引:0, 便利贴

另一种常见的for循环使用模式是与range()函数结合使用。我们将在下一节中学习这一点。

如何使用range()函数访问索引

Python的内置函数len()返回任何Python对象的长度。 因此,你可以使用shopping_list作为参数调用len()函数来获取shopping_list的长度(本例中为5)。

len(shopping_list)
# 输出: 5

range()函数返回一个范围对象,你可以在循环中使用它。 当你遍历range(stop)时,你将获得索引0、1、2、…、stop-1。

通过设置stop = len(list),你可以获得有效索引的列表。因此,通过使用range()函数,你可以访问索引以及相应的元素,如下所示。

for index in range(len(shopping_list)):
  print(f"索引:{index}, 元素: {shopping_list[index]}")

# 输出
索引:0, 元素: 水果
索引:1, 元素: 饼干
索引:2, 元素: 麦片
索引:3, 元素: 蛋白棒
索引:4, 元素: 便利贴

但是,这并不是同时访问索引和元素的推荐Pythonic方式。

Python enumerate() 函数的语法

Python的enumerate()函数允许你使用以下通用语法访问元素及其索引:

enumerate(<iterable>, start = 0)

在上面的语法中:

  • <iterable> 是必需参数,可以是任何Python可迭代对象,例如列表或元组。
  • start 是一个可选参数,用于控制计数开始的索引。如果不指定start的值,则默认为零。

你现在可以使用shopping_list调用enumerate()函数,它会返回一个enumerate对象,如下面的代码单元所示。

enumerate(shopping_list)
<enumerate at 0x7f91b4240410>

你不能直接遍历枚举对象。因此,让我们将枚举对象转换为Python列表。

list(enumerate(shopping_list))

# 输出
[(0, '水果'),
 (1, '饼干'),
 (2, '麦片'),
 (3, '蛋白棒'),
 (4, '便利贴')]

访问枚举对象的另一种方法是调用next()函数,并将枚举对象作为参数。在Python中,next()函数从迭代器返回下一个元素。

在内部,next()函数通过调用迭代器对象的__next__方法来检索连续的元素。

让我们将枚举对象赋值给变量shopping_list_enum

shopping_list_enum = enumerate(shopping_list)

当你第一次使用shopping_list_enum调用next()时,你将获得索引0和索引0处的元素:元组(0, '水果')

当你继续进一步调用next()函数时,你将获得连续的元素及其索引,如下所示。

next(shopping_list_enum)
# (0, '水果')
next(shopping_list_enum)
# (1, '饼干')
next(shopping_list_enum)
# (2, '麦片')
next(shopping_list_enum)
# (3, '蛋白棒')
next(shopping_list_enum)
# (4, '便利贴')

如果在访问所有元素并到达列表末尾后调用next()函数会发生什么?你会得到一个StopIteration错误。

next(shopping_list_enum)
# ---------------------------------------------------------------------------
StopIteration                             Traceback (most recent call last)
<ipython-input-16-4220f68f6c7e> in <module>()
----> 1 next(shopping_list_enum)

StopIteration:

enumerate()函数仅在需要时返回连续的索引和元素,并且不会提前计算。在需要考虑内存效率的Python项目中,当你需要遍历大型可迭代对象时,可以尝试使用enumerate()函数。

Python enumerate() 函数示例

现在我们已经学习了使用enumerate()函数的语法,让我们修改之前的for循环。

从上一节中,我们知道遍历枚举对象会返回一个包含索引和元素的元组。 我们可以将这个元组解包成两个变量:indexitem

for index, item in enumerate(shopping_list):
  print(f"索引:{index}, 元素:{item}")

# 输出
索引:0, 元素:水果
索引:1, 元素:饼干
索引:2, 元素:麦片
索引:3, 元素:蛋白棒
索引:4, 元素:便利贴

接下来,让我们看看如何指定自定义起始值。

如何使用自定义起始值使用enumerate()

Python遵循零索引,因此默认情况下起始值为0。但是,如果你需要人类可读形式的索引——从1或你选择的任何其他索引开始,你可以指定自定义起始值。

shopping_list示例中,如果你想从1开始计数,请设置start = 1

for index, item in enumerate(shopping_list,1):
  print(f"索引:{index}, 元素:{item}")

# 输出
索引:1, 元素:水果
索引:2, 元素:饼干
索引:3, 元素:麦片
索引:4, 元素:蛋白棒
索引:5, 元素:便利贴

但是,在指定自定义起始值时,应确保将其指定为第二个位置参数。

如果你错误地交换了可迭代对象和起始值的顺序,则会遇到错误,如下面的代码单元所述。

for index, item in enumerate(1,shopping_list):
  print(f"索引:{index}, 元素:{item}")

# 输出
---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-12-5dbf7e2749aa> in <module>()
----> 1 for index, item in enumerate(1,shopping_list):
      2   print(f"索引:{index}, 元素:{item}")

TypeError: 'list' object cannot be interpreted as an integer

为避免此类错误,你可以将 start 指定为关键字参数,如下所示。

for index, item in enumerate(shopping_list, start = 1):
  print(f"索引:{index}, 元素:{item}")

# 输出
索引:1, 元素:水果
索引:2, 元素:饼干
索引:3, 元素:麦片
索引:4, 元素:蛋白棒
索引:5, 元素:便利贴

到目前为止,你已经学习了如何将enumerate()函数与Python列表一起使用。你还可以使用enumerate函数循环遍历Python字符串、字典和元组。

如何在Python元组中使用enumerate()函数

假设shopping_list是一个元组。在Python中,元组也是集合——类似于Python列表,但它们是不可变的。因此,你不能修改它们,并且尝试这样做会导致错误。

以下代码片段将shopping_list初始化为一个元组。

shopping_list = ("水果","饼干","麦片","蛋白棒","便利贴")
type(shopping_list)
# 元组

如果你尝试修改元组中的第一项,则会收到错误消息,因为Python元组是不可变集合。

shopping_list[0] = '蔬菜'

# 输出
---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-2-ffdafa961600> in <module>()
----> 1 shopping_list[0] = '蔬菜'

TypeError: 'tuple' object does not support item assignment

▶ 现在,运行以下代码片段来验证enumerate()函数是否可以按预期使用元组。

shopping_list = ("水果","饼干","麦片","蛋白棒","便利贴")
for index, item in enumerate(shopping_list):
    print(f"索引:{index}, 元素:{item}")

如何在Python字符串中使用enumerate()函数

你还可以使用Python的enumerate()函数循环遍历字符串并同时访问字符和索引。

这是一个例子。

py_str="蝴蝶"
for index, char in enumerate(py_str):
  print(f"索引 {index}: {char}")

# 输出
索引 0: 蝴
索引 1: 蝶

从上面的输出中,我们看到字符及其索引 (0-1) 已被打印出来。

结论👩🏽‍💻

以下是你所学内容的总结。

  • 你可以使用for循环来访问元素并维护单独的计数器或索引变量。
  • 如果你愿意,可以使用range()函数来获取有效索引,并通过索引到列表中来访问元素。
  • 作为推荐的Pythonic方式,你可以使用Python的enumerate()函数,其语法为:enumerate(iterable)。默认情况下,计数或索引从0开始。
  • 你可以使用语法enumerate(iterable, start)指定自定义起始值,以获取从值start和相应元素开始的索引。
  • 在处理元组、字符串、字典以及通常的任何Python可迭代对象时,你都可以使用enumerate函数。

我希望你发现这个关于enumerate()函数的教程对你有所帮助。接下来,学习如何在Python列表中查找元素的索引。继续编码!