Python随笔2:Python内置序列函数之enumerate函数

:本文所有代码均经过Python 3.7实际运行检验,保证其严谨性。

序列类型是Python基本数据类型中的一个大类,官方给出了三种基本序列:列表list、元组tuple、range对象。当然,字符串string也是一种序列,但是官方单独把它放在一个类里,称为文本序列类型。

Python中的序列类型有两类,一类是可变序列类型,另一类是不可变序列类型,两者合称通用序列类型。文本序列字符串实质上是可以放在不可变序列类型当中的。

序列的组成结构不是我们看到的那么简单。比如列表l = ['a', 'b', 'c'],好像列表里的东西只有'a'、'b'、'c',其实还隐藏着看不见的信息,那就是
各个元素的索引index,'a'的索引index=0,'b'、'c'的索引依次是1和2。某种程度上,可以把序列看作是隐式的字典类型(虽然长期以来,字典类型都是无序的,但是!!!Python 3.6以后,字典类型实际上变成有序的了),序列的索引index就相当于字典的key,序列里的元素。

各类序列有各自专用的内置函数,也有通用的内置函数。今天的主角enumerate()函数就属于可以通吃的那种内置函数。enumerate的中文意思是列举、枚举。

有时我们需要在遍历序列里的元素时同时追踪其对应的索引,这时enumerate()函数就派上用场了。其语法为:

enumerate(iterable, start=0)——
返回一个枚举对象。iterable 必须是一个序列,或 iterator,或其他支持迭代的对象。 enumerate() 返回的迭代器的 next() 方法返回一个元组,里面包含一个计数值(从 start 开始,默认为 0)和通过迭代 iterable 获得的值。

l = ['a', 'b', 'c']

for i in enumerate(l):
    print(i)
    
(0, 'a')
(1, 'b')
(2, 'c')

如上所示,for i in enumerate(l)中,i的输出为一个含有两个元素的元组。元组中的第二个元素是列表l当中的元素,而元组中的第一个元素则是对应列表元素的索引index。

这一点非常好用,尤其是在字符串相关操作时。如下面这个例题:
s = 'abc12345',只能通过切片方法,如何得到新的字符串'54321'?
解决这种比较字符数目比较多的字符串,一眼可能难以看得清其中的元素和对应的索引。如果此时用enumerate()函数,思路一下就清晰了。

s = 'abc12345'
for i in enumerate(s):
    print(i)
(0, 'a')
(1, 'b')
(2, 'c')
(3, '1')
(4, '2')
(5, '3')
(6, '4')
(7, '5')

看清数据关系后,答案就不言自明了:再使用倒序,要从'c'那里切5片,s.index('c') = 2:

s = 'abc12345'
s[:2:-1]
Out[66]: '54321'

最后,容易让人忽视的是,字典dict也是可以使用enumerate()函数。如前所述,Python 3.6之后,从来都以无序自傲的字典dict类型也变得有序了,所以它也是可以使用enumerate()函数的,只是效果可能有点出乎意料罢了:

d = {'a': 554, 'b': 4556, 'c': 'Who am I?'}
for i in enumerate(d):
    print(i)
#打印结果如下:    
(0, 'a')
(1, 'b')
(2, 'c')

你可能感兴趣的:(Python随笔2:Python内置序列函数之enumerate函数)