1.7 序列

序列(Sequence)是一种可迭代的1、元素有序、可以重复出现的数据结构。序列可以通过索引访问元素。图1-11所示的是一个班级序列,其中有一些学生,这些学生是有序号的,即他们被放到序列中的顺序,可以通过序号访问他们。这就像老师给进入班级的人分配学号,第一个报到的是张三,老师给他分配的是“0”,第二个报到的是李四,老师给他分配的是“1”,以此类推,最后一个序号应该是“学生人数-1”。

图1-11 序列

序列包括的结构有列表、字符串、元组、范围和字节序列。序列可进行的操作有索引、切片、加和乘。

1.7.1 索引操作

序列中第一个元素的索引是“0”,其他元素的索引是第一个元素的偏移量。可以有正偏移量,称为正向索引;也可以有负偏移量,称为反向索引。正向索引的最后一个元素索引是“序列长度-1”,反向索引的最后一个元素索引是“-1”。例如“Hello”字符串,它的正向索引如图1-12(a)所示,反向索引如图1-12(b)所示。

图1-12 索引

序列中的元素是通过索引下标访问的,即中括号[index]方式访问。

示例代码如下。

示例代码运行后,输出结果如下。

代码解释如下。

代码第①行声明字符串变量a,它是一个列表类型。

代码第②行a[0]表达式获得字符串的第1个元素。

代码第③行a[-1]表达式获得反向索引返回“-1”是字符串的最后一个元素。

代码第④行a[5]表达式执行时会发送错误“IndexError”,这是索引越界错误。

1.7.2 序列切片

序列的切片(Slicing)就是从序列中切分出小的子序列。切片使用切片运算符,切片运算符有以下两种形式。

[start: end]:start是开始索引,end是结束索引。

[start: end: step]:start是开始索引,end是结束索引,step是步长,步长是在切片时获取元素的间隔。步长可以是正整数,也可以是负整数。

提示 切下的切片包括start位置的元素,但不包括end位置的元素,start和end都可以省略。

切片示例代码如下。

代码解释如下。

代码第①行表达式a[1:3]是切出1~3的子字符串,注意不包括3,所以结果是el。

代码第②行表达式a[:3]省略了开始索引,默认开始索引是0,所以a[:3]与a[0:3]切片的结果是一样的。

代码第③行表达式a[0:]省略了结束索引,默认结束索引是序列的长度,即5,所以a[0:]与a[0:5]切片的结果是一样的。

代码第④行表达式a[1:-1]使用了反向索引,对照图1-12(b),不难计算出a[1:-1]的结果是ell。

代码第⑤行表达式a[1:5]省略了步长参数,步长默认值是1。表达式a[1:5:2]的步长为2,结果是el。

代码第⑥行表达式a[0:3:3]步长为3,切片的结果是H字符。

代码第⑦行表达式a[::-1]切片的步长为负数,步长负数时是从右往左获取元素,所以a[::-1]的切片结果是原始字符串的倒置。

注意 步长与当次元素索引、下次元素索引之间的关系如下:

下次元素索引 = 当次元素索引 + 步长

1.7.3 可变序列——列表

列表(List)是一种具有可变性的序列结构,我们可以追加、插入、删除和替换列表中的元素。可以使用以下两种方式创建列表。

使用中括号[]将元素括起来,元素之间用逗号分隔。

list([iterable])函数。

示例代码如下。

示例代码运行后,输出结果如下。

代码解释如下。

代码第①行通过元素之间用逗号分隔创建列表对象。

代码第②行创建列表对象L2,它是字符串和数字混合的列表对象,可见列表中的元素没有对数据类型进行要求,只要是对象都可以放到列表中。

代码第③行通过list函数创建列表对象。

代码第④行创建只有一个元素的列表,注意中括号不能省略。

代码第⑤行还是创建只有一个元素的列表,只是最后一个元素的逗号没有省略,如果省略则与代码第④行的形式一样。

代码第⑥行通过type函数可以获得当前数据对象的数据类型,列表的对象数据类型是list。

代码第⑦行通过列表对象的append函数追加元素。

代码第⑧行通过列表对象的remove函数删除元素。

1.7.4 不可变序列——元组

元组(Tuple)是一种不可变序列结构,一旦创建就不能修改。元组可以使用以下两种方式创建。

使用逗号“,”分隔元素。

使用tuple([iterable])函数。

示例代码如下。

示例代码运行后,输出结果如下。

代码解释如下。

代码第①行是使用逗号分隔元素创建元组对象,创建元组时使用小括号把元素括起来不是必需的。

代码第②行也是使用逗号分隔元素创建元组对象。

代码第③行创建了字符串和整数混合的元组。Python中没有强制声明数据类型,因此元组中的元素可以是任何数据类型。

代码第④行使用了tuple([iterable])函数创建元组对象,参数iterable可以是任何可迭代对象,实参[21,32,43,45]是一个列表,因为列表是可迭代对象,所以可以使用tuple()函数参数创建元组对象。

1.7.5 列表推导式

Python中有一种特殊表达式——推导式,它可以将一种数据结构作为输入,经过过滤、映射等计算处理,最后输出另一种数据结构。根据数据结构的不同可分为列表推导式、集合推导式和字典推导式。本节先介绍列表推导式。

如果想获得0~9中偶数的平方数列,可以通过for循环实现,示例代码如下。

示例代码运行后,输出结果如下。

代码解释如下。

代码第①行创建空列表对象。

代码第②行range函数创建0~9范围数列。

代码第③行判断当前元素是不是偶数。

代码第④行中表达式(x ** 2)是计算当前元素的平方。

通过列表推导式实现,示例代码如下。

其中代码第①行就是列表推导式,输出的结果与for循环是一样的。图1-13所示是列表推导式的语法结构,其中in后面的表达式是“输入序列”,for前面的表达式是“输出表达式”,它的运算结果会保存在一个新列表中;if条件语句用来过滤输入序列,符合条件的才传递给输出表达式,“条件语句”是可以省略的,所有元素都传递给输出表达式。

图1-13 列表推导式

示例代码运行后,输出结果如下。

条件语句可以包含多个条件,例如找出0~99中可以被5整除的偶数数列,示例代码如下。

列表推导式的条件语句有两个if x % 2 == 0和if x % 5 == 0,可见它们之间是“与”的关系。

示例代码运行后,输出结果如下。

1 可迭代(iterable),是指它的成员能返回一次的对象。