ThinkChat2.0新版上线,更智能更精彩,支持会话、画图、阅读、搜索等,送10W Token,即刻开启你的AI之旅 广告
### 2.5.1 列表类型 list 列表(list)是由若干数据组成的序列(sequence)①。构成列表的数据既能作为一个整 体去参加运算,也可以作为个体去参加运算。现实世界中列表是很常见的数据,如名单、待 办事项清单、数学中的数列等都可表示为列表。Python 提供了内建类型 list 以支持列表数 据的表示和操作。 列表的表示 Python 列表类型的字面值采用如下形式: ``` [<表达式 1>, <表达式 2>, ..., <表达式 n>] ``` 即用一对方括号将以逗号分隔的若干数据(表达式的值)括起来。 列表中成员的个数称为列表的长度,可以用 len()函数求得。 就像数学里有空集一样,不含任何成员的列表也是有意义的,称为空列表,用一对方括号[]表示。空列表的长度当然为 0。 可以将列表字面值赋给变量,以便将来通过变量引用该列表。 下面的语句演示了列表的类型、字面值、长度等基本概念: ``` >>> type([1,3,5,7,9]) &lt;type 'list'&gt; >>> len([1,3,5,7,9]) 5 >>> ["list","sequence"] ['list', 'sequence'] >>> print [],len([]) [] 0 >>> x = ['apple','banana','orange'] >>> type(x) <type 'list'> ``` ![](img/程序设计思想与方法57302.png)① 列表和序列几乎是同义词,但本书对两个术语的用法做了区分。序列用作更一般的术语,列表只是序列 的特例。例如,和列表一样,字符串、元组也可视为序列的特例。 ``` >>> print x ['apple', 'banana', 'orange'] ``` 很多编程语言都提供一种称为数组(array)的数据类型,数组可以说是列表的特例。 数组的特殊之处有两点:一是固定长度,即成员个数是固定的;二是各成员是同类型的。因 此我们常说程序中定义了一个“长度为 10 的整数数组”或者“长度为 5 的字符串数组”等 等。而 Python 的列表类型没有这两条限制,不但列表长度可以动态改变,而且列表的成员 可以是不同类型的数据。例如,下面这个列表由整数、浮点数、字符串和布尔值四种类型的 数据构成: ``` >>> y = [123,"apple",3.14,True] >>> y [123, 'apple', 3.14, True] ``` 列表的成员本身也可以是列表,如: ``` >>> z = ["my favorite",["apple","pear"],3.14,[True,False]] >>> print z ['my favorite', ['apple', 'pear'], 3.14, [True, False]] ``` 计算机应用于数学计算时,经常需要表示数学中的矩阵,显然矩阵可以用以列表为成员 的列表很轻松地表示出来。例如下面的列表 m 就表示了一个 2×3 阶的矩阵: ``` >>> m = [[11,12,13],[21,22,23]] >>> print m [[11, 12, 13], [21, 22, 23]] ``` 列表的操作 为了对列表进行操作,Python 提供了列表成员的索引机制,即通过位置编号来引用列 表成员。列表中第一个成员的索引为 0,第二个成员的索引为 1,其余依此类推。也可以从 后往前编号:最后一个成员的索引是-1,倒数第二个成员的索引是-2,其余依此类推。通 过索引操作访问列表成员的一般形式如下: &lt;列表&gt;[&lt;数值表达式&gt;] 其中数值表达式的值就是位置索引,整个索引操作的返回结果就是索引位置上的成员。如果 索引超出了范围,则导致出错。 接着前面的例子,我们来通过索引访问列表成员: ``` >>> x[0] 'apple' >>> x[-1] 'orange' >>> i = 0 >>> x[i+1] 'banana' >>> x[3] Traceback (most recent call last): File "<pyshell#8>", line 1, in <module> x[3] IndexError: list index out of range >>> print y[3],y[1] True apple >>> m[0] [11, 12, 13] >>> m[0][1] 12 ``` 其中最后两个例子显示,我们可以用 m[0]来访问矩阵 m 的第一行,用 m[0][1]来访问矩 阵 m 的第一行、第二列的元素。 Python 也支持通过指定列表的一个索引区间来访问列表的“子列表”,一般形式是: ``` <列表>[开始位置:结束位置] ``` 其中开始位置和结束位置都是 int 类型的表达式,整个操作的含义是返回从开始位置到结束位置(不含)的子列表。开始位置和结束位置是可选的,在未指定的情况下,Python 默认开始位置为 0,结束位置为 n(列表长度)。仍然延续上面的例子: ``` >>> x[0:2] ['apple', 'banana'] >>> x[1:] ['banana', 'pear'] >>> x[:-1] ['apple', 'banana'] ``` 我们看到,列表的索引机制和前面学过的字符串类型很像。这一点都不奇怪,因为字符 串可以看作是列表的特例——由字符组成的列表。对字符串能执行的操作,对列表也是可以 的。因此,前面学过的字符串运算+和*,也适用于列表,可以实现列表的合并、复制操作。 例如: ``` >>> [1,3,5] + [2,4] [1, 3, 5, 2, 4] >>> 10 * [0] [0, 0, 0, 0, 0, 0, 0, 0, 0, 0] ``` 然而,列表和字符串有一个重大不同:字符串是不可更改的,而列表是可以更改的。我 们可以为列表增加成员、删除成员、改变某个成员的值等等。延续前面的例子演示如下: ``` >>> x[2] = "pear" >>> x ['apple', 'banana', 'pear'] >>> x = x + ["peach"] >>> x ['apple', 'banana', 'pear', 'peach'] >>> del x[1] >>> x ['apple', 'pear', 'peach'] ``` 以上语句首先将列表 x 的第 3 个成员从'orange'改成了'pear',然后为 x 增加了第 4 个 成员'peach',最后将 x 的第 2 个成员'banana'删除。这里 del()是 Python 的内建函数, 用于删除数据。 注意,增加、修改、删除操作除了可以像以上例子一样针对单个列表成员进行,也可以针对列表的一个片段进行。 Python 还支持对列表的许多其他操作,包括搜索列表以查找特定数据、在列表中间插 入数据、给列表排序等等,将在第 6 章中介绍。 range()函数 Python 语言提供了一个内建函数 range(),用于产生整数列表。我们在第 1 章中已经 见到它的用法,这里给出其完整的用法介绍。 range()的一般形式是: range(<起点>, <终点>, <步长>) 返回结果是从起点到终点的有序整数列表,各整数之间以步长为差。要特别注意一点,终点 的含义是说列表中的整数不得超过终点,但它本身是不包含在列表当中的,对此初学者很容 易犯错。另外,起点或步长是可以省略的,它们的缺省值分别是 0 和 1。因此,range 函数 的使用方式有以下三种: ``` range(n):产生整数列表[0,1,2,...,n-1] range(i,j):产生整数列表[i,i+1,i+2, ..., j-1] range(i,j,s):产生整数列表[i,i+s,i+2s,...] ``` 其中第三种形式的返回结果取决于步长 s,不一定以 j-1 作为最后一个成员。 下面看几个例子: ``` >>> range(10) [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] >>> range(5,10) [5, 6, 7, 8, 9] >>> range(1,10,2) [1, 3, 5, 7, 9] >>> range(10,0,-3) [10, 7, 4, 1] >>> range(1,1) [] ``` 从例中可见,当步长为正数时产生递增的列表,当步长为负数时产生递减的列表。最后一个 例子表明,如果没有满足条件的整数(从 1 开始并且小于 1 的整数是不存在的),则产生空 列表。 range()函数常和 for 循环语句连用,详见第 3 章。