通过前面我们所学的,我们知道,对于list和tuple这两种有序的集合,我们是可以通过下标(索引)来对元素进行访问的,比如:
对于dict来说,我们可以通过get(key)的方式获得对应的value值,比如:
但对于set来说,因为它不是键值对,也不是有序的,所以既无法通过key访问value值,也无法通过索引访问元素值,但是我们可以判断key是否存在,存在了,这个key的值就是我们要的'元素'
温故而知新,做到每天接触新的知识点的同时也不忘之前学到的知识,这样,我们才能真正意义上做到积累!
Question:思考一下这个问题,如果我们一次性取出好几个元素如何做到?(这里提到元素了,我们就不考虑dict了,毕竟涉及索引(下标)访问的,只有顺序结构的集合能做到了,因此,我们这里只针对list和tuple)
通常,我们取出多个元素,是这样做的(下面讲到切片,我们只针对list来讲,tuple原理一样):
可以看出,如果我们想取出L中的前三个元素,要连续输出第一个元素,第二个元素和第三个元素,如果L中有1000个元素,而我们需要取出第50(索引49)个元素和第61(索引60)个元素之间的11个元素,我们就要连续输出11次,有没有更简便的办法呢,有的!就是我们今天要讲到的切片操作。
跟进substring函数看一下:
试一下,第一种情况:
我们再来看一下,如何根据subLen【count】计算出新的string对象
功能和Java的substring一样,思路也一样,唯一不同的是,Python的更简洁,重点是支持字符串倒置访问,所以我们还可以以下面的方式得到结果:‘45’
如果还不明白,我们继续举例
如果向前推进四个字符 : '3456',我们应该怎么写呢? 很简单,如下
区别于Java的substring函数,Java的endIndex必须要比beginIndex的值要大,否则会抛异常
因为Java只支持字符串的正序切分,没法倒着来,因此,有这个限制,但是Python的slice函数却没有
如果我们想得到str的奇数字符,怎么办呢(结果是'135'):
解释:不截取,就当前字符串,从第一个字符开始,2个字符一分组,不够的单独分出来,取第一个字符 【字符之间步长等于2】
反着来一个
解释:[-6:-1] 倒置截取字符串 ==> "12345" ==>从第一个字符开始, 2个字符一分组,不够的单独分出来,取第一个字符 ==> "135"【字符之间步长等于2】
不过瘾的话,我们再来一个:
解释:[1:6]正序截取字符串 ==> "23456' ==>从第一个字符开始,4个字符一分组,不够的单独分出来,取第一个字符 ==>"26"【字符之间步长等于4】
我们试着,取步长【间隔】等于1的所有字符 == 其实就是字符本身
取等于2的步长,结合上面所讲,不用想,直接给出答案:"ace"
以上我们简单的通过字符串切片操作,来得到我们想要的结果,下面要讲的list、tuple切片操作和字符串切片操作一样,下面我就不再细讲了,直接看例子:
例子1:我们取50-60这11个元素,操作如下:
例子2:我们取出前10个元素
例子3:前20个元素,每五个元素一分组,不够的单独分出来【通俗点就是连续的字符且字符间步长等于5】,取组内的第一个字符,也就是1 2 3 4 5我们取【1】,6 7 8 9 10我们取【6】,依次类推,如下:
例子4:利用切片操作复制一个list
上面我们可以看出,list切片操作后,对象仍然是一个list,同理,字符串切片操作后得到的仍然是字符串,tuple,也一样:
切片操作很方便的使我们截取我们想要的Part,简单粗暴,但是,切片操作背后的代码肯定不止表面上一行代码就能搞定的,所以,虽说Python表面上省去了我们书写代码的工作量,其实是以牺牲demo性能换来的,没关系,我们要的就是这种效果!性能我们可以优化,但是写代码这种事,怎么方便怎么来!