原理上分析切片运算:
list的切片,内部是调用getitem,setitem,delitem和slice函数。而slice函数又是和range()函数相关的,给切片传递的键是一个特殊的slice对象。该对象拥有可描述所请求切片方位的属性,例如:1
2
3
4a = [ 1, 2, 3, 4, 5, 6 ]
x = a [ 1 : 5 ] # x = a.__getitem__( slice ( 1, 5, None ) )
a [ 1 : 3 ] = [10, 11, 12 ]# a.__setitem__( slice ( 1, 3, None ), [ 10, 11, 12 ] )
del a [ 1 : 4 ] # a.__delitem__( slice ( 1, 4, None ) )
Python 的切片功能实际上比很多程序员认为的更强大,其形式如下:1
a=m[start:end:step] # 带步进的切片(步进值=step)
可见,列表的下标有三个参数:start(起始下标),end(终止下标),step(变化量),简单解释如下:
- 当step大于0时,beg默认为0,end默认为最末之后;
- 当step小于0时,start默认为len(array)-1,end默认为开头之前;
- 当step未给出时:start默认为1;
比较复杂的解释如下:
注意:步进值为step
- 当step > 0 时切片从 start(含start)处开始,到end(不含end)处结束,从左往右,每隔(step-1)(索引之间的差仍为step,但相隔的元素是step-1个)个元素进行一次截取。这时,start 指向的位置应该在end指向的位置的左边,否则返回值为空;
- 当step < 0 时,切片从 start(含start)处开始,到end(不含end)处结束,从右往左,每隔(step-1)(索引之间的差仍为step,但相隔的元素是step-1个)个元素进行一次截取。这时,start 指向的位置应该在end指向的位置的右边,否则返回值为空;
示例如下:1
2
3
4
5
6
7
8
9
10
11
12str="abcdefh"
print str[0:3] #截取第一位到第三位的字符
print str[:] #截取字符串的全部字符
print str[6:] #截取第七个字符到结尾
print str[:-3] #截取从头开始到倒数第三个字符之前
print str[2] #截取第三个字符
print str[-1] #截取倒数第一个字符
print str[::-1] #创造一个与原字符串顺序相反的字符串
print str[-3:-1] #截取倒数第三位与倒数第一位之前的字符
print str[-3:] #截取倒数第三位到结尾
print str[:-5:-3] #逆序截取,从末尾到倒数第五个,每三步截取一个;
print str[:-5:-3] #逆序截取,从末尾到开始,每三步截取一个;
参考资料: