Python序列的切片很基礎同時也很重要,最近看到一個[::-1]的表達,不明所以,查了一些資料並實際操作,對Python切片有了更深刻的認識,以下結合例子詳細說明。
先看下切片的基本語法,一般認為切片語法是[N:M],是個半閉合區間,等效於數學上[N,M)取值范圍,取N不取M, N和M都可以省略,N<M,否則取不到值
接着看上面的例子[::-1],雙冒號好理解,[::]代表取整個序列,后面又帶個-1是什么鬼?
重新審視切片語法,原來完整的切片語法是[N:M:S],其中的S代表step,這么就好理解了
看下面的例子,通過控制step可以更靈活的取數據,wonderful!
>>> s [1, 2, 3, 4, 5, 6, 7, 8] >>> s[::] [1, 2, 3, 4, 5, 6, 7, 8] >>> s[::1] [1, 2, 3, 4, 5, 6, 7, 8] >>> s[::2] [1, 3, 5, 7]
那step = -1是什么意思?[::-1]實操的結果如何,如何解釋?
>>> s[::-1]
[8, 7, 6, 5, 4, 3, 2, 1]
查詢得知s可以為負數,並且s的正負對取切片的行為有影響,什么影響?2個方面:
1.影響N,M的缺省值
2.影響切片取值方向
s缺省為1,如果>0,取切片從左向右取,缺省N=0,M=len(s)
>>> s[0:len(s)]
[1, 2, 3, 4, 5, 6, 7, 8]
因為是從左往右取,所以要求N<M,否則取不到,這個規則同樣適用於N,M為負數的情況,看下面的例子,第一個N=-1,M=-2,N>M,從左往右取,-2位置上在-1的左邊,所以取不到,第二個N=-2,M=-1,從-2向右-1取,得7,符合上述規則!
>>> s[-1:-2] [] >>> s[-2:-1] [7]
如果s<0,會如何
缺省值:N= -1,M = -len(s)-1
方向:從右向左取
這就解釋了[::-1]的結果,[::]代表取全序列,-1代表從右向左取步長為1
>>> s[::-1]
[8, 7, 6, 5, 4, 3, 2, 1]
等效於
>>> s[-1:-len(s)-1:-1]
[8, 7, 6, 5, 4, 3, 2, 1]
理解了以上原則,就容易理解以下切片的結果了,可以看到此時,例1,N>M,但可以取到值,例2,N<M取不到值,原因是s=-1,從右向左取值的緣故
>>> s[-1:-2:-1] [8] >>> s[-2:-1:-1] []
總之s的正負會影響切片取值方向,使用中需要特別注意。
補充:
上述結論也可以解釋以下切片結果:
>>> s="Hello World"
>>> s[-5:0]
''
>>> s[-5:-1]
'Worl'
>>> s[-5:1]
''
>>> s[-5:0:-1]
'W olle'
>>> s[-5:1:-1]
'W oll'
>>>