菜鸟Python之序列(字符串、元组、列表)通用方法

前言 

     今天是小编正式回校的第一天。新的学期,新的开始,在两天的休息整顿之后按理也该在我的编程学习之旅上继续前行了。

      上一篇博文我们学习到Python组合数据类型的分类,知道了组合数据类型可以分为三大类型:序列类型,集合类型以及映射类型,也知道了最常用最重要的序列类型还可以继续划分为字符串、元组以及列表。今天的博文不细说字符串、元组以及列表的使用,今天我的目标是依据Magnus教授基于Python2的教材梳理一下序列类型的通用内建方法。我觉得需要在这里说明一点的是小编从一开始入手学习的就是Python3,所以内心也更加倾向于Python3,在使用Python2教材的时候也会努力企图将Python2与Python3不兼容的地方修改成Python3使用的语法,由于精力与经验有限,所以对Python2与Python3的区别并未曾有过深入的分析研究,有所不当之处还望各位大佬评论指教。

      在教材上教授给出了这样几种常用的序列通用操作方法,分别是索引、分片、序列相加、乘法、成员资格、长度、最小值和最大值。其中有几个名词我自己第一遍读的时候也觉得很陌生晦涩,因而令新手望而生畏也是理所当然。但是我个人觉得只要理解了这些专业术语的意思,在我们自己的脑海里用自己的熟悉的语句对其进行通俗解释,这些方法我们统统都可以掌握。下面我们对其进行一一分析归纳:

1、序列通用操作--索引

      在具体介绍某个概念之前,我们必须要向对方说明清楚这个概念的用处到底是什么。索引是一种方法,那么用这个方法我们能够做什么?这是我们学习新东西的时候必须要问自己的一个问题。我在上一篇博文里写道过序列就相当于我们数学里的数列,数列是一组排好顺序的数据。比如,现在有一个数列S0 = 1,3,9,4,26,6。。。,我想问数列中的第50个元素是多少(假设数列长度大于50)?那么这个时候对于这样一个并不算轻松的任务我们急切需要一个方法自动帮我们找到第50个数的值并将结果返回给我们。在Python中索引方法由此诞生,索引我们就可以理解为查找,帮我们查找到我们想知道的序列中某位置处对应的确定值。使用索引方法的时候,我们不用管我们正在处理的对象类型到底是什么,是字符串,是元组,还是列表,这并不重要,我们只需要在心里明确的一点就是我们正在处理的对象它属于序列类型,是一种按顺序排列好的类型,是一种在特定位置有唯一确定值的类型。

      好了,废话不再多说。接下来我们需要知道的是怎样使用索引方法达到我们想要得到的答案即可。(有C和C++基础的同胞最后会发现Python中的索引正类似于C或C++中的数组引用方法)。这里有一个简单的例子,设定变量s = [1,2,3,4,5],问:这个序列中的第三个元素是多少?(说明:这个变量s的类型是一个列表,列表我们后面会细讲)在Python中,我们使用s[2]就可以得到序列中第三个元素的值,这就是一个索引的例子。那么我们再从数拓展到字符,第二个例子,设定变量s = "hello",问该序列的第三个元素是多少?("hello"是一个字符串,也是序列类型),同样s[2]直接解决问题。需要注意的是,当正向索引的时候我们访问的第一个数据索引号为0。这是我们在C和C++中司空见惯的东西,那么Python中的索引有没有更为方便的地方呢?还真有!我们说Python中的序列类型还可以倒着数?意思就是当我们要查找的数据接近数据列的末尾时,比如我们问倒数第三个,倒数第一个数据是多少,这样的要求反向索引就显得尤为方便。我们还用上面的两个例子即可说明问题:1、s = [1,2,3,4,5],问这个序列中倒数第三个数是多少?我们使用s[-3]即可查找到,2、s = "hello",我们使用s[-3]也能同样地索引到倒数第三个数对应的值。


 2、序列通用操作--分片

    分片看似又是一个陌生的概念,然而实际上呢?实际上分片只是对于索引方法的一个延伸。我们知道了索引只能帮助我们提取出序列中的一个元素,但是如果我们想要一步提取出序列中的N多元素呢,这个时候分片就帮助我们完美地解决了这个问题。比如我们想要提取出某序列中一串连续的数据,那么我们仅需要在索引的时候给它确定一个左右边界,类似于用左右边界将我们想要提取的内容框定起来,即可完成操作。

     我们还以例子加以说明。设定一个变量numbers = [1,2,3,4,5,6,7,8,9,10],应该如何提取出该序列中的第3到第6个数据呢?我们使用numbers[2:6]就可以实现这样一个效果。我们简单分析一下,该行代码用冒号将左右边界隔开,那么为什么我们要提取的是第3到第6个数据,而左右两边的数字分别是2和6呢?看完索引我们不难明白左边界2代表的是第三个数据,这一点毋庸置疑,而右边界的6,即numbers[6]已经是第七个数据,它是取不到的。这也就意味着在分片中存在一个取左边界而不取右边界的规则。这一点值得我们去十分注意。对于反向索引使用类似的方法进行使用即可。还有一点可以说的是,使用分片方法取的元素个数问题,以该例进行说明,6-2=4,提取出来的元素数量就是4,与题意符合,那也就意味着虽然存在左闭右开的规则,但是假如我们想取从第三个数据开始往后的10个数据的话,是numbers[2:12]即可解决问题。

     第二个分片方法的例子是关于正反向索引的混用问题。听上去挺复杂的,但是却在很多时候可以帮助我们简化问题。有这样一个问题背景,现在有一个很长的序列,我们需要提取其中的第二个到倒数第二个数据中间的N多个数据。在这种情况下,显然我们使用完全正向或完全反向并不合适。假设变量s = "hello,world!",我们想提取第一个数据到倒数第二个数据之间的全部数据,我们使用s[0:-1]即可提取出"hello,world",同样,冒号左右两边处于左闭右开状态,s[-1]即最后一个数据不被提取,被提取的数据一直到s[-2]即倒数第二个数据为止。

    有时候我们不想提取一串连续的数据,我们想跳着提取数据怎么办呢?在分片方法中,我们可以设置步长。还是这个序列,numbers = [1,2,3,4,5,6,7,8,9,10],我们想提取从第一个数据开始一直到结尾以每隔一个数据的方式提取出我们想要的结果。首先说明一下,在分片操作中,numbers[:]可以原样提取出所有的元素,相当于复制。那么在该例中,我们用numbers[::2]这样一个命令即可对全部数据以每隔一个的方式进行提取。


