### 2.5.1 列表类型 list
列表(list)是由若干数据组成的序列(sequence)①。构成列表的数据既能作为一个整 体去参加运算,也可以作为个体去参加运算。现实世界中列表是很常见的数据,如名单、待 办事项清单、数学中的数列等都可表示为列表。Python 提供了内建类型 list 以支持列表数 据的表示和操作。
列表的表示
Python 列表类型的字面值采用如下形式:
```
[<表达式 1>, <表达式 2>, ..., <表达式 n>]
```
即用一对方括号将以逗号分隔的若干数据(表达式的值)括起来。
列表中成员的个数称为列表的长度,可以用 len()函数求得。 就像数学里有空集一样,不含任何成员的列表也是有意义的,称为空列表,用一对方括号[]表示。空列表的长度当然为 0。 可以将列表字面值赋给变量,以便将来通过变量引用该列表。 下面的语句演示了列表的类型、字面值、长度等基本概念:
```
>>> type([1,3,5,7,9])
<type 'list'>
>>> 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,其余依此类推。通 过索引操作访问列表成员的一般形式如下:
<列表>[<数值表达式>] 其中数值表达式的值就是位置索引,整个索引操作的返回结果就是索引位置上的成员。如果 索引超出了范围,则导致出错。
接着前面的例子,我们来通过索引访问列表成员:
```
>>> 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 章。
- 前言
- 第 1 章 计算与计算思维
- 1.1 什么是计算?
- 1.1.1 计算机与计算
- 1.1.2 计算机语言
- 1.1.3 算法
- 1.1.4 实现
- 1.2 什么是计算思维?
- 1.2.1 计算思维的基本原则
- 1.2.2 计算思维的具体例子
- 1.2.3 日常生活中的计算思维
- 1.2.4 计算思维对其他学科的影响
- 1.3 初识 Python
- 1.3.1 Python 简介
- 1.3.2 第一个程序
- 1.3.3 程序的执行方式
- 1.3.4 Python 语言的基本成分
- 1.4 程序排错
- 1.5 练习
- 第 2 章 用数据表示现实世界
- 2.1 数据和数据类型
- 2.1.1 数据是对现实的抽象
- 2.1.1 常量与变量
- 2.1.2 数据类型
- 2.1.3 Python 的动态类型*
- 2.2 数值类型
- 2.2.1 整数类型 int
- 2.2.2 长整数类型 long
- 2.2.3 浮点数类型 float
- 2.2.4 数学库模块 math
- 2.2.5 复数类型 complex*
- 2.3 字符串类型 str
- 2.3.1 字符串类型的字面值形式
- 2.3.2 字符串类型的操作
- 2.3.3 字符的机内表示
- 2.3.4 字符串类型与其他类型的转换
- 2.3.5 字符串库 string
- 2.4 布尔类型 bool
- 2.4.1 关系运算
- 2.4.2 逻辑运算
- 2.4.3 布尔代数运算定律*
- 2.4.4 Python 中真假的表示与计算*
- 2.5 列表和元组类型
- 2.5.1 列表类型 list
- 2.5.2 元组类型 tuple
- 2.6 数据的输入和输出
- 2.6.1 数据的输入
- 2.6.2 数据的输出
- 2.6.3 格式化输出
- 2.7 编程案例:查找问题
- 2.8 练习
- 第 3 章 数据处理的流程控制
- 3.1 顺序控制结构
- 3.2 分支控制结构
- 3.2.1 单分支结构
- 3.2.2 两路分支结构
- 3.2.3 多路分支结构
- 3.3 异常处理
- 3.3.1 传统的错误检测方法
- 3.3.2 传统错误检测方法的缺点
- 3.3.3 异常处理机制
- 3.4 循环控制结构
- 3.4.1 for 循环
- 3.4.2 while 循环
- 3.4.3 循环的非正常中断
- 3.4.4 嵌套循环
- 3.5 结构化程序设计
- 3.5.1 程序开发过程
- 3.5.2 结构化程序设计的基本内容
- 3.6 编程案例:如何求 n 个数据的最大值?
- 3.6.1 几种解题策略
- 3.6.2 经验总结
- 3.7 Python 布尔表达式用作控制结构*
- 3.8 练习
- 第 4 章 模块化编程
- 4.1 模块化编程基本概念
- 4.1.1 模块化设计概述
- 4.1.2 模块化编程
- 4.1.3 编程语言对模块化编程的支持
- 4.2 Python 语言中的函数
- 4.2.1 用函数减少重复代码 首先看一个简单的用字符画一棵树的程序:
- 4.2.2 用函数改善程序结构
- 4.2.3 用函数增强程序的通用性
- 4.2.4 小结:函数的定义与调用
- 4.2.5 变量的作用域
- 4.2.6 函数的返回值
- 4.3 自顶向下设计
- 4.3.1 顶层设计
- 4.3.2 第二层设计
- 4.3.3 第三层设计
- 4.3.4 第四层设计
- 4.3.5 自底向上实现与单元测试
- 4.3.6 开发过程小结
- 4.4 Python 模块*
- 4.4.1 模块的创建和使用
- 4.4.2 Python 程序架构
- 4.4.3 标准库模块
- 4.4.4 模块的有条件执行
- 4.5 练习
- 第 5 章 图形编程
- 5.1 概述
- 5.1.1 计算可视化
- 5.1.2 图形是复杂数据
- 5.1.3 用对象表示复杂数据
- 5.2 Tkinter 图形编程
- 5.2.1 导入模块及创建根窗口
- 5.2.2 创建画布
- 5.2.3 在画布上绘图
- 5.2.4 图形的事件处理
- 5.3 编程案例
- 5.3.1 统计图表
- 5.3.2 计算机动画
- 5.4 软件的层次化设计:一个案例
- 5.4.1 层次化体系结构
- 5.4.2 案例:图形库 graphics
- 5.4.3 graphics 与面向对象
- 5.5 练习
- 第 6 章 大量数据的表示和处理
- 6.1 概述
- 6.2 有序的数据集合体
- 6.2.1 字符串
- 6.2.2 列表
- 6.2.3 元组
- 6.3 无序的数据集合体
- 6.3.1 集合
- 6.3.2 字典
- 6.4 文件
- 6.4.1 文件的基本概念
- 6.4.2 文件操作
- 6.4.3 编程案例:文本文件分析
- 6.4.4 缓冲
- 6.4.5 二进制文件与随机存取*
- 6.5 几种高级数据结构*
- 6.5.1 链表
- 6.5.2 堆栈
- 6.5.3 队列
- 6.6 练习
- 第 7 章 面向对象思想与编程
- 7.1 数据与操作:两种观点
- 7.1.1 面向过程观点
- 7.1.2 面向对象观点
- 7.1.3 类是类型概念的发展
- 7.2 面向对象编程
- 7.2.1 类的定义
- 7.2.2 对象的创建
- 7.2.3 对象方法的调用
- 7.2.4 编程实例:模拟炮弹飞行
- 7.2.5 类与模块化
- 7.2.6 对象的集合体
- 7.3 超类与子类*
- 7.3.1 继承
- 7.3.2 覆写
- 7.3.3 多态性
- 7.4 面向对象设计*
- 7.5 练习
- 第 8 章 图形用户界面
- 8.1 图形用户界面概述
- 8.1.1 程序的用户界面
- 8.1.2 图形界面的组成
- 8.1.3 事件驱动
- 8.2 GUI 编程
- 8.2.1 UI 编程概述
- 8.2.2 初识 Tkinter
- 8.2.3 常见 GUI 构件的用法
- 8.2.4 布局
- 8.2.5 对话框*
- 8.3 Tkinter 事件驱动编程
- 8.3.1 事件和事件对象
- 8.3.2 事件处理
- 8.4 模型-视图设计方法
- 8.4.1 将 GUI 应用程序封装成对象
- 8.4.2 模型与视图
- 8.4.3 编程案例:汇率换算器
- 8.5 练习
- 第 9 章 模拟与并发
- 9.1 模拟
- 9.1.1 计算机建模
- 9.1.2 随机问题的建模与模拟
- 9.1.3 编程案例:乒乓球比赛模拟
- 9.2 原型法
- 9.3 并行计算*
- 9.3.1 串行、并发与并行
- 9.3.2 进程与线程
- 9.3.3 多线程编程的应用
- 9.3.4 Python 多线程编程
- 9.3.5 小结
- 9.4 练习
- 第 10 章 算法设计和分析
- 10.1 枚举法
- 10.2 递归
- 10.3 分治法
- 10.4 贪心法
- 10.5 算法分析
- 10.5.1 算法复杂度
- 10.5.2 算法分析实例
- 10.6 不可计算的问题
- 10.7 练习
- 第 11 章 计算+X
- 11.1 计算数学
- 11.2 生物信息学
- 11.3 计算物理学
- 11.4 计算化学
- 11.5 计算经济学
- 11.6 练习
- 附录
- 1 Python 异常处理参考
- 2 Tkinter 画布方法
- 3 Tkinter 编程参考
- 3.1 构件属性值的设置
- 3.2 构件的标准属性
- 3.3 各种构件的属性
- 3.4 对话框
- 3.5 事件
- 参考文献