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. redis数据同步之redis-shake

    redis-shake简介 redis-shake是阿里开源的用于redis数据同步的工具,基本功能有: 恢复restore:将RDB文件恢复到目的redis数据库. 备份dump:将源redis的全 ...

  2. C语言判断两个值相等

    内置类型比较直接用==判断 字符串比较要用string.h里的函数strcmp(const char *str1,const char *str2)进行比较string.h里的函数strcmp(con ...

  3. C语言定义常量

     /* #define 标识符 #define day main中day=10;仅一次赋值*/        错误 #define 标识符 常量值 #define day 10;

  4. Javascript - Vue - webpack中的axios

    导入axios import Vue from "vue";import axios from "axios";import { get } from &quo ...

  5. 老鼠走迷宫II

    转自:http://blog.csdn.net/holymaple/article/details/8636234 由于迷宫的设计,老鼠走迷宫的入口至出口路径可能不止一条,如何求出所有的路径呢? 解法 ...

  6. java 循环移位输出全排列

    //题目:利用1.2.2.3.4这4个数字,用java写一个main函数打印出所有不同的排列,如12234,,2234等,要求打印出来不能有重复 1 package test123; 2 3 impo ...

  7. Ubuntu下 QT中配置ROS-Kinetic

    打开qtcreater自动加载ros环境,通过修改*.desktop文件 gedit ~/.local/share/applications/qtcreator.desktop 将其中Exec=XXX ...

  8. SpringBoot - 搭建静态资源存储服务器

    目录 前言 环境 实现效果 具体实现 文件上传 配置类 上传接口 上传实现 辅助类 实体 上传测试 文件访问 配置类 项目源码 前言 记录下SpringBoot下静态资源存储服务器的搭建. 环境 wi ...

  9. elsa-core:4.ASP.NET Core Server with Elsa Dashboard

    在本快速入门中,我们将了解一个最小的 ASP.NET Core 应用程序,该应用程序承载 Elsa Dashboard 组件并将其连接到 Elsa Server. ElsaDashboard + Do ...

  10. FastAPI(1)- 简单介绍

    前言 为啥要学它呢,因为学 Flask 的时候发现有人更推荐它代替 Flask,看了下介绍,感觉很强,而且也能拿来做平台,当然学起来!卷起来! 为什么要使用 FastAPI ? 日渐没落的是后端 HT ...