在python里有序集合的index位置信息可正可负,方向可以从左向右或从右向左。以“python”字符串通过list函数转化生成的列表为例,其正负位置信息index值如下所示:
| 0 | 1 | 2 | 3 | 4 | 5 | 
| 'p' | 'y' | 't' | 'h' | 'o' | 'n' | 
| -6 | -5 | -4 | -3 | -2 | -1 | 
故,切片的start、end、step也可用负数来表示。
例1:
s = "python"
print s
a = list(s)
print a
b = a[1 : -2 : 1]
print b
c = a[1 : -2 : -1]
print c
程序的执行结果如下:
python
 ['p', 'y', 't', 'h', 'o', 'n']
 ['y', 't', 'h']
 []
  
为何c为空呢?

原因:从起点start开始如果step为正从左向右到达end进行切片操作,如果step为负从右向左到达end进行切片操作。对b起点在左方向向右是能到达终点的,而对于c那条切片语句a[1 : -2 : -1],起点在左方向向右是无法到达终点的故结果集为空。
例2
s = "python"
 print s
 a = list(s)
 print a
 b = a[-1 : 2 : 1]
 print b
 c = a[-1 : 2 : -1]
 print c
  
程序的执行结果如下:
python
 ['p', 'y', 't', 'h', 'o', 'n']
 []
 ['n', 'o', 'h']
  
为何b为空呢?

对于b和c所对应的取切片操作的起点start = -1、终点end = 2,但取得b的切片操作的step = 1意思是从起点从左向右到达终点,不可能,因为终点在左边故b为空的列表集。而c所对应的取切片操作的方向是step = -1即从右向左是可以最终到达终点的,故得到['n', 'o', 'h']结果。
例3
对于字符串,有序的集合,也是可以使用切片的。有的时候切片操作的start和end以及step会没有指定,这个时候是一些特殊用法,通常暗含的意思是该方向上的首尾。
s = "python"
 print s[:]
 print s[::1]
 print s[::-1]
 print "*****"
 print s[1::1]
 print s[1::-1]
 print "*****"
 print s[:5]
 print s[:3:1]
 print s[:3:-1]
  
程序执行结果:
python
 python
 nohtyp
 *****
 ython
 yp
 *****
 pytho
 pyt
 no
  
(1) s[:]切片,[:]即全切即列表本身,即首尾都要。
(2) s[::1]切片,正向全切,正向全切结果和s[:]一样
(3) s[::-1]切片,负向全切,等价于s[len(s)-1::-1]
(4)s[1::1]切片,从index为1开始到正方向尾部所有元素。
(5)s[1::-1]切片,从index为1开始一直沿负方向(右向左)到该方向尾部。

(6)s[:5]切片,正向切到index为5 - 1 = 4为止,起点默认为该方向的起点值0。

(7)s[:3:1]切片,明确指明了正向步长为1,正向切片的终点index为3,起点默认该方向的起点值0 。

(8)s[:3:-1]切片,负方向切片的终点为3,起点默认为该方向的起点值-n 。




















