在我们代码的世界,下标都是从0开始,从左向右遍历的,从右向左遍历的话,需要这样操作了,c++示例:
for(int i=len-1; i<=0; --i) {
doSomething
}
python中的列表的下标也是从0开始计算的,也专门为最后一个元素的规定了一个下标:-1。
定义一个列表:
l = [0, 1, 2, 3, 4]
print l[0] #输出第一个元素 0
print l[-1] #输入最后一个元素 4
取单个元素时如果输入的下标超出了列表的范围,就会引发IndexError。
切片操作能够取得原列表的一个子集(包括空子集),操作定义l[start:end:step]
start : 获取的元素的起始位置,包括在结果集中,默认为0
end : 获取的元素的结束位置,不包括在结果集中,默认为最后一个元素的下一个位置;
step : 步长, 默认为1,当此值为正整数时表示从左向右取,为负整数时表示从右向左取;
如下:
l[:] #所有的值都是默认的,返回原列表[0,1,2,3,4]
l[0:1] #从第0个元素取到第1个元素,[0]
l[::-1] #从右向左取元素 [4,3,2,1,0]
切片操作在内部调用的_getitem__,__setitem__,__delitem__和slice函数。如果我们在使用切片操作时,指定的start、end的索引超出范围了会怎么样呢?
l[-100:] #会发生什么事??
哈哈,输出了原来的列表:[0,1,2,3,4]
在切片操作中,python把start、end的索引修正到了有效范围呢。
在切片操作中,单纯的数字索引会让我们过一段时间就忘记了这么做的意义,比如:我们的一个字符串"P9982354book",前8个字符表示书的编号,我们怎么取到它呢?可以这么来实现:
str = "P9982354book"
l = list(str) #['P', '9', '9', '8', '2', '3', '5', '4', 'b', 'o', 'o', 'k']
id = l[:9] #['P', '9', '9', '8', '2', '3', '5', '4', 'b'],过了一会我们还能记得这个:9是来干什么的嘛
id = ''.join(id) #'P9982354b'
修改id=l[:9]为以下两行:
bookIdSlice = slice(9)#slice(None, 9, None)
id = l[bookIdSlice]
一个有意义的名字永远比几个数字保存、传递的信息要丰富。