系列文章

Python 从入门到精通

第 3 / 12 篇

从环境安装和基础语法出发,逐步学习工程实践、自动化、数据处理与 Web 开发。

  1. 01
    Python 怎么装、怎么用
  2. 02
    变量、数字和字符串
  3. 03
    列表:把一组数据放在一起正在阅读
  4. 04
    元组、集合和字典
  5. 05
    条件判断:让程序做选择
  6. 06
    循环:重复的事交给程序
  7. 07
    函数:把代码整理成可复用的块
  8. 08
    模块与包:拆分你的程序
  9. 09
    输入、输出与字符串格式化
  10. 10
    文件读写:保存程序的数据
  11. 11
    异常处理:程序出错时怎么办
  12. 12
    基础阶段练习:命令行记账本

查看整个系列 →

上一篇我们认识了变量、数字和字符串——单个数据的存放。但现实里的数据很少是单个的:一个班有 40 个学生,一个月的账单有 30 条记录。这时候就需要一种能装下一组数据的东西,Python 里最常用的就是列表(list)

创建列表

列表用方括号 [] 包起来,里面的元素用逗号隔开。元素可以是任何类型,混着放也行:

students = ["小明", "小红", "小刚"]
scores = [92, 85, 78, 100]
mixed = ["南山", 2026, 3.14, True]  # 字符串、整数、浮点数、布尔值混装
empty = []  # 空列表

索引:从 0 开始数

要取列表里的某个元素,用索引。注意!Python 的索引从 0 开始,这是新手最容易错的地方:

students = ["小明", "小红", "小刚"]
print(students[0])  # 小明(第 1 个)
print(students[1])  # 小红(第 2 个)
print(students[2])  # 小刚(第 3 个)
print(students[-1]) # 小刚(-1 是最后一个,倒着数)
print(students[-2]) # 小红

索引越界会报 IndexError: list index out of range——记住列表有 3 个元素,能用的索引是 0、1、2(和 -1、-2、-3)。

切片:取一段

用冒号可以取一段连续的元素,结果是新列表

nums = [10, 20, 30, 40, 50]
print(nums[1:3])   # [20, 30](从索引 1 到 2,不含 3)
print(nums[:2])    # [10, 20](从头到索引 1)
print(nums[2:])    # [30, 40, 50](从索引 2 到结尾)
print(nums[:])     # 整个列表的副本
print(nums[::2])   # [10, 30, 50](步长为 2,跳着取)

切片是左闭右开:[1:3] 包含索引 1 和 2,不包含 3。这个规则贯穿 Python 始终。

增删改

列表是可变的,随时可以改:

tasks = ["写代码", "测试"]
tasks.append("发布")      # 末尾追加 → ["写代码", "测试", "发布"]
tasks.insert(1, "复查")   # 插到索引 1 → ["写代码", "复查", "测试", "发布"]
tasks[0] = "写文档"        # 改第 1 个 → ["写文档", "复查", "测试", "发布"]
tasks.remove("测试")       # 删除指定值(只删第一个匹配)
popped = tasks.pop()       # 删除并返回末尾元素 → "发布"
del tasks[0]               # 按下标删除 → ["复查"]
print(tasks)

remove 删的是pop/del 删的是位置。如果 remove 的值不存在,会报 ValueError

常用操作

nums = [3, 1, 4, 1, 5]
print(len(nums))      # 5(长度)
print(sum(nums))      # 14(求和,数字列表专用)
print(max(nums))      # 5
print(min(nums))      # 1
nums.sort()           # 原地排序 → [1, 1, 3, 4, 5]
nums.reverse()        # 原地反转
print(sorted(nums))   # 返回新排序列表(不改变原列表)
print(3 in nums)      # True(判断是否包含)
print(nums.count(1))  # 2(统计出现次数)

注意 sort()原地修改并返回 None,sorted() 返回新列表。这俩别混。

遍历:for 循环

处理列表最常用的方式就是 for 循环,逐个取出来用:

students = ["小明", "小红", "小刚"]
for name in students:
    print(f"{name} 来了")

输出:

小明 来了
小红 来了
小刚 来了

想同时拿到下标和值,用 enumerate

for i, name in enumerate(students):
    print(f"第{i + 1}个:{name}")

嵌套列表

列表里可以装列表,就像表格:

matrix = [
    [1, 2, 3],
    [4, 5, 6],
    [7, 8, 9],
]
print(matrix[0])     # [1, 2, 3](第一行)
print(matrix[1][2])  # 6(第二行第三个)
for row in matrix:
    for cell in row:
        print(cell, end=" ")
    print()

新手坑

坑 1:把列表赋给另一个变量,改一个另一个也变。

a = [1, 2, 3]
b = a          # 不是复制!b 和 a 指向同一个列表
b.append(4)
print(a)       # [1, 2, 3, 4] 也变了!
c = a.copy()   # 浅拷贝(嵌套列表时内部对象仍共享)
c.append(5)
print(a)       # [1, 2, 3, 4] 不受影响

坑 2:遍历时删除元素会跳项。

nums = [1, 2, 3, 4, 5]
for n in nums:
    if n % 2 == 0:
        nums.remove(n)
print(nums)  # [1, 3, 5]?不对,是 [1, 3, 5] 碰巧对了,但换个数据就出错

正确做法:遍历副本,改原列表:

nums = [1, 2, 3, 4, 5, 6]
nums = [n for n in nums if n % 2 != 0]  # 或用列表推导式
print(nums)  # [1, 3, 5]

小结

  • 列表用 [],元素逗号分隔,可混装任意类型
  • 索引从 0 开始,-1 是倒数第一个
  • 切片 [start:end] 左闭右开,返回新列表
  • 增:append/insert;删:remove/pop/del;改:直接下标赋值
  • sort() 原地排序,sorted() 返回新列表
  • 赋值不复制!要复制用 .copy() 或切片 [:]

练习

  1. 创建一个包含 5 个你喜欢的数字的列表,分别用索引、切片取出第 2 个和最后 2 个
  2. 有一个成绩列表 [88, 92, 76, 59, 100],用循环找出最高分和不及格(<60)的有几个
  3. 思考:a = [1, 2, 3],然后 b = a[:],修改 b 会影响 a 吗?为什么切片能起到复制作用?