(注意:本文基于Python3)
前言
中文名称:切片
中文别称:分片
英文名称:slice
概念:切片是Python中的一个特性
作用:将一个序列中一部分元素分离出来组成一个新的序列
介绍切片之前,需要掌握几个重要前置知识点,一个是序列、另一个是索引!
序列基础(前置知识,必须知道)
序列:也称为线性表,它是使用率最高的数据结构
特点:
1、第一个元素没有直接前驱元素,只有一个直接后继元素
2、中间的每个元素有一个直接前驱元素和一个直接后继元素
3、最后一个元素没有直接后继元素,只有一个直接前驱元素
存储结构:
1、可以使用连续存储结构实现序列,即数组,连续存储结构也称为顺序存储结构
2、可以使用非连续存储结构实现序列,即链表,非连续存储结构也被称为链式存储结构
Python中的序列类型
在Python中的所有序列类型全部支持切片功能,只要是个序列就支持切片
Python中的序列类型包括下面这些:
1、list
2、tuple
3、range
4、str
5、bytes
6、bytearray
7、memoryview
共计7个序列类型,最常用的为前4个类型:list、tuple、range、str
以下为7个序列类型的代码,以及切片操作的展示
>>> first_list = [1,2,3]
>>> type(first_list)
<class 'list'>
>>> second_tuple = (4,5,6)
>>> type(second_tuple)
<class 'tuple'>
>>> third_range = range(10)
>>> type(third_range)
<class 'range'>
>>> fourth_str = "wang yuan wai"
>>> type(fourth_str)
<class 'str'>
>>> fifth_bytes = b"i am fk"
>>> type(fifth_bytes)
<class 'bytes'>
>>> sixth_bytearray = bytearray(b'abcefg')
>>> type(sixth_bytearray)
<class 'bytearray'>
>>> seventh_memoryview=memoryview(b'abcefg')
>>> type(seventh_memoryview)
<class 'memoryview'>
Python索引基础(前置知识,必须知道)
Python中的所有序列支持索引功能
索引的别称:偏移量、下标
索引初始值:索引的初始值从0开始,第1个元素的索引值为0
负索引值:Python支持负索引,最后一个元素的负索引值为-1 (序列长度-1的索引值刚好指向最后一个元素,所以用-1表示最后一个元素)
举例
图示:定义一个字符串"WANGBA",共计6个元素
每个元素为一个字符串(Python没有字符类型,所以每个元素为单个字符的字符串)
假设变量名temp指向字符串对象"WANGBA",下文中将使用temp表示此字符串
temp="wangba"
备注:字符串类型是序列类型之一
正索引
方向:从左向右
第1个元素是字符串"W",它的索引值为0,第2个元素是字符串"A",它的索引值为1,而最后一个元素的索引值是序列长度-1,因为“WANGBA”的长度是6,所以最后一个元素"A"的索引值是5
方括号提取第一个字符:temp[0]
方括号提取最后一个字符:temp[5]
方括号接受索引值,即可提取出单个字符的字符串
负索引
方向:从右向左
最后一个元素为"A",它的负索引值为-1,倒数第二个元素为"B",它的负索引值为-2
那么负索引值是怎么推算出来的?为什么最后一个元素是-1呢?
以最后一个元素举例,序列长度-1就是最后一个元素的正索引值,如果省略掉序列长度,剩下的-1,就表示从右向左的负索引值
小结
无论是正索引操作、还是负索引操作,他们都只能从当前序列对象中提取出1个元素,有什么办法可以提取出多个元素组成一个新的序列呢?往下继续看切片……
介绍切片
使用索引值可以提取序列中的单个元素,而切片可提取单个元素或者提取多个元素作为一个新的序列对象,所有的序列类型都支持切片操作,接下来以字符串类型作为举例
切片语法
[start:end:step]
1、写在方括号中,由3个部分组成,每个部分使用冒号":"分隔开
2、3个部分,每个部分都可省略不写,此时会采用默认值
3、每部分的术语
start称为左边界、别称上边界,表示一个开始索引值
end称为右边界、别称下边界,表示为一个结束索引值
step称为步长、别称步进,表示每2个元素之间的索引值距离
4、省略时的默认值
start部分省略时,使用默认值为0
end部分省略时,使用默认值为序列长度
step部分省略时,使用默认值为1
5、取值约束
start值为整数即可,值可大于序列长度
end值为整数即可,值也可大于序列长度
step值必须大于等于1(若setp为0,Python解释会显式的抛出ValueError: slice step cannot be zero)
写法剧透
1、全部省略
[:]
2、省略end、省略step
[0:]
3、省略step
[0:5]
4、省略start、省略step
[:5]
5、省略start、省略end
[::2]
6、省略start
[:5:1]
7、省略end
[1::3]
8、无省略
[0:5:2]
提取元素的特点
1、包含start下标对应的元素
2、不包含end下标对应的元素
3、提取出的是一个新的序列对象(创建一个新的对象)
详细举例
提取最后3个字符为新的字符串:
>>> temp = 'helloWangYuanWai'
>>> temp[-3:]
'Wai' #完整的切片操作为 [-3:temp长度:1]
从开头到结尾,step为5:
>>> temp[::5]
'hWui' #完整的切片操作为[0:temp长度:5]
字符串倒转(reverse),通过设置步长为-1:
>>> temp[::-1]
'iaWnauYgnaWolleh' #完整的切片操作为 [0:temp长度:-1]
参考文章:https://docs.python.org/zh-cn/3/library/stdtypes.html#sequence-types-list-tuple-range