序列(sequence)是一种可迭代的
、元素有序、可以重复出现的数据结构。序列可以通过索引访问元素。图2-11所示的是一个班级序列,其中有一些学生,这些学生是有序的,顺序是他们被放到序列中的顺序,可以通过序号访问他们。这就像老师给进入班级的人分配学号,第一个报到的是张三,老师给他分配的是0;第二个报到的是李四,老师给他分配的是1,以此类推,最后一个序号应该是“学生人数-1”。
图2-11 序列
序列包括的结构有列表(list)、字符串(str)、元组、范围(range)和字节序列(bytes)。序列可进行的操作有索引、切片、加和乘。
序列中第一个元素的索引是0,其他元素的索引是第一个元素的偏移量。可以有正偏移量,称为正向索引;也可以有负偏移量,称为反向索引。正向索引的最后一个元素索引是序列长度-1,反向索引最后一个元素索引是-1。例如Hello字符串,它的正向索引如图2-12(a)所示,反向索引如图2-12(b)所示。
图2-12 索引
序列中的元素是通过索引下标访问的,即通过中括号[index]方式访问。
示例代码如下。
示例代码运行后,输出结果如下。
代码解释如下。
·代码第①行声明字符串变量a,它是一个列表类型。
·代码第②行a[0]表达式获得字符串的第1个元素。
·代码第③行a[-1]表达式获得反向索引,返回-1是指字符串的最后一个元素。
·代码第④行a[5]表达式执行时会发送错误IndexError,这是索引越界错误。
序列的切片(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]使用了反向索引,对照图2-12,不难计算出a[1:-1]的结果是ell。
·代码第⑤行表达式a[1:5]省略了步长参数,步长默认值是1。表达式a[1:5:2]步长为2,结果是el。
·代码第⑥行表达式a[0:3:3]步长为3,切片结果是H字符。
·代码第⑦行表达式a[::-1]切片的步长为负数,步长负数时是从右往左获取元素,所以a[::-1]切片的结果是原始字符串的倒置。
提示
步长与当次元素索引、下次元素索引之间的关系如下。
下次元素索引=当次元素索引+步长
列表(list)是一种具有可变性的序列结构,我们可以追加、插入、删除和替换列表中的元素。列表可以使用两种方式创建。
·使用中括号[]将元素括起来,元素之间用逗号分隔。
·使用list([iterable])函数。
示例代码如下。
示例代码运行后,输出结果如下。
代码解释如下。
·代码第①行通过元素之间用逗号分隔创建列表对象。
·代码第②行创建列表对象L2,它是字符串和数字混合的列表对象,可见列表中的元素没有对数据类型进行要求,只要是对象都可以放到列表中。
·代码第③行通过list函数创建列表对象。
·代码第④行创建只有一个元素的列表,注意中括号不能省略。
·代码第⑤行还是创建只有一个元素的列表,只是最后一个元素的逗号没有省略,省略后与代码第④行形式一样。
·代码第⑥行type函数可以获得当前数据对象的数据类型,列表的对象数据类型是list。
·代码第⑦行通过列表对象的append函数追加元素。
·代码第⑧行通过列表对象的remove函数删除元素。
元组(tuple)是一种不可变序列结构,一旦创建就不能修改。元组可以使用两种方式创建。
·使用逗号“,”分隔元素。
·使用tuple([iterable])函数。
示例代码如下。
示例代码运行后,输出结果如下。
代码解释如下。
·代码第①行是使用逗号分隔元素创建元组对象,创建元组时,使用小括号把元素括起来不是必需的。
·代码第②行也是使用逗号分隔元素创建元组对象。
·代码第③行创建了字符串和整数混合的元组。Python中没有强制声明数据类型,因此元组中的元素可以是任何数据类型。
·代码第④行使用了tuple([iterable])函数创建元组对象,参数iterable可以是任何可迭代对象,实参[21,32,43,45]是一个列表,因为列表是可迭代对象,所以可以使用tuple()函数参数创建元组对象。
Python中有一种特殊表达式——推导式,它可以将一种数据结构作为输入,经过过滤、映射等计算处理,最后输出另一种数据结构。根据数据结构的不同,可分为列表推导式、集合推导式和字典推导式。本小节先介绍列表推导式。
如果想获得0~9中偶数的平方数列,可以通过for循环实现,代码如下。
代码解释如下。
·代码第①行创建空列表对象。
·代码第②行range函数创建0~9范围数列。
·代码第③行判断当前元素是否是偶数。
·代码第④行中表达式(x ** 2)是计算当前元素的平方。
通过列表推导式实现,代码如下。
其中代码第①行就是列表推导式,输出的结果与for循环是一样的。图2-13所示的是列表推导式的语法结构,其中in后面的表达式是“输入序列”;for前面的表达式是“输出表达式”,它的运算结果会保存在一个新列表中;if条件语句用来过滤输入序列,符合条件的才传递给输出表达式,“条件语句”是可以省略的,所有元素都传递给输出表达式。
图2-13 列表推导式
条件语句可以包含多个条件,例如找出0~99可以被5整除的偶数数列,实现代码如下。
列表推导式的条件语句有两个,即if x% 2==0和if x% 5==0,可见它们“与”的关系。