Python 从零开始 · 第 4 课:列表与元组——一次存一堆数据
上一课我们用判断和循环,让程序学会了"做选择"和"反复做事"。但你有没有发现,每次处理数据,都是"一个变量存一个值":
name1 = "张三"
name2 = "李四"
name3 = "王五"三个人的名字,就要写三个变量。那要是全班 50 个人、全校 5000 人呢?难道写 5000 个变量?显然不行。
我们需要的是一种东西,能用一个名字,装下一大堆数据。这就是这一课的主角——列表(list)。
一、列表:一个能装一堆东西的"收纳箱"
列表是 Python 里最常用的容器,用方括号 [] 表示,里面可以放任意多个数据,用逗号隔开:
names = ["张三", "李四", "王五"]
scores = [90, 85, 78, 92]
mixed = [1, "hello", 3.14, True] # 甚至能混着放不同类型
empty = [] # 空列表列表里的每个数据叫一个元素,每个元素有固定的位置编号(下标),从 0 开始数。
["张三", "李四", "王五"]
0 1 2记住:下标从 0 开始,这是程序员世界的铁律。第一个元素是0,不是1。
二、按下标读写:直接拿、直接改
names = ["张三", "李四", "王五"]
print(names[0]) # 张三
print(names[2]) # 王五
names[1] = "赵六" # 直接改下标 1 的元素
print(names) # ['张三', '赵六', '王五']列表是"能改的"(专业词叫可变 mutable),所以可以直接 names[1] = ... 这样赋值改内容。
三、增删:往里加、往外拿
加元素:
nums = [1, 2, 3]
nums.append(4) # 在末尾追加
print(nums) # [1, 2, 3, 4]
nums.insert(1, 99) # 在下标 1 处插入 99,后面的自动往后挪
print(nums) # [1, 99, 2, 3, 4]删元素:
nums = [1, 99, 2, 3, 4]
nums.pop() # 弹出末尾(返回被删的那个)
nums.pop(1) # 弹出下标 1 的元素
nums.remove(2) # 按"值"删除(删掉第一个值为 2 的)
del nums[0] # 按"下标"删除pop()按位置删,remove()按值删,del按位置删。别混。
四、切片:一次拿一段
切片(slice)是 Python 最优雅的特性之一,用 [起点:终点] 拿一段,含起点、不含终点(左闭右开):
nums = [0, 1, 2, 3, 4, 5, 6]
print(nums[2:5]) # [2, 3, 4] 下标 2 到 4(不含 5)
print(nums[:3]) # [0, 1, 2] 从头到下标 2
print(nums[4:]) # [4, 5, 6] 从下标 4 到末尾
print(nums[-1]) # 6 负数下标:从右往左数,-1 是最后一个
print(nums[::2]) # [0, 2, 4, 6] 步长为 2,隔一个取一个
print(nums[::-1]) # [6, 5, 4, 3, 2, 1, 0] 倒序切片口诀:左闭右开,负数倒着数,第三个是步长。
五、遍历列表:配合 for 循环
第 3 课学的 for 循环,天生就是用来遍历列表的:
names = ["张三", "李四", "王五"]
for name in names:
print(f"你好,{name}")如果想同时拿到"下标"和"值",用 enumerate:
for i, name in enumerate(names):
print(i, name)
# 0 张三
# 1 李四
# 2 王五六、列表常用方法:一行搞定
nums = [3, 1, 2]
nums.sort() # 原地排序(升序)
nums.sort(reverse=True) # 降序
len(nums) # 3,元素个数
min(nums) # 1
max(nums) # 3
sum(nums) # 6
3 in nums # True,判断"在不在"
nums.index(2) # 1,第一次出现 2 的下标
nums.count(1) # 1,1 出现了几次七、元组:不能改的列表
元组(tuple)和列表几乎一模一样,唯一的区别是——它不能改(专业词叫不可变 immutable)。用圆括号 ():
point = (3, 5)
print(point[0]) # 3
# point[0] = 9 # 报错!元组不能改既然不能改,要它干嘛?两个好处:
- 安全:你不希望别人改的东西,用元组锁死。
- 能当字典的键:第 5 课会讲到,字典的键必须是"不可变"的,元组可以、列表不行。
小坑:只有一个元素的元组,要加个逗号(1,),否则(1)只是个普通数字 1。
八、动手时间 🎯
实验 1:成绩单管理
scores = []
while True:
s = input("输入成绩(输入 q 结束):")
if s == "q":
break
scores.append(int(s)) # 转成数字再存
print("共", len(scores), "人")
print("平均分:", sum(scores) / len(scores))
print("最高分:", max(scores))
print("排序:", sorted(scores))实验 2:反转一句话里的单词
sentence = "Python is fun"
words = sentence.split() # 按空格切成列表
words.reverse() # 反转
print(" ".join(words)) # 再拼回字符串
# 输出: fun is Python实验 3:用列表推导式(挑战)
squares = [x * x for x in range(1, 11)] # 1 到 10 的平方
print(squares)
# [1, 4, 9, 16, 25, 36, 49, 64, 81, 100]
evens = [x for x in range(1, 21) if x % 2 == 0] # 1~20 里的偶数
print(evens)九、小结
- 列表是"能改的收纳箱",下标从 0 开始,
append/insert/pop/remove增删。 - 切片是 Python 的杀手锏:
[起:终]左闭右开,负数倒着数,[::-1]倒序。 - 元组是"不能改的列表",更安全、能当字典键;一个元素要写成
(1,)。
下一课,我们学 字典与集合——一个"按键查值"、一个"自动去重",它们底层都藏着一个叫"哈希表"的魔法,查找快到 O(1)(意思是:不管里面有几百万条,查一次的时间几乎不变)。
先把「成绩单管理」和「反转单词」敲熟,列表的手感就长在你脑子里了。