本小节深入探讨Python中的序列切片语法。
切片-slicing可以获取序列的子序列(列表,字符串…):

numbers = [x for x in range(10)]
print("numbers:",numbers)
print("numbers[3:9]:",numbers[3:9])
print("numbers[3:]:",numbers[3:])
print("numbers[:9]:",numbers[:9])
print("numbers[-6:-1]:",numbers[-6:-1])
print("numbers[1:9:2]:",numbers[1:9:2])
print("numbers[-1:1:-2]:",numbers[-1:1:-2])

版权声明

本文可以在互联网上自由转载,但必须:注明出处(作者:海洋饼干叔叔)并包含指向本页面的链接。

本文不可以以纸质出版为目的进行改编、摘抄。

本文节选自作者的《Python编程基础及应用》视频教程。

切片

切片-slicing可以获取序列的子序列(列表,字符串…):

numbers = [x for x in range(10)]
print("numbers:",numbers)
print("numbers[3:9]:",numbers[3:9])
print("numbers[3:]:",numbers[3:])
print("numbers[:9]:",numbers[:9])
print("numbers[-6:-1]:",numbers[-6:-1])
print("numbers[1:9:2]:",numbers[1:9:2])
print("numbers[-1:1:-2]:",numbers[-1:1:-2])

执行结果:

numbers: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
numbers[3:9]: [3, 4, 5, 6, 7, 8]
numbers[3:]: [3, 4, 5, 6, 7, 8, 9]
numbers[:9]: [0, 1, 2, 3, 4, 5, 6, 7, 8]
numbers[-6:-1]: [4, 5, 6, 7, 8]
numbers[1:9:2]: [1, 3, 5, 7]
numbers[-1:1:-2]: [9, 7, 5, 3]
说明
- 切片功能强大到令人发挥的程度,同时也复杂到令人费解;
- numbers[3:9]从下标3开始复制元素,直到下标8(9-1);
- numbers[3:]等价于numbers[3:10],从下标3开始复制元素,直到末尾,即下标9(10-1);
- numbers[:9]等价于numbers[0:9],从下标0开始复制元素,直到下标8(9-1);
- numbers[-6:-1]等价于numbers[4:9],其中len(numbers)-6=4, len(numbers)-1=9;
- numbers[1:9:2]从下标1开始复制元素,每复制1个元素,下标+2, 直到下标达到或超过9结束(注意不包括下标为9的元素);
- numbers[-1:1:-2]从下标len(numbers)-1,即下标9开始复制元素,每复制1个元素,下标-2,直到下标<=1结束(注意不包括下标为1的元素)。

​ 综上,numbers的切片的完整形式为: numbers[x:y:z],z为步长,缺省值为1,x为起始下标,y为终止下标。z > 0时,x缺省为0, 包括最左端的元素, y缺省为len(numbers),包括最右端的元素,最右端元素的下标为len(numbers)-1。注意,当z值为负数时,切片方向为从右往左,起始下标x应包括最右方(也就是最后一个)元素,故x的缺省值为len(numbers)-1;终止下标y则为-1, 这有点让有费解:因为如果y为0的话,列表的下标0元素将不会被包括在切片中。如果你还感到疑惑,请看下一小节。

深入理解切片

​ 切片的过程事实上跟数值列表range(x,y,z)的计数过程十分类似,由于这个切片过程适用于所有序列(字符串,列表…),故下图中我们用seq[x:y:z]表示序列及其切片参数,首先考虑z>0的情况:

​ 现以numbers[1:9:2]为例,依上述流程图说明输出集合为什么是[1,3,5,7]。首先,下标取值x=1,然后开始循环:

- 下标1 < 9成立,复制numbers[1],即值1;
- 下标=1+2=3;
- 下标3 < 9成立,复制numbers[3],即值3;
- 下标=3+2=5;
- 下标5 < 9成立,复制numbers[5],即值5;
- 下标=5+2=7;
- 下标7 < 9成立,复制numbers[7],即值7;
- 下标=7+2=9;
- 下标9 < 9不成立,循环结束。

​ 如果你有C/C++经验,看下面的代码秒懂,因为Python的解释器就是用C/C++编写的。

for (int i=x;i<y;i+=z){copy(seq[i]);
}

​ 当z<0时,seq[x:y:z]的切片流程图如下:

​ 当z<0时,切片过程事实上是从序列尾部往头部方向行进的,由于z是负数,所以下标=下标+z事实上导致下标减小。如果你有C/C++经验,看下面的代码秒懂,因为Python的解释器就是用C/C++编写的。

for (int i=x;i>y;i+=z){copy(seq[i]);
}

​ **该你了,请依上述流程图,人肉执行numbers[-1:1:-2]的切片过程,看看输出结果跟Python解释器输出是否一致。**提示,-1表示倒数第1个元素,即len(numbers)-1=9。

妙用切片

numbers = [x for x in range(10)]
numbersCopy = numbers[:]
print("id:", id(numbers), numbers)
print("id:", id(numbersCopy), numbersCopy)numbersReversed = numbers[::-1]
print("numbersReversed:",numbersReversed)numbers[3:5] = 77,88
print("numbers:",numbers)

执行结果:

