Python 支持许多可迭代对象:列表、图元和字符串只是其中几个。Python 的 for 循环足够灵活,可以轻松地处理这些对象。特别是,它使你不必自己处理每个条目的数字索引。
但有时,你会想用索引来工作,例如,在一个集合中计算或过滤项目。学习你如何使用Python枚举函数在一个序列上进行迭代,同时保持对索引和元素的跟踪。
不使用 enumerate() 进行迭代
考虑一下下面这个 Python 列表。
my_fruits = ["apples", "pears", "bananas"]
假设你想跟踪列表中每个元素的计数。你可以使用一个带有**range()**函数的for 循环,像这样。
count = 0 for fruit in range(len(my_fruits)): print(count, my_fruits[count]) count += 1
虽然这个方法可行,但它有一些不足之处。
- 你必须在循环之外保持对计数的跟踪。
- 你必须在每次迭代中递增计数。
- 你必须计算出循环的长度。
- range(len())只适用于可计数、可索引的对象。
有一个更好的解决方案:enumerate()函数。
enumerate()在Python中如何工作
Python**enumerate()**函数接收一个数据集合并返回一个枚举对象。枚举对象包含一个计数器,作为该对象包含的每个项目的关键。**enumerate()**函数通过给每个项目分配一个计数来做到这一点。这个计数器对应于该函数为达到该值而完成的迭代次数。
这个计数器使我们更容易访问集合中的项目,甚至在可能的情况下对集合进行变异。
使用enumerate(),你不需要跟踪循环的长度或迭代次数。你也可以避免使用索引操作符显式地访问值,如fruit[count]。enumerate 函数自动处理所有这些功能。
Python enumerate()的语法
下面是 enumerate() 函数的一般语法。
enumerate(iterable, start=0)
enumerate()需要两个参数。
- iterable:一个数据集合或序列,Python 可以对其进行迭代。例如,一个 list 或 tuple。
- start:枚举函数应该从哪个索引开始计数。
enumerate()是如何实现的
为了理解**enumerate()**是如何工作的,让我们看看它是如何实际实现的。
def enumerate(sequence, start=0): n = start for elem in sequence: yield n, elem n += 1
这个函数,你可以在Python enumerate 文档中找到,接收一个序列和一个默认为 0 的开始参数。
然后该函数将n变量初始化为起始变量。这样就记录了迭代的次数。
在接下来的for循环中,对于序列中的每个元素。
- yield暂停了循环的执行。
- 它还返回当前的计数(n)和值(elem)。
- 当循环重新开始时,它将增加n。
返回值是一个键值对的对象。
如果你调用enumerate()函数并将水果列表传给它,这将是输出值。
my_fruits = ["apples", "pears", "bananas"]enumerate_object = enumerate(my_fruits)print(list(enumerate_object)) # output - [(0, 'apples'), (1, 'pears'), (2, 'bananas')]
用不同的起始索引进行枚举
在上面的例子中,我们没有指定起始索引。下面的例子告诉你如何将起始索引设置为你所选择的数字。
要从10开始,做如下操作。
enumerate_object = enumerate(my_fruits, 10)print(list(enumerate_object)) # output - [(10, 'apples'), (11, 'pears'), (12, 'bananas')]
Python enumerate() 示例
下面是一些例子,显示你如何在Python中使用enumerate()。
枚举一个 Python 字符串
在这个例子中,你将使用enumerate来检索索引5的字母。
my_string = "makeuseof" for count, value in enumerate(my_string): if count == 5: print (value) # output - s
枚举一个Python元组
你也可以使用enumerate()来遍历一个Python 元组。在这个例子中,程序在第一次迭代时打印了一个标题,然后才显示项目。
my_fruits_tuple = ("apples", "pears", "bananas") for index, value in enumerate(my_fruits_tuple): if (index == 0): print("Fruits:") print(value) /* Fruits:applespearsbananas */
枚举一个 Python 列表
在下面的例子中,你正在使用 enumerate 将列表中 10 以上的所有数字递减 2。
my_number_list = [10, 17, 15, 6] for index, value in enumerate(my_number_list): if (value > 10): my_number_list[index] -= 2 print(my_number_list) # output - [10, 15, 13, 6]
使用 enumerate 来计算你的迭代项
Python 包括enumerate()作为一个内置函数。你可以用它来迭代和计算可迭代集合中的项目,如 list、tuple 或 string。它可以帮助你跟踪每个元素的真实索引,但你也可以指定你自己的起始索引。如果你处理的对象不是可计算和可索引的对象,可以用它来替代range()函数。