上一课我们用判断和循环,让程序学会了"做选择"和"反复做事"。但你有没有发现,每次处理数据,都是"一个变量存一个值":

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        # 报错!元组不能改

既然不能改,要它干嘛?两个好处:

  1. 安全:你不希望别人改的东西,用元组锁死。
  2. 能当字典的键:第 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)

九、小结

  1. 列表是"能改的收纳箱",下标从 0 开始,append/insert/pop/remove 增删。
  2. 切片是 Python 的杀手锏[起:终] 左闭右开,负数倒着数,[::-1] 倒序。
  3. 元组是"不能改的列表",更安全、能当字典键;一个元素要写成 (1,)

下一课,我们学 字典与集合——一个"按键查值"、一个"自动去重",它们底层都藏着一个叫"哈希表"的魔法,查找快到 O(1)(意思是:不管里面有几百万条,查一次的时间几乎不变)。

先把「成绩单管理」和「反转单词」敲熟,列表的手感就长在你脑子里了。

标签: none

添加新评论