系列文章
Python 从入门到精通
第 3 / 36 篇
从环境安装和基础语法出发,逐步学习工程实践、自动化、数据处理与 Web 开发。
-
01
Python 怎么装、怎么用 -
02
变量、数字和字符串 -
03
列表:把一组数据放在一起正在阅读 -
04
元组、集合和字典 -
05
条件判断:让程序做选择 -
06
循环:重复的事交给程序 -
07
函数:把代码整理成可复用的块 -
08
模块与包:拆分你的程序 -
09
输入、输出与字符串格式化 -
10
文件读写:保存程序的数据 -
11
异常处理:程序出错时怎么办 -
12
基础阶段练习:命令行记账本 -
13
类和对象:面向对象入门 -
14
继承、组合与特殊方法 -
15
迭代器与生成器 -
16
列表推导式与生成器表达式 -
17
装饰器:给函数增加能力 -
18
上下文管理器与 with -
19
类型标注与 dataclass -
20
正则表达式:从文本中找规律 -
21
日期、时间与时区 -
22
日志与调试 -
23
虚拟环境与依赖管理 -
24
测试:让修改不再提心吊胆 -
25
网络请求:用 Python 调用 API -
26
网页解析与合规采集 -
27
操作 Excel、CSV 与批量文件 -
28
SQLite:给程序加一个数据库 -
29
数据分析入门:NumPy 与 Pandas -
30
画图:把数据变得直观 -
31
Flask 入门:做一个小网站 -
32
异步编程:同时处理多项任务 -
33
线程、进程与并发选择 -
34
性能分析与优化 -
35
项目结构、配置与发布 -
36
综合项目:从需求到上线
上一篇我们认识了变量、数字和字符串——单个数据的存放。但现实里的数据很少是单个的:一个班有 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()或切片[:]
练习
- 创建一个包含 5 个你喜欢的数字的列表,分别用索引、切片取出第 2 个和最后 2 个
- 有一个成绩列表
[88, 92, 76, 59, 100],用循环找出最高分和不及格(<60)的有几个 - 思考:
a = [1, 2, 3],然后b = a[:],修改b会影响a吗?为什么切片能起到复制作用?