什么是切片操作

在Python中,切片(slice)是对序列型对象(如liststringtuple)的一种高级索引方法。普通索引只取出序列中一个下标对应的元素,而切片取出序列中一个范围对应的元素,这里的范围不是狭义上的连续片段。下面的代码初步展示了切片索引的力量。

 >>> a = list(range(10))>>> a[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]>>> a[:5][0, 1, 2, 3, 4]>>> a[5:][5, 6, 7, 8, 9]>>> a[2:8][2, 3, 4, 5, 6, 7]>>> a[::2][0, 2, 4, 6, 8]>>> a[::-1][9, 8, 7, 6, 5, 4, 3, 2, 1, 0]

你可能还看不懂具体的语法(这正是本篇要介绍的),但你应该已经领略到了切片的花式操作。

写这篇文章的初衷是,一方面切片操作是Python中非常常见的,另一方面网上却很难找到全面系统的解析,比如以下结果是否让人有些迷惑:

 >>> a[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]>>> a[0::-1][0]>>> a[0:len(a):-1][]

为什么有len(a)和省略len(a)结果会不一样?

本文致力于真正讲清楚Python切片的使用方法。若您希望进一步了解切片的实现原理,以帮助我们自定义类的切片操作,敬请期待本文的续篇,《切片完全指南(原理篇)》


基本索引

我们从Python的基本索引开始,即单个整数的索引。假设被索引的序列仍为之前提到的a,则基本索引的语法为a[index],其中index为下标。读者可能会觉得这里过于简单,但我们要强调的是Python一个语法糖:负数下标索引,即:index可以取为负数,当其为-n时,对倒数第n个元素进行索引。我们用一张表格值观展示a的索引范围。

非负下标索引和负数下标索引共同构成了Python索引的有效范围:​。有效范围的概念对切片的理解非常重要,在基本索引中,索引超出有效范围时会抛出IndexError异常:

 >>> a[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]>>> a[10]Traceback (most recent call last):File "<stdin>", line 1, in <module>IndexError: list index out of range>>> a[-11]Traceback (most recent call last):File "<stdin>", line 1, in <module>IndexError: list index out of range

但在切片中不是这样,我们将在下文具体解释。


简单切片

简单切片指的是这样的切片形式:a[start:stop],其行为是得到下标在这样一个前闭后开区间范围内的元素,其中startstop为负数时,简单看作是负数下标对应的位置即可:

 >>> a[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]>>> a[2:3][2]>>> a[5:9][5, 6, 7, 8]>>> a[5:-1][5, 6, 7, 8]>>> a[-5:9][5, 6, 7, 8]>>> a[-5:-1][5, 6, 7, 8]

事情到这里也很简单,下面着重讲解两个比较特殊的情况:超出有效索引范围缺省

超出有效索引范围

startstop超出上文提到的有效索引范围​时,切片操作不会抛出异常,而是进行截断。可以这样去理解截断机制:我们假象把索引范围扩充到全体整数,只不过小于​或大于​的区域对应空元素,在这个扩充后的数轴上进行切片,只需把最终结果中的所有空元素忽略即可。

来看几个具体的例子

 >>> a[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]>>> a[-100:5][0, 1, 2, 3, 4]>>> a[5:100][5, 6, 7, 8, 9]>>> a[-100:100][0, 1, 2, 3, 4, 5, 6, 7, 8, 9]>>> a[100:1000][]

另外,如果start的位置比stop还靠后怎么办?Python还是不会抛出异常,而是直接返回空序列:

 >>> a[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]>>> a[6:5][]

缺省

startstop都是可以缺省的,在缺省的情况下,Python的行为是尽可能取最大区间,具体来说:

按照扩充索引范围的观点,start的缺省值是无穷小(​)stop的缺省值是无穷大(​)

 >>> a[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]>>> a[:5][0, 1, 2, 3, 4]>>> a[5:][5, 6, 7, 8, 9]>>> a[100:][]

扩展切片

早期的Python解释器仅支持上述a[start:stop]形式的基本切片,后来加入了下面要介绍的切片形式,扩展切片的名称也流传下来,实际上不用担心,这早已是Python所支持的标准语法。

扩展切片指的是这样的切片形式:a[start:stop:step],其中step是一个非零整数,即比简单切片多了调整步长的功能,此时切片的行为可概括为:从start对应的位置出发,以step为步长索引序列,直至越过stop对应的位置,且不包括stop本身。事实上,简单切片就是step=1的扩展切片的特殊情况。需要详细解释的是step分别为正数和负数的两种情况。

step为正数

step为正数时,切片行为很容易理解,startstop截断缺省规则也与简单切片完全一致:

 >>> a[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]>>> a[0:6:2][0, 2, 4]>>> a[::2][0, 2, 4, 6, 8]>>> a[:-2:2][0, 2, 4, 6]>>> a[4::2][4, 6, 8]

step为负数

step为负数时,切片将其解释为从start出发以步长|step|逆序索引序列,此时,startstop截断依然遵循前述规则,但缺省发生一点变化,因为我们说过,在缺省的情况下,Python的行为是尽可能取最大区间,此时访问是逆序的,start应尽量取大,stop应尽量取小,才能保证区间最大,因此:

