百宝袋:列表
一个盒子里装一串东西
这节课你要学会
1. 用列表一次装一堆东西;2. 按编号取出和修改;3. 添加和删除;4. 列表和 for 循环联手——这对黄金搭档后面天天用。
一串东西装进一个盒子
之前每个盒子只能装一样东西:name = "小明"。可是想装全班同学的名字呢?开 40 个盒子太傻了。用列表——把一串东西装进同一个盒子,用方括号 [],中间用逗号隔开:
friends = ["小明", "小红", "小刚", "小雨"]
print(friends)
print(len(friends)) # len = 长度,数数有几个
['小明', '小红', '小刚', '小雨'] 4
len()(读作"len")能数出列表里有几个东西,就像点货。
按编号取东西
列表里的每个东西都有自己的编号。喊编号就能取出来:
friends = ["小明", "小红", "小刚", "小雨"]
print(friends[0])
print(friends[1])
print(friends[3])
小明 小红 小雨
又是从 0 开始!
第五课的 range 你已经领教过了:列表的编号也从 0 开始。第 1 个是 [0],第 2 个是 [1],第 4 个是 [3]。所以 4 个朋友的最后一个编号是 3。如果喊 friends[4],电脑会说" IndexError:没有这个东西"。
编号不光能取,还能换:
friends[0] = "大明" # 小明长大了,改叫大明
print(friends[0])
往百宝袋里加东西、扔东西
backpack = ["红宝石", "地图"]
backpack.append("魔法药水") # 捡到宝物,装进袋子
print(backpack)
backpack.remove("红宝石") # 用来开锁了,扔掉
print(backpack)
['红宝石', '地图', '魔法药水'] ['地图', '魔法药水']
点号的意思:"某某的某个本领"
backpack.append(...) 读作"backpack 的 append 本领"。列表这种盒子自带几个本领:append 是"装进去",remove 是"扔出去",len() 是数数。游戏里主角的背包、购物清单、歌单,全都是列表。
列表 + for 循环:黄金搭档
还记得第五课说 for 是"对每一遍"吗?它真正的意思是"对列表里的每一个东西":
friends = ["小明", "小红", "小刚", "小雨"]
for f in friends:
print(f"{f},周末来我家玩!")
小明,周末来我家玩! 小红,周末来我家玩! 小刚,周末来我家玩! 小雨,周末来我家玩!
for 每转一圈,就把列表里的一个东西放进 f 盒子里。四个人,转四圈,一个都不落。以后装 40 个人也一样,就两行代码。
数字列表的三个好用的本领
scores = [92, 85, 78, 95, 88]
print(sum(scores)) # 总和
print(max(scores)) # 最高
print(min(scores)) # 最低
438 95 78
总和除以个数就是平均分:sum(scores) / len(scores)——老师算全班平均分,原来这么简单。
随机点名器
把第七课的 random 和列表合体,课堂点名神器:
import random
students = ["小明", "小红", "小刚", "小雨", "小天"]
lucky = random.choice(students) # 从列表里随机抽一个
print(f"🎉 被点到的同学是:{lucky}!")
动手试一试:我的书单管理器
books = ["哈利波特", "西游记"]
reading = True
while reading:
print("===== 我的书单 =====")
print(books)
action = input("输入 add 添加 / del 删除 / quit 退出:")
if action == "add":
new = input("书名?")
books.append(new)
print(f"《{new}》加入书单!")
elif action == "del":
old = input("删哪本?")
books.remove(old)
print(f"《{old}》已读完,删除!")
else:
reading = False
print(f"再见!你一共有 {len(books)} 本书要读。")
这就是一个能一直用下去的小软件!while 开关 + if 分流 + 列表增删,三个老朋友联手,做出来的东西"像真的"。
练习
基础任务:水果盘点。建一个装 5 种水果的列表,打印第 1 种和最后一种(提示:最后一种的编号是 len(fruits) - 1,或者试试 fruits[-1]),再用 for 打印"我最爱吃某某"。
进阶任务:全班平均分。建一个装 6 个分数的列表,算出平均分和最高分,再打印"最高分 95,平均分 88.5,超过平均分的有 3 人"。(最后这半句要用 if 数一数,在循环里数!想想第五课的记账本)
隐藏挑战:抽卡模拟器。做一个"十连抽":金卡概率 10%,紫卡 30%,蓝卡 60%。抽 10 次并列出结果,最后统计每种卡各有几张。(提示:random.randint(1, 100),小于等于 10 出金卡……统计用三个记账本变量)