本指南旨在向您展示如何在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
循环。
从上一节中,我们知道遍历枚举对象会返回一个包含索引和元素的元组。 我们可以将这个元组解包成两个变量:index
和 item
。
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列表中查找元素的索引。继续编码!