【Python基础:语法第四课】列表和元组——Python 里的“爱情”:列表善变,元组长情
大家好!欢迎来到 Python 基础语法第四课。今天我们聊一个超级有趣又实用的主题:列表(List) 和 元组(Tuple)。为了让小白也能轻松记住,我用一个浪漫的比喻来讲解——
列表就像谈恋爱时善变的女朋友:想加点新爱好、删掉旧习惯、随时修改计划,都可以!
元组就像结婚后长情的伴侣:一旦确定下来,就一辈子不变,安全可靠,值得信赖!
这个比喻能帮你瞬间记住它们的本质区别:列表可变,元组不可变。下面我们一步步深入,吃透它们的所有用法!
1. 列表(List)——善变的“女朋友”
定义:用方括号 [] 包裹,用逗号分隔元素。
# 创建列表
girlfriend_hobbies = ["购物", "追剧", "旅游", "美食"]
scores = [88, 92, 85, 99, 76]
mixed = ["Alice", 25, True, 3.14] # 可以混放各种类型!
empty_list = []
核心特点:可变(能增、删、改)
| 操作 | 代码示例 | 解释 |
|---|---|---|
| 修改元素 | girlfriend_hobbies[1] = “刷短视频” | 把第2个爱好改了 |
| 添加元素 | girlfriend_hobbies.append(“健身”) | 加一个新爱好到末尾 |
| 插入元素 | girlfriend_hobbies.insert(0, “睡觉”) | 在开头插入 |
| 删除元素 | girlfriend_hobbies.remove(“购物”) | 删除指定值(第一个匹配的) |
| 弹出元素 | popped = girlfriend_hobbies.pop() | 删除并返回最后一个(默认) |
| 按索引删除 | del girlfriend_hobbies[2] | 删除指定位置 |
| 清空列表 | girlfriend_hobbies.clear() | 变回空列表 [] |
切片操作(超级强大!)
numbers = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
print(numbers[2:6]) # [2, 3, 4, 5] 从索引2到5
print(numbers[:5]) # [0, 1, 2, 3, 4] 前5个
print(numbers[5:]) # [5, 6, 7, 8, 9] 从第5个到最后
print(numbers[::2]) # [0, 2, 4, 6, 8] 每隔一个取
print(numbers[::-1]) # [9, 8, 7, ..., 0] 反转列表!太好用了
列表推导式(优雅又高效)
# 普通写法要好几行
squares = []
for x in range(10):
squares.append(x**2)
# 列表推导式一行搞定!
squares = [x**2 for x in range(10)] # [0, 1, 4, 9, ..., 81]
evens = [x for x in range(20) if x % 2 == 0] # 所有偶数
names = ["alice", "BOB", "Charlie"]
upper_names = [name.capitalize() for name in names] # ["Alice", "Bob", "Charlie"]
2. 元组(Tuple)——长情的“伴侣”
定义:用圆括号 () 包裹,逗号分隔。
# 创建元组
boyfriend = ("老实", "靠谱", "专一", "会做饭")
coordinates = (116.397428, 39.90923) # 北京坐标
single = (520,) # 只有一个元素时,必须加逗号!
empty_tuple = ()
核心特点:不可变(创建后不能修改)
- 不能增、删、改元素 → 试图修改会报错
TypeError: 'tuple' object does not support item assignment - 但如果元组里包含列表等可变对象,那个对象本身还是可以改的(小心!)
为什么用元组?
- 更安全:数据不会被意外修改
- 更快:访问速度比列表略快,内存占用更少
- 可以作为字典的 key(列表不行!)
- 函数返回多个值时,实际上返回的就是元组
元组最优雅的用法:解包(Unpacking)
# 普通赋值
x = coordinates[0]
y = coordinates[1]
# 元组解包(超级好用!)
x, y = coordinates # x=116.397428, y=39.90923
# 交换变量(Python 独有神技)
a = 1
b = 2
a, b = b, a # 交换完成!不用临时变量
# 函数返回多个值
def get_person_info():
return "王小明", 28, "程序员", "北京"
name, age, job, city = get_person_info()
print(f"{name} 是 {job},今年 {age} 岁,住在 {city}")
# 忽略某些值用 _
name, _, job, _ = get_person_info()
3. 列表 vs 元组 对比表(一图记住)
| 特性 | 列表 [](善变) | 元组 ()(长情) |
|---|---|---|
| 可变性 | 可变(增删改) | 不可变(只读) |
| 定义符号 | 方括号 [] | 圆括号 () |
| 单元素写法 | [520] | (520,) 必须加逗号! |
| 性能 | 稍慢(支持修改) | 更快、更省内存 |
| 是否可做 dict key | 不可以 | 可以! |
| 典型场景 | 需要频繁修改的数据 | 固定不变的数据、坐标、配置 |
| 支持推导式 | 支持 | 支持(但常用生成器表达式) |
4. 实战小案例:用列表和元组管理学生信息
# 用列表存储所有学生(可以增删学生)
students = []
# 每个学生用元组存储(信息确定后不再改)
students.append(("张三", 18, "男", 95.5))
students.append(("李四", 19, "女", 88.0))
students.append(("王五", 17, "男", 92.5))
# 计算平均分
scores = [student[3] for student in students] # 列表推导取出所有分数
average = sum(scores) / len(scores)
print(f"班级平均分:{average:.2f}")
# 找出最高分学生
top_student = max(students, key=lambda s: s[3])
name, age, gender, score = top_student # 元组解包
print(f"最高分:{name} ({score}分)")
5. 总结与记忆口诀
口诀:
- 列表方括号,爱改爱折腾;元组圆括号,长情不动情。
- 要变用列表,不变用元组;函数多返回值,解包真好用!
掌握了列表和元组,你就拥有了 Python 中处理序列数据的两大神器。它们几乎出现在所有程序里:配置文件用元组、动态数据用列表、函数返回用元组解包……
下一课我们将继续聊 字典和集合——Python 的“社交达人”和“黑名单”系统,敬请期待!
动手练习建议:
- 用列表实现一个简单的待办事项(Todo List)管理程序。
- 用元组存储几个城市的经纬度,然后计算两个城市之间的简单距离。
加油!Python 的世界越来越精彩了!❤️