购买
下载掌阅APP,畅读海量书库
立即打开
畅读海量书库
扫码下载掌阅APP

2.1 通用序列操作

在讲解列表和元组之前,本节我们先介绍Python中序列的通用操作(这些操作在列表和元组中都会用到)。

Python中所有序列都可以进行一些特定操作,包括索引(indexing)、分片(slicing)、序列相加(adding)、乘法(multiplying)、成员资格、长度、最小值和最大值。

2.1.1 索引

序列是Python中最基本的数据结构。序列中的每个元素都有一个数字下标,代表它在序列中的位置,这个位置就是索引。

在序列中,第一个元素的索引下标是0,第二个元素的索引下标是1,以此类推,直到最后一个元素。

序列中所有元素都是有编号的,从0开始递增。可以通过编号分别对序列的元素进行访问。

看如下操作:

由输出结果可以看出,序列中的元素下标是从0开始的,从左向右,从0开始依自然顺序编号,元素可以通过编号访问。获取元素的方式为:在定义的变量名后加方括号,在方括号中输入所取元素下标的编号值。

这里的编号就是索引,可以通过索引获取元素。所有序列都可以通过这种方式进行索引。

提示

字符串的本质是由字符组成的序列。索引值为0的指向字符串中的第一个元素。比如在上面的示例中,索引值为0指向字符串56789中的第一个字符5,索引值为1指向字符6,索引值为2指向字符7,等等。

上面的示例从左往右顺序通过下标编号获取序列中的元素,其实也可以通过从右往左的逆序方式获取序列中的元素,其操作方式如下:

由输出结果可以看出,Python的序列也可以从右开始索引,并且最右边的元素索引下标值为-1,从右向左逐步递减。

在Python中,从左向右索引称为正数索引,从右向左索引称为负数索引。使用正数索引时,Python从索引下标为0的元素开始计数,往后依照正数自然数顺序递增,直到最后一个元素。使用负数索引时,Python会从最后一个元素开始计数,从-1开始依照负数自然数顺序递减,最后一个元素的索引编号是-1。

提示

在Python中,做负数索引时,最后一个元素的编号不是-0,与数学中的概念一样,-0=0,-0和0都指向序列中下标为0的元素,即序列中的第一个元素。

从上面的几个示例可以看到,进行字符串序列的索引时都定义了一个变量,其实不定义变量也可以。下面来看一个例子,在交互模式下输入:

使用索引既可以进行变量的引用操作,也可以直接操作序列,还可以操作函数的返回序列。

2.1.2 分片

Python中提供了分片的实现方式,所谓分片,就是通过冒号相隔的两个索引下标指定索引范围。

在交互模式下输入如下:

分片操作既支持正数索引,也支持负数索引,并且对于从序列中获取指定部分元素非常方便。

分片操作的实现需要提供两个索引作为边界,第一个索引下标所指的元素会被包含在分片内,第二个索引下标的元素不被包含在分片内。这个操作有点像数学里的a≤x<b,x是我们需要得到的元素,a是分片操作中的第一个索引下标,b是第二个索引下标,b不包含在x的取值范围内。

接着上面的示例,假设需要得到最后6个序号,使用正数索引可以这样操作:

使用负数索引得到的结果没有输出最后一个元素。我们尝试使用索引下标0作为最后一个元素的下一个元素,输入如下:

     >>> student[-17:0]
     ''

结果没有输出最后一个元素。

在Python中,只要在分片中最左边的索引下标对应的元素比它右边的索引下标对应的元素晚出现在序列中,分片结果返回的就会是一个空序列。比如在上面的示例中,索引下标-17代表字符串序列中倒数第17个元素,而索引下标0代表第1个元素,倒数第17个元素比第1个元素晚出现,即排在第1个元素后面,所以得到的结果是空序列。

使用负数分片时,若要使得到的分片结果包括序列结尾的元素,只需将第二个索引值设置为空即可。在交互模式下输入:

     >>> student[-17:]  #取得最后6个序号的元素
      '25,26,27,28,29,30'

在交互模式下输入:

     >>> student[66:]  #取得最后6个序号的元素
     '25,26,27,28,29,30'

由输出结果可以看出,在正数索引中将第2个索引值设置为空,会取得第1个索引下标之后的所有元素。

在交互模式下输入:

由输出结果可以看出,将分片中的两个索引都设置为空,得到的结果是整个序列值,这种操作其实等价于直接打印出该变量。

