深入理解Python切片

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'
>>>

posted @ 2019-07-17 16:11  武汉徐哥  阅读(1592)  评论(0编辑  收藏  举报