小疯谈python:(四)数据类型之序列类型(上)
在上一篇文章中,我介绍了python数据类型最基础的数值类型,今天我将继续介绍python中的序列类型以及序列类型的通用操作符和函数。
在开始之前,我先向大家简单的介绍一下什么是序列类型,序列类型就是序列间由序号引导,通过下标访问序列的特定元素,换句话说,序列类型是可以通过对内部元素的位置进行索引的,由于它可以通过位置进行索引(索引即通过元素的位置查找元素的值),因此序列类型都是一维数据,而且是可以被迭代的。
在python中,序列类型一共分为列表,元组,字符串,其中列表为可变序列,即创建完成后可以通过一些手段对内部的元素进行更改,而元组和字符串属于不可变序列,即一旦创建不可更改。
既然序列类型可以通过位置索引,那么我们该如何对一个序列类型进行索引呢?
下面我将以列表list=['a','b','c','d','e']为例,元组和字符串也是一样的。
首先我们要知道python的两个索引体系即正向递增序号和反向递减序号。
注意正向递增序号是从0开始,而不是1。
现在我们需要知道序列中第m个元素是什么,在正向递增中通过 序列名称+[m-1] 可以获得
在反向递减中通过 列表名称+[-n] 获得,其中n是列表中 元素个数-m+1即从后往前数第几个元素。
还是以之前的列表为例,现在我要知道列表中第一个元素和最后一个元素。只需要通过list[0]和list[-1]就可以知道对应的元素。(这里是在交互模式下,如果你是在文件模式下还需要用print打印出来)
从上面的例子可以看出,通过索引我们可以得到对应的元素值,但有些情况下我们只知道列表中的某个元素,但是却不知道它的索引位置,这时候,我们可以通过 列表.index() 的方式来获取元素的索引值。
从上面的代码可知,通过index()函数获取的索引值是是正向递增的数值。
可能有小伙伴会问了,如果序列类型中有相同的元素,index()函数会怎么返回呢?
如果在一个序列类型中有相同的元素,在默认情况下会返回第一个元素的索引值,当然你也可以自己设置一个起点和终点。
好的,既然在序列类型中元素可以重复出现,那么我们如果想要知道一个元素在序列中出现次数怎么办?
在python中,我们可以通过 序列名称.count(元素) 获取。
那么我们想要知道一个序列中所有的元素个数,我们可以通过 len(序列的名称) 获取
如果我想判断某个元素是否在一个序列中,可以通过操作符 in或者not in 判断,结果以布尔值的形式返回
好的,以上都是对序列中单个元素进行操作,现在我想要知道序列中某一段的元素,那该怎么操作呢?同样的,python也为我们提供了简便的操作方法,这个方法便是我们常听见的切片。这是序列类型中最重要的部分
切片的格式: 序列名称[ i : j : k] 具体含义返回从第 i+1 个元素开始,到第 j 个元素内的以k为步数的所有元素(即返回索引值为 i 到 j-1的以k为步数的所有元素的子序列)。其中 : k 可以不写,如果不写默认值为1,即返回之间的所有元素。注意返回的仍是与之前相同的序列类型,即列表的切片为列表,字符串的切片为字符串。(注意切片支持正向递增切片和反向递减切片)
拓展:在切片过程中,i,j,k的正负值能够影响返回序列的排序方式。
从上面的例子我们可以看到,
当 j 大于 i 且 k 为正值(不填则默认为1),列表是按照正序返回切片值
当 j 小于 i 且 k 为负值(不填则默认为1),列表是按照逆序返回切片值
当 j 大于 i 且k 为负值或者当 j 小于 i 且 k为正值,列表返回空值(例子我没举,小伙伴可以自己尝试一下)
我们继续,现在如果我不知道列表最后一个元素的索引值,但是我想在的切片要取到最后一个元素这该怎么办?有小伙伴会说我可以先用index函数看一下最后一个的索引值,或者使用-1。的确这是一个方法,但是假设你找到最后一个元素的索引为j,但是你用list[ i : j]是不能取到最后一个元素,只能取到第j-1个元素。同理用list[ i :-1]也是一样的。
针对这样的问题,我们有以下的方法可以解决。
第一种我们可以扩大元素,假设我们的序列中有10个元素,我要切第2个元素到第十个元素的值,那么我可以这样写 序列名称[1:11],通过扩大元素个数使索引值溢出,从而把第十个元素包含在切片中。不过这种方式可能还是会使你出现索引不完的情况,而且也不规范。
第二种方法便是省略范围,即我不给需要我索引的开始值或者终止值甚至两个都不给,如果不给开始值,那么python会默认从第一个元素切片(即索引值为0),如果不给终止值,那么python会默认以最后一个元素为结束(即索引作为-1)并且包括该值。语法格式是 序列名称[(i):(j):(k)]括号内的可以省略。
好的,这是后小伙伴会问了,这个k有什么作用呢?之前我们说过,k是步长的意思,也就是每隔k个单位取一次值(通俗的将就是所取的两个元素之间包含k-1个元素)。因此如果我想对列表中的所有值以2个单位为长度切片的,结合上面的知识可以这样写
说到这里,我们最后一个知识点也就来了,如果我要对这个列表进行翻转(即把最后面的元素放到第一位,把倒数第二位的元素放到第二位,以此类推),便可以通过下面一种巧妙的方法实现
这里我就不再解释其原理,我想只要你看懂上面的内容,就一定可以明白其中的玄机。
好的以上便是关于序列类型的通用操作,如果你有什问题可以直接私信我,下一篇将开始具体介绍序列类型的列表和元组类型,同时拓展介绍运算符中的赋值运算符和逻辑运算符。同样的,如果小伙伴觉得有所收获,那么还请点赞和转发一下吧。
以下是12个序列类型的通用操作符和函数,有些我没有介绍,感兴趣的小伙伴可以自己尝试