按照扩充索引范围的观点,start的缺省值是无穷大(​)stop的缺省值是无穷小(​)

 >>> a[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]>>> a[5::-1][5, 4, 3, 2, 1, 0]>>> a[:4:-2][9, 7, 5]>>> a[::-1][9, 8, 7, 6, 5, 4, 3, 2, 1, 0]

Python基础知识:切片相关推荐

  1. Python 基础知识学习笔记——NumPy

    Python基础知识学习笔记--NumPy 与 matlab 优秀的矩阵运算类似,python 提供了 numpy 库,这对熟悉 matlab 的用户来说非常友好.向量.矩阵和多维数组是数值计算中必不 ...

  2. python基础知识学习笔记(1)

    python 基础知识学习笔记(1) 总结一下Python基础知识,以防忘记. 文章目录 python 基础知识学习笔记(1) 一.起步 1.python安装与编译环境 二.变量和简单数据类型 三.列 ...

  3. python基础知识-python基础知识(一)

    最近花时间整理了一下以前学过的python基础知识,语言最多的是使用. 1.1 开发模式 交互模式:简单的调试或者测试 开发流程 创建以.py结尾的python文件 在python文件中输入打印&qu ...

  4. python基础知识及数据分析工具安装及简单使用(Numpy/Scipy/Matplotlib/Pandas/StatsModels/Scikit-Learn/Keras/Gensim))

    Python介绍. Unix & Linux & Window & Mac 平台安装更新 Python3 及VSCode下Python环境配置配置 python基础知识及数据分 ...

  5. Python基础知识总结(期末复习精简版)

    文章目录 知识汇总 前言 推荐的学习资料 复习要点 组合数据类型 序列类型通用操作符和函数 集合类型 映射类型 数值操作 运算符 字符串操作 字符串切片 基本切片操作 高级切片操作 操作.相关函数.相 ...

  6. Python基础知识详解 从入门到精通(八)魔法方法

    目录 Python基础知识详解 从入门到精通(八)魔法方法 什么是魔法方法 基础魔法方法(较为常用) 比较操作符 算数运算符 反运算(类似于运算方法) 增量赋值运算 一元操作符 类型转换 上下文管理( ...

  7. 一、 Python 基础知识笔记 —— 《Python编程:从入门到实践(第二版)》学习笔记

    前言 先安利这本书<Python编程:从入门到实践(第二版)>,作者埃里克-马瑟斯,很适合新手入门,我的python入门学习就是以这本书为核心: 再安利一个网站:菜鸟教程-Python3教 ...

  8. python基础知识有哪些需要背(记住是基础知识)我是初学者

    大家好,小编来为大家解答以下问题,一个有趣的事情,一个有趣的事情,今天让我们一起来看看吧! 1.python基础知识有哪些需要背(记住是基础知识)我是初学者 或看好Python的广阔前景,或看中Pyt ...

  9. Python基础知识笔记

    文章目录 Python基础知识 教程:https://www.liaoxuefeng.com/wiki/1016959663602400 内置函数:https://docs.python.org/3/ ...

  10. 小白都能学会的Python基础 第二讲:Python基础知识

    1.华小智系列 - Python基础(案例版) <Python基础>目录 第二讲:Python基础知识 1.变量.行与缩进 2.数据类型:数字与字符串 3.列表与字典 4.运算符介绍与实践 ...

最新文章

  1. win32ctypes.pywin32.pywintypes.error: (2, ‘LoadLibraryEx‘, ‘系统找不到指定的文件。‘)
  2. Python中Queue.get()方法阻塞
  3. 对Python中几种快速排序的实现以及运行时间进行比较
  4. Boost:bind绑定visit测试程序
  5. TensorFlow 学习指南 一、基础
  6. jinja Whitespace Control
  7. 2016-03-15 nsfoundation 数组 字典 nsrange等
  8. CS224N笔记——深入GRU和LSTM
  9. Java 实验五 王奕开
  10. C语言小案例_OA大典故障案例摘录【第1393篇】爱普生c5290 彩色喷墨打印机 打印横白道...
  11. Android EditText与软键盘
  12. MATLAB 绘制颜色图的 几个函数 colormap caxis colorbar shading+pcolor用法记录
  13. 2018天池大数据-印象盐城:数创未来大数据竞赛经验分享
  14. 【Angular】使用高德地图比例尺心得总结
  15. Redhat7.5升级openssh到8.2p1
  16. android apk sign,apk文件的sign以及align命令
  17. 能自动翻译的软件-最精准的翻译软件
  18. 特征金字塔(FPN)
  19. Python WOE的使用
  20. 新手开淘宝网店怎样一个月安全达到一钻

热门文章

  1. macOS Big Sur 11.6.5 (20G527) 正式版 ISO、PKG、DMG、IPSW 下载
  2. 只能上QQ,不能打开网页的解决办法
  3. win10无敌隐身术
  4. CF# Educational Codeforces Round 3 F. Frogs and mosquitoes
  5. 2021-09-25 WPF上位机 29-3D绘图的对象,变形,鼠标操控,鼠标事件,2D在3D中展示
  6. 如何走向真正的智能?
  7. 计算机mc mr,【科普贴】计算器上的GT、CE、AC、MU、MC、MR、M-、M+都是什么?
  8. 怎样清理苹果电脑磁盘空间_Mac空间不足怎么办,快速清理Mac系统垃圾与磁盘|Crucial(英睿达)...
  9. IPQ807X/IPQ50XX/IPQ60XX art关闭mac地址随机化设置
  10. openerp QWeb