id: 2611651371592 [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
id: 2611651371656 [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
numbersReversed: [9, 8, 7, 6, 5, 4, 3, 2, 1, 0]
numbers: [0, 1, 2, 77, 88, 5, 6, 7, 8, 9]

​ 从上述代码及执行结果可以看出,numbers[:]产生了numbers的副本,其效果等价于numbers.copy(), numbers与numbersCopy的id值不同;而numbers[::-1]从尾部往前进行切片,其切片正好将序列倒序。这与numbers.reverse()有区别,numbers.reverse()会导致numbers列表被改变,且不会返回新列表;而numbers[::-1]会保持numbers列表不变,并生成一个新的列表。

​ 请注意倒数第二行代码,对列表的切片还可以用于批量修改列表元素。从结果可见,numbers[3:5] = 77,88等价于numbers[3] = 77和numbers[4] = 88。

字符串切片

​ 作为一种序列,字符串的切片方法与列表几乎完全相同,见下述代码:

numbers = '0123456789'
print(numbers[2:5])
print(numbers[1:9:2])
print(numbers[:3:-2])

执行结果:

234
1357
975

本文节选自作者的《Python编程基础及应用》视频教程及同名教科书。想完整零基础学习Python程序设计,欢迎使用此免费视频教程。

深入讨论Python中的序列切片语法相关推荐

  1. python切片语法-如何在Python中使用省略号切片语法?

    This came up in Hidden features of Python, but I can't see good documentation or examples that expla ...

  2. python中list的切片和range函数

    1.python中list的切片 语法:[start:stop:step] step代表切片步长:切片区间为[start,stop),包含start但不包含stop 1.step > 0,从左往 ...

  3. python中的序列类型数据结构元素的切片操作_浅析python中的分片与截断序列

    浅析python中的分片与截断序列 序列概念 在分片规则里list.tuple.str(字符串)都可以称为序列,都可以按规则进行切片操作 切片操作 注意切片的下标0代表顺序的第一个元素,-1代表倒序的 ...

  4. python中的序列类型数据结构元素的切片操作_PythonI/O进阶学习笔记_4.自定义序列类(序列基类继承关系/可切片对象/推导式)...

    前言: 本文代码基于python3 Content: 1.python中的序列类分类 2. python序列中abc基类继承关系 3. 由list的extend等方法来看序列类的一些特定方法 4. l ...

  5. python中的序列总结:列表,元组,字符串

    首先python中的序列有列表,元组,字符串. 列表List是python里面最基本的数据结构.序列中每个元素都是从索引(下标)从0开始,依次叠加. List操作的方法很多,只能熟悉基本常用的这个方法 ...

  6. Python 中的序列类型支持哪些公共操作

    一.序列类型支持哪些公共操作 Python 中的序列类型分为:可变序列和不可变序列,都支持我们序列类型的所有操作 可变序列:列表 不可变序列:字符串和元祖 1.支持通过数字索引取值 a = (&quo ...

  7. python 中的序列

    python 中的序列 序列概述 Python 内置了多种序列,比如列表.元组和字符串. 列表和元组的主要不同在于:列表是可以修改的,而元组不可以. 在需要处理一系列值时,序列很有用.在数据库中,你可 ...

  8. Python中的序列操作

    Python中的序列操作 分类: python undefined 官方手册:https://docs.python.org/3.7/library/stdtypes.html#sequence-ty ...

  9. python中的序列封包和序列解包

    今天我们要学的内容是python中的序列封包和序列解包,在此之前,我要先给你们讲解一下python中的序列. 可能刚接触python的朋友们都听过序列这个词,那么什么是序列呢? 序列就是可以进行索引和 ...

最新文章

  1. python基本数据类型及操作
  2. 供配电负荷计算方法详解
  3. centos7.6+vim8.1
  4. Vue源码解析之AST语法树(三)
  5. matlab swt函数,matlab swt 函数出错
  6. oracle存储过程 ppt,oracle_存储过程培训(动画版本)详解.ppt
  7. 测试员不可不知的几款bug管理工具
  8. ORACLE11G在LINUX6下安装及报错 C [ld-linux-x86-64.so.2+0x14d70]的解决方法
  9. java error_java基础:Error和Exception
  10. 计算机考试系统客户端网址,[中学]计算机基础测评系统考试客户端操作步骤.doc...
  11. 在Python里安装Jieba中文分词组件
  12. python实现视频剪切与拼接
  13. 计算24点有什么窍门或技巧吗?
  14. css3ps插件,css3ps插件
  15. 16G DWDM SFP+光模块特性及解决方案
  16. 思科模拟器Cisco Packet Tracer的下载
  17. marquee---jsp中的滚动字幕标记
  18. Dynamics CRM2011 在Visual Studio中开启Javascript的Xrm.Page智能提示
  19. 硬盘挂载 mount 详细步骤及遇到问题“Mount is denied because the NTFS volume is already exclusively opened”
  20. 手机图片到底要做多宽才可以适应所有手机屏幕的尺寸?

热门文章

  1. 施工现场工地监管如何能够接入4G摄像头实现流媒体服务器视频监控?
  2. python 微信授权 昵称乱码解决
  3. 程序员纹身被拍引网友热议,代码身上纹,我是社会人!
  4. 酷炫的多选方案,拒绝重复劳动
  5. 【工作总结】工作感受
  6. 课题组亓林博士的论文被 IEEE TGRS 录用
  7. 文本数据分析:文本挖掘还是自然语言处理?
  8. 服务器之间如何传输数据
  9. 小案例之点击网页任意位置出现小爱心
  10. mysql rls_各种类型RLS自适应滤波算法的C++实现