深入理解Python切片

深入理解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[::-1]返回一个逆序的列表.
  博主通过查询得知,s可以为负数,并且s的正负对切片的行为有重要影响,具体来说有2个方面影响:
1. 影响N,M的缺省值
2. 影响切片取值方向

s缺省为1,如果s>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]
''
# n=-5,m=0,s=1, 满足n<m,但n,m符号不一致,从n开始,从左向右取,所以取不到.
>>> s[-5:-1]
'Worl'
#n=-5,m=-1,s=1, 满足n<m,n,m同号,从n开始,从左向右取

>>> s[-5:1]
''
#同case1
>>> s[-5:0:-1]
'W olle'

>>> s[-5:1:-1]
'W oll'
>>>
  • 3
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值