3、序列通用操作--序列相加

     序列相加这个概念相对于前两个则比较简单。但是我们需要注意的是这里是对序列进行相加,不能与基本数据类型相加形成混淆,我们在大脑中的习惯性思维是2+3 = 5这样的加法类型。序列之间是没有办法进行数值相加的,在这里的加我们可以理解为连接。比如这里有两个序列,都为列表类型,序列s1 = [1,2,3], s2 = [4,5,6], 那么s1+s2的结果是多少呢?既然序列相加是连接,那么结果自然就是[1,2,3,4,5,6];再举一个例子,两个字符串类型的序列,序列s1 = "hello" ,序列s2 = "World", s1+s2的结果显然就是"helloWorld"。有一个注意点,即便同是属于序列这样一个大家族,但是不同的序列类型之间是没有办法进行序列相加操作的,例如,s1 = "hello", s2 = [1,2,3],执行s1+s2时就会出现报错。


4、序列通用操作--序列乘法

     下面我们继续介绍Python给我们提供的比较方便的序列操作--乘法。这里的乘法同样不是数值上的乘,而可以理解为一种多次复制。比如我们现在想要将"hello,"这样一个字符串赋值3次,只需要采用"hello,"*3便可以得到"hello,hello,hello,",简单方便。同样,对于列表类型,[10]*10,我们得到的结果就是[10,10,10,10,10,10,10,10,10,10]。


5、序列通用操作--成员资格

     成员资格这样一个词似乎又是一个对于我们来说相对陌生的概念。成员资格是做什么用的呢?它是用来检查某个值是否在该序列中,如果在则返回True,如果不在则返回False。举一个实际一点的例子,比如我们这里有一个庞大的数据库用来存储所有注册过的用户的用户名,在某个用户登录时我们需要先检查一下该用户输入的用户名是否在该数据库中,那么这就是成员资格的应用。简而言之,成员资格就是用来判断你这个值是否是我们序列的成员。例如,字符串s1 = "hello",我们想判断"he"这个字符串在不在序列s1中,我们使用"he" in s1这样一个命令,得到的结果是True, 那么"hl"呢,我们输入"hl" in s1 ,返回结果为False,说明不在。对于列表类型同样如此,列表s2 = [1,3,7],输入3 in s2和10 in s2的结果分别是什么呢?如下图所示:


6、序列通用操作--长度、最大值和最小值

     长度、最大值、最小值也是比较容易理解的,在这里我们使用到内建函数(即可以直接使用的函数)len(),max(),min(),假设有一个列表s1 = [1,2,3,4,5],使用len(s1)语句即可计算出列表的长度,即列表内的元素个数,在这里得到的答案就是5,max(s1)得到的就是s1中的最大数值,min(s1)得到的自然就是s1中的最小数值。


总结

     序列的通用操作到这里就整理结束了。这些操作在我们实际使用处理大批量数据时都将会派上很大的用场,后面的博文我会继续整理序列类型中的第一个子类型字符串类型,看看Python中到底提供了哪些十分方便的方法来处理我们的字符串信息。不得不说,写博文真的是一个耗时间的工作,从晚上九点半开始,一直到现在,凌晨12点半,整整三个小时,也不过才整理了6个通用序列操作,这里的每一个字,每一张图都是我通过对书本的理解一个字一个字以自己的理解码出来的,写完之后,感觉自己的思路也通畅了许多,也深深地觉得写文字的时候明显没有前面两篇那么犹豫了。从来没有什么工作是轻松的,但是倾心付出的时候会获得快乐。大二下的生活马上就要开始了,这学期的课程再加上手上正在做的智能车竞赛,时间也真的是吃得紧,希望自己每天都能够安排好自己的生活,多留下一点和自己的思想进行交流碰撞的时间吧。人生还是要努力,嗯!

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值