认识复合数据类型:列表(list)
在编写程序时,我们不仅需要处理单个数字或单个字符串,更需要把多个相关的数据归拢在一个整体中进行管理——比如一系列用户名字、一段文章分词后的单词序列,或者一次测量的温度记录。在 Python 中,最基础且常用的复合数据类型就是列表(list)。
列表用方括号 [...] 标示,里面的各个元素之间用逗号 , 隔开:
>>> squares = [1, 4, 9, 16, 25]
>>> squares
[1, 4, 9, 16, 25]
列表里的元素可以是相同类型(如全都是整数),也可以混合存放不同类型(整数、浮点数、字符串等),但在实际工程中,通常同一个列表装载相同含义的数据。
列表的索引与切片
列表与字符串一样,都是 Python 内置的**序列(sequence)**类型。因此,在上一关中学到的所有索引与切片规则,在列表中完全通用:
>>> fruits = ['apple', 'banana', 'orange', 'grape']
>>> fruits[0] # 访问 0 号位元素(第 1 个)
'apple'
>>> fruits[-1] # 访问倒数第 1 个元素
'grape'
>>> fruits[1:3] # 切片截取下标 1(含)到 3(不含)产生新列表
['banana', 'orange']
>>> fruits + ['pear', 'peach'] # 列表支持使用 + 进行拼接合并
['apple', 'banana', 'orange', 'grape', 'pear', 'peach']
使用内置函数 len(),可以随时获取列表中包含的元素数量:
>>> len(fruits)
4
核心区别:列表是可变(mutable)的
回顾上一关,我们试图通过 word[0] = 'J' 更改字符串中的字符时,Python 坚决报错,因为字符串是不可变的(immutable)。
然而,列表是可变(mutable)类型!这意味着列表在内存中一旦创建,其内部各个位置的元素都可以随时被替换修改。
官方教程给出了一个非常典型的例子:
>>> cubes = [1, 8, 27, 65, 125] # 这里显然算错了一个数:4 的立方是 64,而不是 65
>>> 4 ** 3
64
>>> cubes[3] = 64 # 直接把下标 3(第 4 个位置)的值替换为正确数字
>>> cubes
[1, 8, 27, 64, 125]
只需使用 列表[索引] = 新值,就能直接实现原地替换。
动态追加元素:append() 方法
很多时候,我们无法在一开始就预知列表的全部内容,而是在程序运行计算过程中逐步往列表里塞入新数据。列表对象内置了一个极其重要的方法(method):append()。
方法是“从属于某个具体对象”的专用函数,调用语法为 对象.方法名(参数)。
append() 的作用是在列表的最末尾追加一个新元素:
>>> cubes.append(216) # 添加 6 的立方
>>> cubes.append(7 ** 3) # 添加 7 的立方 (343)
>>> cubes
[1, 8, 27, 64, 125, 216, 343]
请注意:append() 是在列表自身内部原地修改,它不会返回一个新列表。
列表切片赋值与嵌套
通过对切片进行赋值,甚至可以批量修改某一段区域,或者彻底清空列表:
>>> letters = ['a', 'b', 'c', 'd', 'e', 'f', 'g']
>>> letters[2:5] = ['C', 'D', 'E'] # 替换下标 2 到 4 的元素
>>> letters
['a', 'b', 'C', 'D', 'E', 'f', 'g']
>>> letters[2:5] = [] # 移除这一段元素
>>> letters
['a', 'b', 'f', 'g']
>>> letters[:] = [] # 用空列表替换所有切片,彻底清空列表
>>> letters
[]
列表还可以相互嵌套(包含其他列表),形成二维或树状数据结构:
>>> a = ['a', 'b', 'c']
>>> n = [1, 2, 3]
>>> x = [a, n]
>>> x
[['a', 'b', 'c'], [1, 2, 3]]
>>> x[0]
['a', 'b', 'c']
>>> x[0][1]
'b'
走向编程的第一步:while 循环与多重赋值
除了简单运算与数据收集,我们还可以让 Python 完成更复杂的自动化任务。官方教程在第 3 章结尾展示了生成**斐波那契数列(Fibonacci series)**的经典例子:
>>> # 斐波那契数列:前两项之和即下一项的值
>>> a, b = 0, 1
>>> while a < 10:
... print(a)
... a, b = b, a + b
...
0
1
1
2
3
5
8
这段简洁优美的代码揭示了几个重要的编程基石:
- 多重赋值(Multiple Assignment):
a, b = 0, 1同时将变量a设为0、b设为1。在循环体内的a, b = b, a + b中,右侧表达式b与a + b是在任何赋值发生之前先同时计算求值的,随后再分别赋给左侧的a和b。这使得交换数值或同时更新状态极为安全便捷。 while条件循环: 只要while后面的条件(如a < 10)结果为真(True),缩进代码块就会反复执行;一旦条件变为假(False),循环立刻停止。- 冒号与代码块缩进:
while a < 10:行末的冒号宣告代码块的开始,下方属于循环体的每一行必须严格向右缩进(4 个空格)。 - 控制输出格式:
print()函数可以使用关键字参数end来改变输出结尾(默认是换行符)。例如print(a, end=' ')会在数字间输出一个空格而不换行,将结果整齐地输出在同一行。
至此,我们不仅掌握了数字、字符串与列表三种最核心的数据形态,还初窥了让程序自动重复运转的循环机制。在下一关中,我们将全面学习 Python 强大的流程控制工具集!