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

深入理解Python切片的更多相关文章

  1. 彻底理解Python切片

    关于list的insert函数 list#insert(ind,value)在ind元素前面插入value 首先对ind进行预处理:如果ind<0,则ind+=len(a),这样一来ind就变成 ...

  2. python 切片步长

    python切片 切片:list变量[值下标:结束值下标]  什么意思呢? 就是获取 list中 下标从定义的位置开始获取数据到  自定义的下标位置结束, 但是切片有个规矩就是顾头不顾尾, 举个例子 ...

  3. 用一个简单的例子来理解python高阶函数

    ============================ 用一个简单的例子来理解python高阶函数 ============================ 最近在用mailx发送邮件, 写法大致如 ...

  4. 【转】你真的理解Python中MRO算法吗?

    你真的理解Python中MRO算法吗? MRO(Method Resolution Order):方法解析顺序. Python语言包含了很多优秀的特性,其中多重继承就是其中之一,但是多重继承会引发很多 ...

  5. 理解 python metaclass使用技巧与应用场景分析

    理解python metaclass使用技巧与应用场景分析       参考: decorator与metaclass:http://jfine-python-classes.readthedocs. ...

  6. 关于javascript里面仿python切片操作数组的使用方法

    其实在使用了好一段时间的 python之后,我觉得最让我念念不忘的并不是python每次在写函数或者循环的时候可以少用{}括号这样的东西(ps:其实也是了..感觉很清爽,而且又开始写js的时候老是想用 ...

  7. 理解Python中的装饰器

    文章先由stackoverflow上面的一个问题引起吧,如果使用如下的代码: @makebold @makeitalic def say(): return "Hello" 打印出 ...

  8. 深入理解 Python 异步编程(上)

    http://python.jobbole.com/88291/ 前言 很多朋友对异步编程都处于"听说很强大"的认知状态.鲜有在生产项目中使用它.而使用它的同学,则大多数都停留在知 ...

  9. 理解Python中的装饰器//这篇文章将python的装饰器来龙去脉说的很清楚,故转过来存档

    转自:http://www.cnblogs.com/rollenholt/archive/2012/05/02/2479833.html 这篇文章将python的装饰器来龙去脉说的很清楚,故转过来存档 ...

随机推荐

  1. Maven在IDEA中的日常使用

    1.为什么使用MavenMaven是我们在开发过程中常用的工具,主要用途有两种:1)方便的下载jar包2)项目打包接下来以windows操作系统为例,介绍一下Maven在IDEA中如何设置和常用的功能 ...

  2. .Net Core 踩坑记录--无法逐步调试类库文件

    前提 新建类库 在新项目中引用该类库 将类库对应的.PDB文件 拷贝至新项目的bin文件夹下 结果 无法进行跟踪调试 狗带 分析与解决 1: 打开 工具-->选项-->调试 2: 常规-- ...

  3. C# lock的语法糖原理--《.net core 底层入门》之自旋锁,互斥锁,混合锁,读写锁

    在多线程环境中,多个线程可能会同时访问同一个资源,为了避免访问发生冲突,可以根据访问的复杂程度采取不同的措施 原子操作适用于简单的单个操作,无锁算法适用于相对简单的一连串操作,而线程锁适用于复杂的一连 ...

  4. Mysql---C#在cmd中使用mysqldump导出sql文件

    一.概述 本文描述了在C#中利用mysqldump工具导出sql文件. 二.代码片段 CmdHelper类代码如下: public class CmdHelper { public static st ...

  5. 【C#】Enum,Int,String的互相转换 枚举转换

    Enum为枚举提供基类,其基础类型可以是除 Char 外的任何整型.如果没有显式声明基础类型,则使用 Int32.编程语言通常提供语法来声明由一组已命名的常数和它们的值组成的枚举. 注意:枚举类型的基 ...

  6. Struts2框架基本使用

    时间:2017-1-6 16:53 修改struts.xml配置文件不需要重启服务器.Struts2框架    一.        *   介绍Struts2        *   关于Struts2 ...

  7. 并发编程之:JMM

    并发编程之:JMM 大家好,我是小黑,一个在互联网苟且偷生的农民工. 上一期给大家分享了关于Java中线程相关的一些基础知识.在关于线程终止的例子中,第一个方法讲到要想终止一个线程,可以使用标志位的方 ...

  8. IPython中也要保持优雅(DRY原则)

    What is IPython? IPython provides a rich architecture for interactive computing with: A powerful int ...

  9. 华为音频编辑服务(Audio Editor Kit),快速构建应用音频编辑能力

    音频编辑服务(Audio Editor Kit)是华为为开发者开放的各类场景音频处理能力的集合,汇聚了华为在音乐.语音等相关音频领域的先进技术.音频编辑服务提供基础编辑.伴奏提取.空间渲染.变声降噪等 ...

  10. Go进阶--httptest

    目录 基本使用 扩展使用 接口context使用 模拟调用 测试覆盖率 参考 单元测试的原则,就是你所测试的函数方法,不要受到所依赖环境的影响,比如网络访问等,因为有时候我们运行单元测试的时候,并没有 ...