摘要:当您需要计数和迭代中的值时,Pythonenumerate()允许您编写 Pythonicfor循环。最大的优点enumerate()是它返回一个带有计数器和值的元组,因此您不必自己增加计数器。它还为您提供了更改计数器起始值的选项。
在 Python 中,for循环通常被写成对可迭代对象的循环。这意味着您不需要计数变量来访问迭代中的项目。但有时,您确实希望有一个在每次循环迭代中都会发生变化的变量。您可以使用 Python enumerate() 来同时从可迭代对象中获取计数器和值,而不是自己创建和增加变量!
在本教程中,您将看到如何:
- 用于enumerate()在循环中获取计数器
- 适用enumerate()于显示项目计数
- enumerate()与条件语句一起使用
- 实现自己的同等功能,以enumerate()
- 解包返回的值enumerate()
让我们开始吧!
for在 Python 中使用循环进行迭代
forPython 中的循环使用基于集合的迭代。这意味着 Python 在每次迭代时将迭代中的下一项分配给循环变量,如下例所示:
>>> >>> values = ["a", "b", "c"] >>> for value in values: ... print(value) ... a b c
在这个例子中,values是一个名单有三个字符串,"a","b",和"c"。在 Python 中,列表是一种可迭代对象。在for循环中,循环变量是value。在循环的每次迭代中,value设置为 的下一项values。
接下来,您打印 value到屏幕上。基于集合的迭代的优势在于它有助于避免其他编程语言中常见的逐一错误。
现在想象一下,除了值本身之外,您还想在每次迭代时将列表中项目的索引打印到屏幕上。处理此任务的一种方法是创建一个变量来存储索引并在每次迭代时更新它:
>>> >>> index = 0 >>> for value in values: ... print(index, value) ... index += 1 ... 0 a 1 b 2 c
在本例中,index是一个整数,用于跟踪您在列表中的距离。在循环的每次迭代中,您打印index以及value. 循环的最后一步是将存储的数字更新index一。当您忘记index在每次迭代时更新时,会出现一个常见错误:
>>> >>> index = 0 >>> for value in values: ... print(index, value) ... 0 a 0 b 0 c
在这个例子中,index在0每次迭代时都保持 at ,因为没有代码在循环结束时更新它的值。特别是对于长或复杂的循环,这种错误是出了名的难以追踪。
解决此问题的另一种常见方法是使用range()结合len()自动创建索引。这样,您就不需要记住更新索引:
>>> >>> for index in range(len(values)): ... value = values[index] ... print(index, value) ... 0 a 1 b 2 c
在本例中,len(values)返回 的长度values,即3。然后range()创建一个迭代器,从默认的起始值开始运行,0直到它达到len(values)负一。在这种情况下,index成为您的循环变量。在循环中,您将当前值设置为value等于 中的项目。最后,您打印和。valuesindexindexvalue
在此示例中,可能发生的一个常见错误是您value在每次迭代开始时忘记更新。这类似于之前忘记更新索引的错误。这是该循环不被视为Pythonic 的原因之一。
这个例子也有一些限制,因为values必须允许使用整数索引访问它的项目。允许这种访问的可迭代对象在 Python中称为 序列 。
技术细节:根据Python 文档, 可迭代 对象是可以一次返回一个成员的任何对象。根据定义,可迭代对象支持迭代器协议,该协议指定在迭代器中使用对象时如何返回对象成员。Python 有两种常用的可迭代类型:
- 序列
- 发电机
任何可迭代对象都可以在for循环中使用,但只能通过整数索引访问序列。尝试通过生成器或迭代器的索引访问项目将引发TypeError:
>>> >>> enum = enumerate(values) >>> enum[0] Traceback (most recent call last): File "<stdin>", line 1, in <module> TypeError: 'enumerate' object is not subscriptable
在此示例中,您将返回值分配enumerate()给enum。enumerate()是一个迭代器,因此尝试通过索引访问其值会引发TypeError.
幸运的是,Pythonenumerate()可以让您避免所有这些问题。它是一