若要取一个整数序列中的所有奇数,以一个序列的形式展示出来,则不能将当前所学的方法实现了。

这里我们先引入列表的概念,简单介绍如何创建列表,关于列表的更多内容将在下一节中展开介绍。

创建列表和创建普通变量一样,用一对方括号括起来即可。列表里面可以存放数据或字符串,以逗号隔开,其中的各个对象就是列表的元素,并且下标从0开始。示例如下:

     >>> number[0: 10: 1]
     [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

由上面的示例可以看出,分片中包含另一个数字。这种方式就是步长的显式设置。看起来和隐式设置步长没有什么区别,得到的结果也和之前一样,如果将步长设置为比1大的数,那么结果会怎样呢?请看以下示例:

     >>> student[0:10:2]
     [0, 2, 4, 6, 8]

由输出结果可以看出,将步长设置为2时得到的是偶数序列。若想要得到奇数序列,则可在交互模式下进行如下设置:

     >>> student[1:10:2]
     [1, 3, 5, 7, 9]

步长设置为大于1的数时会得到一个跳过某些元素的序列。例如,上面设置的步长为2,得到的结果序列是从开始到结束,每个元素之间隔1个元素的结果序列。还可以这样使用:

除了上面的使用方式之外,还可以设置前面两个索引为空,操作如下:

     >>> student[::3]
     [0, 3, 6, 9, 12, 15, 18, 21, 24, 27, 30]

在交互模式下输入:

由输出结果可以看出,程序执行出错,错误原因是步长不能为0。

既然步长不能为0,那么步长是否可以为负数呢?请看下面的例子:

查看上面的输出结果,使用负数步长时的结果跟使用正数步长的结果是相反的。

对于正数步长,Python会从序列的头部开始从左向右提取元素,直到序列中的最后一个元素;对于负数步长,则是从序列的尾部开始从右向左提取元素,直到序列的第一个元素。正数步长必须让开始点小于结束点,否则得到的结果序列是空的;负数步长必须让开始点大于结束点,否则得到的结果序列也是空的。

2.1.3 序列相加

序列支持加法操作,使用加号可以进行序列的连接操作。在交互模式下输入:

由输出结果可以看出,数字序列可以和数字序列通过加号连接,连接后的结果还是数字序列;字符串序列也可以通过加号连接,连接后的结果还是字符串序列。

数字序列是否可以和字符串序列相加,结果又是怎样的呢?在交互模式下输入:

由输出结果可以看出,数字序列和字符串序列不能通过加号连接。错误提示的信息是:列表只能和列表相连。

2.1.4 乘法

在Python中,用一个数字n乘以一个序列会生成新的序列。在新的序列中,会将原来的序列首尾相连重复n次,得到一个新的变量值,这就是序列中的乘法。在交互模式下输入:

在Python中,若要创建一个重复序列或要重复打印某个字符串n次,则可像上面的示例一样乘以一个想要得到的序列长度的数字,这样可以快速得到需要的列表,非常方便。

空列表可以简单通过方括号([])表示,表示里面什么东西都没有。如果想创建一个占用10个或更多元素的空间,却不包括任何有用内容的列表,就可以像上面的示例一样乘以10或对应的数字,很方便。

如果要初始化一个长度为n的序列,就需要让每个编码位置上都是空值。此时可以使用None代表空值,即里面没有任何元素。None是Python的内建值,确切的含义是“这里什么也没有”。例如,在交互模式下输入:

     >>> sq=[None] * 5  #初始化sq为含有5个None的序列
     >>> sq
     [None, None, None, None, None]

2.1.5 成员资格

所谓成员资格,是指某个序列是否是另一个序列的子集,该序列是否满足成为另一个序列的成员的资格。

为了检查一个值是否在序列中,Python提供了in这个特殊的运算符。示例如下:

由上面的输出结果可以看出,使用in可以很好地检测字符或数字是否在对应的列表中。

2.1.6 长度、最小值和最大值

Python为我们提供了快速获取序列长度、最大值和最小值的内建函数,对应的内建函数分别为len、max和min。例如,在交互模式下输入如下内容:

由输出结果可以看出,len函数返回序列中所包含元素的个数(从1开始),也称为序列长度;max函数和min函数分别返回序列中值最大和值最小的元素。 eYGv4pV9tOhJJ7M2DvCWrYRdCs2wV13aWzusDWaLQPCxOU0+B27wEtNsitKlTC+g

点击中间区域
呼出菜单
上一章
目录
下一章
×