Python 基础教学 · 大一新生版

📖 图书管理系统

用 Python 列表(List)构建图书馆

知识点:列表创建 · 索引切片 · 增删改查 · 排序统计 · 二维列表 · 推导式

00

案例背景

```

想象你是学校图书馆的管理员。图书馆里有很多书,你需要:

  • 📋 记录所有书的名字
  • ➕ 新书到了,把它加进去
  • ➖ 书丢了或报废了,把它删掉
  • 🔍 查找某本书在不在馆
  • 📊 统计一共有多少本书
  • 🔤 按书名排序,方便查找
  • 📝 记录每本书的作者、是否被借出

在 Python 中,列表(list)就像一个可以随时增删改的书架。今天我们就用列表来实现这个图书管理系统!

📌 本课知识点总览
创建列表
索引访问
切片操作
append()
insert()
extend()
remove()
pop()
del / clear
修改元素
in 查询
len()
for 遍历
sort / reverse
count / index
二维列表
列表推导式
```
01

阶段一:最简单的图书列表

```
知识点 ①

1.1 创建列表

列表就像一排书架上的书,每本书都有自己的位置(编号从 0 开始)。用 [ ] 把所有书名括起来,用逗号隔开,就建好了一个书架!

📖 示例代码

python · 创建图书列表
# 创建一个图书列表,存放图书馆的书籍名称
```

books = [“Python编程”, “人工智能导论”, “数据科学基础”, “机器学习实战”]

# 打印整个书单
print(“图书馆书单:”, books)

# 查看列表的数据类型
print(“数据类型:”, type(books))
```
运行结果
图书馆书单: ['Python编程', '人工智能导论', '数据科学基础', '机器学习实战'] ``` 数据类型:
```
创建一个名为 my_books 的列表,存放你喜欢的 3 本书(可以随意起名)。然后用 print() 打印出来。
知识点 ②

1.2 访问列表元素(索引)

书架上每本书都有座位号。Python 的座位号从 0 开始数(不是 1!)。就像电梯楼层,有些国家从 0 楼开始。负数索引 -1 表示最后一本书。

books[0] → 第1本    books[1] → 第2本    books[-1] → 最后一本

📖 示例代码

python · 索引访问
books = ["Python编程", "人工智能导论", "数据科学基础", "机器学习实战"]
```

#                   索引: 0           1              2              3

# 查看第1本书(索引0)
print(“第1本书:”, books[0])

# 查看第3本书(索引2)
print(“第3本书:”, books[2])

# 负数索引:-1 表示最后一本
print(“最后一本书:”, books[-1])

# 倒数第二本
print(“倒数第二本书:”, books[-2])
```
运行结果
第1本书: Python编程 ``` 第3本书: 数据科学基础 最后一本书: 机器学习实战 倒数第二本书: 数据科学基础
```
使用索引,打印出 books 列表中的第 2 本书和倒数第 1 本书。
知识点 ③

1.3 切片操作(取出一段书单)

切片就像从书架上取出"某几本书"。格式:books[开始:结束],取出的范围包含"开始",但不包含"结束"(左闭右开区间)。省略开始或结束则表示从头/到尾。

📖 示例代码

python · 切片操作
books = ["Python编程", "人工智能导论", "数据科学基础", "机器学习实战"]
```

# 取第1到第2本(索引0到1,不含2)
print(“前两本书:”, books[0:2])

# 从第2本开始,取到最后
print(“第2本起到最后:”, books[1:])

# 取前3本(省略开始,默认从0)
print(“前3本书:”, books[:3])

# 复制整个列表(常用技巧)
books_copy = books[:]
print(“书单副本:”, books_copy)
```
运行结果
前两本书: ['Python编程', '人工智能导论'] ``` 第2本起到最后: [‘人工智能导论’, ‘数据科学基础’, ‘机器学习实战’] 前3本书: [‘Python编程’, ‘人工智能导论’, ‘数据科学基础’] 书单副本: [‘Python编程’, ‘人工智能导论’, ‘数据科学基础’, ‘机器学习实战’]
```
用切片取出 books 中间两本书(即索引 1 和 2),打印结果。
```
02

阶段二:图书增加与删除

```
知识点 ④⑤⑥

2.1 添加新书(append、insert、extend)

append:新书放到书架最后一格,就像排队进图书馆,后来的排最后。
insert:指定位置插入,就像把一本书塞进书架中间,后面的书往后挪。
extend:把另一批书全部搬进来,一次添加多本。

📖 示例代码

python · 添加书籍
books = ["Python编程", "人工智能导论", "数据科学基础", "机器学习实战"]
```

# ① append:在末尾添加一本新书
books.append(“深度学习入门”)
print(“append后:”, books)

# ② insert:在索引1的位置插入(其他书向后移)
books.insert(1, “算法导论”)
print(“insert后:”, books)

# ③ extend:把另一批书一次性加进来
new_books = [“计算机网络”, “操作系统原理”]
books.extend(new_books)
print(“extend后:”, books)
```
运行结果
append后: ['Python编程', '人工智能导论', '数据科学基础', '机器学习实战', '深度学习入门'] ``` insert后: [‘Python编程’, ‘算法导论’, ‘人工智能导论’, ‘数据科学基础’, ‘机器学习实战’, ‘深度学习入门’] extend后: [‘Python编程’, ‘算法导论’, ‘人工智能导论’, ‘数据科学基础’, ‘机器学习实战’, ‘深度学习入门’, ‘计算机网络’, ‘操作系统原理’]
```
appendbooks 末尾添加 "数据库原理",再用 insert"离散数学" 插到第 0 个位置(最前面),最后打印列表。
知识点 ⑦⑧⑨

2.2 删除书籍(remove、pop、del、clear)

remove(值):按书名找到并删除,就像说"把《机器学习实战》下架"。
pop(索引):按位置取出,取出后列表变短,就像图书员从某格取走一本。
del:直接删除指定位置,不保留取出的值。
clear():清空整个书架,大扫除!

📖 示例代码

python · 删除书籍
books = ["Python编程", "人工智能导论", "数据科学基础", "机器学习实战"]
```

# ① remove:按书名删除(书丢了,下架)
books.remove(“数据科学基础”)
print(“remove后:”, books)

# ② pop:取出最后一本(默认),返回被删除的书名
removed_book = books.pop()
print(“被取出的书:”, removed_book)
print(“pop后:”, books)

# ③ pop(索引):取出指定位置的书
books = [“Python编程”, “人工智能导论”, “数据科学基础”, “机器学习实战”]
books.pop(1)           # 取出索引1的书
print(“pop(1)后:”, books)

# ④ del:直接删除某个位置
books = [“Python编程”, “人工智能导论”, “数据科学基础”, “机器学习实战”]
del books[0]
print(“del后:”, books)

# ⑤ clear:清空所有书(书架清零)
books.clear()
print(“clear后:”, books)
```
运行结果
remove后: ['Python编程', '人工智能导论', '机器学习实战'] ``` 被取出的书: 机器学习实战 pop后: [‘Python编程’, ‘人工智能导论’] pop(1)后: [‘Python编程’, ‘数据科学基础’, ‘机器学习实战’] del后: [‘人工智能导论’, ‘数据科学基础’, ‘机器学习实战’] clear后: []
```
books 中用 remove 删除 "人工智能导论",再用 pop(0) 取出第一本书并打印"已取出:xxx",最后打印剩余书单。
知识点 ⑩

2.3 修改书籍信息

修改列表元素就像在书架上换一本书:找到位置(索引),直接赋新值即可。books[位置] = 新书名

📖 示例代码

python · 修改元素
books = ["Python编程", "人工智能导论", "数据科学基础", "机器学习实战"]
```

print(“修改前:”, books)

# 把第1本书(索引0)更换为新版本
books[0] = “Python编程(第3版)”

# 把最后一本书更换
books[-1] = “机器学习实战(第2版)”

print(“修改后:”, books)
```
运行结果
修改前: ['Python编程', '人工智能导论', '数据科学基础', '机器学习实战'] ``` 修改后: [‘Python编程(第3版)’, ‘人工智能导论’, ‘数据科学基础’, ‘机器学习实战(第2版)’]
```
books[1] 修改为 "人工智能导论(第2版)",打印修改后的列表。
```
03

阶段三:查询与遍历

```
知识点 ⑪⑫

3.1 查找书籍(in)与统计数量(len)

in:就像问图书管理员"这本书在不在?",回答 True(在)或 False(不在)。
len():统计书架上一共有多少本书,就像数书架。

📖 示例代码

python · 查询与计数
books = ["Python编程", "人工智能导论", "数据科学基础", "机器学习实战"]
```

# ① 用 in 查找书是否存在
print(“Python编程 在馆吗?”, “Python编程” in books)
print(“高等数学 在馆吗?”, “高等数学” in books)

# ② 结合 if 判断,给出提示
search = “数据科学基础”
if search in books:
print(search, “在馆,可以借阅!”)
else:
print(search, “不在馆,请联系馆员。”)

# ③ len():统计图书总数
total = len(books)
print(“图书馆共有”, total, “本书”)
```
运行结果
Python编程 在馆吗? True ``` 高等数学 在馆吗? False 数据科学基础 在馆,可以借阅! 图书馆共有 4 本书
```
让用户查询 "机器学习实战""线性代数" 是否在馆,分别打印结果。再用 len() 打印书单总数。
知识点 ⑬

3.2 展示所有书籍(for 循环遍历)

遍历就像图书管理员一本一本地把书架上的书翻看一遍。for 书 in 书架: 每次循环,变量 自动变成当前那本书。

📖 示例代码

python · for循环遍历
books = ["Python编程", "人工智能导论", "数据科学基础", "机器学习实战"]
```

# 基础遍历:打印每本书的名字
print(”=== 图书馆书单 ===”)
for book in books:
print(”  📖”, book)

# 带编号的遍历(enumerate会同时给出序号和值)
print(”\n=== 带编号的书单 ===”)
for i, book in enumerate(books, 1):   # 从1开始编号
print(f”  第{i}本:{book}”)

# 查找包含”导论”的书
print(”\n=== 含’导论’的书 ===”)
for book in books:
if “导论” in book:
print(”  找到:”, book)
```
运行结果
=== 图书馆书单 === ``` 📖 Python编程 📖 人工智能导论 📖 数据科学基础 📖 机器学习实战 === 带编号的书单 === 第1本:Python编程 第2本:人工智能导论 第3本:数据科学基础 第4本:机器学习实战 === 含’导论’的书 === 找到: 人工智能导论
```
for 循环遍历 books,找出所有书名长度超过 5 个字的书,并用 len(book) 计算书名长度,打印:"《xxx》书名长度为 N"。
```
04

阶段四:排序与统计

```
知识点 ⑭

4.1 书单排序(sort、reverse)

sort():按拼音/字母顺序给书排队,就像图书馆把书按书名的首字母摆放。注意:中文排序按 Unicode 码值(类似按汉字编码),英文按字母顺序。
reverse():把整个书架的顺序反过来,第一本变最后,最后变第一。

📖 示例代码

python · 排序
books = ["Python编程", "人工智能导论", "数据科学基础", "机器学习实战"]
```

print(“排序前:”, books)

# ① sort():升序排列(直接修改原列表)
books.sort()
print(“升序排序后:”, books)

# ② sort(reverse=True):降序排列
books.sort(reverse=True)
print(“降序排序后:”, books)

# ③ reverse():仅翻转顺序,不排序
books.reverse()
print(“翻转顺序后:”, books)

# ④ sorted():不改原列表,返回新的排序列表
books = [“Python编程”, “人工智能导论”, “数据科学基础”, “机器学习实战”]
sorted_books = sorted(books)
print(“原列表不变:”, books)
print(“新排序结果:”, sorted_books)
```
运行结果
排序前: ['Python编程', '人工智能导论', '数据科学基础', '机器学习实战'] ``` 升序排序后: [‘Python编程’, ‘机器学习实战’, ‘数据科学基础’, ‘人工智能导论’] 降序排序后: [‘人工智能导论’, ‘数据科学基础’, ‘机器学习实战’, ‘Python编程’] 翻转顺序后: [‘Python编程’, ‘机器学习实战’, ‘数据科学基础’, ‘人工智能导论’] 原列表不变: [‘Python编程’, ‘人工智能导论’, ‘数据科学基础’, ‘机器学习实战’] 新排序结果: [‘Python编程’, ‘机器学习实战’, ‘数据科学基础’, ‘人工智能导论’]
```
创建一个包含 5 本书名的列表,先升序排序并打印,再降序排序并打印,最后用 reverse() 翻转并打印。
知识点 ⑮

4.2 统计与定位(count、index)

count(值):数数这本书在列表里出现了几次(避免重复录入)。
index(值):找到这本书放在第几格(返回索引位置)。

📖 示例代码

python · count 与 index
# 模拟一份可能有重复录入的书单
```

books = [“Python编程”, “人工智能导论”, “Python编程”,
“数据科学基础”, “机器学习实战”, “Python编程”]

# ① count:统计某本书出现次数(检查是否重复录入)
cnt = books.count(“Python编程”)
print(f”‘Python编程’ 出现了 {cnt} 次”)

cnt2 = books.count(“高等数学”)
print(f”‘高等数学’ 出现了 {cnt2} 次”)

# ② index:找到某本书第一次出现的位置
pos = books.index(“数据科学基础”)
print(f”‘数据科学基础’ 在索引 {pos} 位置”)

# 注意:查询不存在的书会报错,所以先用 in 判断
query = “机器学习实战”
if query in books:
print(f”’{query}’ 在第 {books.index(query)} 号位置”)
```
运行结果
'Python编程' 出现了 3 次 ``` ‘高等数学’ 出现了 0 次 ‘数据科学基础’ 在索引 3 位置 ‘机器学习实战’ 在第 4 号位置
```
count 统计 "Python编程" 出现几次,若超过 1 次则打印"警告:重复录入了 N 次";再用 index 找到 "人工智能导论" 的位置并打印。
```
05

阶段五:升级为二维列表 + 推导式

```
知识点 ⑯

5.1 二维列表(嵌套列表)

之前的书单只记了书名,就像一列清单。现在升级:每本书记录 [书名, 作者, 是否借出],就像一张二维表格,每行是一本书,每列是一个属性。访问时用两个方括号:books[行][列]

📖 示例代码

python · 二维列表(图书信息表)
# 二维列表:每个元素是 [书名, 作者, 是否借出]
```

# 结构:books[行索引][列索引]
#   列0=书名  列1=作者  列2=是否借出(1借出/0在馆)
books = [
[“Python编程”,    “Guido”,   0],   # 在馆
[“人工智能导论”,  “周志华”,  1],   # 已借出
[“数据科学基础”,  “吴恩达”,  0],   # 在馆
[“机器学习实战”,  “李沐”,    1],   # 已借出
]

# 访问第1本书的书名(行0,列0)
print(“第1本书名:”, books[0][0])

# 访问第2本书的作者(行1,列1)
print(“第2本作者:”, books[1][1])

# 遍历打印完整书单
print(”\n=== 图书馆完整书单 ===”)
print(f”{‘书名’:<12} {‘作者’:<8} {‘状态’}”)
print(”-” * 30)
for book in books:
# book[0]=书名  book[1]=作者  book[2]=是否借出
if book[2] == 1:
status = “❌ 已借出”
else:
status = “✅ 在馆”
print(f”{book[0]:<12} {book[1]:<8} {status}”)

# 修改借阅状态:把第1本书改为已借出
books[0][2] = 1
print(”\n《Python编程》已借出,状态更新为:”, books[0])

# 添加一本新书到二维列表
books.append([“深度学习”, “Goodfellow”, 0])
print(“新增书籍后,共有”, len(books), “本书”)
```
运行结果
第1本书名: Python编程 ``` 第2本作者: 周志华 ## === 图书馆完整书单 === 书名 作者 状态 Python编程 Guido ✅ 在馆 人工智能导论 周志华 ❌ 已借出 数据科学基础 吴恩达 ✅ 在馆 机器学习实战 李沐 ❌ 已借出 《Python编程》已借出,状态更新为: [‘Python编程’, ‘Guido’, 1] 新增书籍后,共有 5 本书
```
for 循环遍历二维列表,只打印状态为"在馆"(第3列为 0)的书籍的书名和作者。
知识点 ⑰

5.2 列表推导式(简洁地生成新列表)

列表推导式是一种"一行代码"的循环写法。就像图书管理员说:
"把所有在馆的书名抄在一张单子上"
普通写法要4行,推导式只要1行!格式:[表达式 for 变量 in 列表 if 条件]

📖 示例代码

python · 列表推导式
# 图书信息:[书名, 作者, 是否借出(0在馆/1借出)]
```

books = [
[“Python编程”,    “Guido”,     0],
[“人工智能导论”,  “周志华”,    1],
[“数据科学基础”,  “吴恩达”,    0],
[“机器学习实战”,  “李沐”,      1],
[“深度学习”,      “Goodfellow”,0],
]

# ① 提取所有书名(一行搞定!)
all_titles = [book[0] for book in books]
print(“所有书名:”, all_titles)

# ② 提取所有在馆的书名(加上条件过滤)
available = [book[0] for book in books if book[2] == 0]
print(“当前在馆书籍:”, available)

# ③ 提取所有已借出的书名
borrowed = [book[0] for book in books if book[2] == 1]
print(“已借出书籍:”, borrowed)

# ④ 生成一个书名长度列表
title_lengths = [len(book[0]) for book in books]
print(“各书名长度:”, title_lengths)

# 对比:不用推导式的写法(效果相同,但要4行)
# available = []
# for book in books:
#     if book[2] == 0:
#         available.append(book[0])
```
运行结果
所有书名: ['Python编程', '人工智能导论', '数据科学基础', '机器学习实战', '深度学习'] ``` 当前在馆书籍: [‘Python编程’, ‘数据科学基础’, ‘深度学习’] 已借出书籍: [‘人工智能导论’, ‘机器学习实战’] 各书名长度: [8, 7, 6, 6, 4]
```
用推导式生成一个新列表 authors,存放所有书籍的作者名;再生成 long_titles,存放书名长度大于 4 的书名。
```
06

完整示例代码(图书管理系统 · 完整版)

```
library_system.py Python 3.x · 适合大一新生
# ============================================================
```

#   图书管理系统 —— Python 列表操作完整示例
#   适合大一新生,综合演示列表的所有核心操作
# ============================================================

# ─── 第1步:创建图书列表 ────────────────────────────────────
books = [“Python编程”, “人工智能导论”, “数据科学基础”, “机器学习实战”]
print(”【初始书单】”, books)

# ─── 第2步:索引访问 ────────────────────────────────────────
print(”\n【索引访问】”)
print(“第1本书:”, books[0])
print(“最后一本:”, books[-1])

# ─── 第3步:切片 ────────────────────────────────────────────
print(”\n【切片操作】”)
print(“前两本:”, books[:2])
print(“后两本:”, books[2:])

# ─── 第4步:添加书籍 ────────────────────────────────────────
print(”\n【添加书籍】”)
books.append(“深度学习入门”)           # 末尾加
books.insert(0, “算法导论”)             # 开头插
books.extend([“计算机网络”, “操作系统”]) # 批量加
print(“添加后:”, books)

# ─── 第5步:删除书籍 ────────────────────────────────────────
print(”\n【删除书籍】”)
books.remove(“操作系统”)               # 按名删除
last = books.pop()                    # 弹出最后一本
print(“弹出:”, last)
print(“删除后:”, books)

# ─── 第6步:修改书籍 ────────────────────────────────────────
print(”\n【修改书籍】”)
books[0] = “算法导论(第4版)”
print(“修改后:”, books)

# ─── 第7步:查询 ────────────────────────────────────────────
print(”\n【查询书籍】”)
query = “Python编程”
if query in books:
print(query, “在馆,位置在索引”, books.index(query))
else:
print(query, “不在馆”)
print(“当前书籍总数:”, len(books))

# ─── 第8步:遍历展示 ────────────────────────────────────────
print(”\n【全部书单】”)
for i, book in enumerate(books, 1):
print(f”  {i}. {book}”)

# ─── 第9步:排序 ────────────────────────────────────────────
print(”\n【排序】”)
books.sort()
print(“升序排序:”, books)
books.sort(reverse=True)
print(“降序排序:”, books)

# ─── 第10步:统计 ───────────────────────────────────────────
print(”\n【统计】”)
test_list = [“Python编程”, “Python编程”, “深度学习”]
print(”‘Python编程’出现次数:”, test_list.count(“Python编程”))

# ─── 第11步:二维列表 ───────────────────────────────────────
print(”\n【二维图书信息表】”)
lib = [
[“Python编程”,   “Guido”,    0],
[“人工智能导论”, “周志华”,   1],
[“数据科学基础”, “吴恩达”,   0],
[“机器学习实战”, “李沐”,     1],
]
for b in lib:
st = “已借出” if b[2] == 1 else “在馆”
print(f”  《{b[0]}》 作者:{b[1]}  状态:{st}”)

# ─── 第12步:列表推导式 ─────────────────────────────────────
print(”\n【列表推导式】”)
available = [b[0] for b in lib if b[2] == 0]
print(“在馆书单:”, available)
all_authors = [b[1] for b in lib]
print(“所有作者:”, all_authors)

print(”\n✅ 图书管理系统演示完毕!”)
07

课堂练习(共 5 道)

```
1

书单操作综合题:创建一个包含 5 本书的列表,然后:① 用 append 加入第 6 本书;② 用 remove 删除其中一本;③ 用 sort() 排序;④ 用 for 循环带编号地打印完整书单(格式:第N本:书名)。

2

借书查询系统:给定书单 ["Python编程", "数据结构", "高等数学", "线性代数", "操作系统"],让程序依次查询 "高等数学""机器学习""操作系统" 是否在馆,每次查询打印:"《书名》✅ 在馆,位置:第N本""《书名》❌ 不在馆"。提示:用 inindex()

3

重复录入检查:给定可能有重复的书单 ["Python编程", "数据结构", "Python编程", "高等数学", "数据结构", "Python编程"],用 for 循环遍历,对于每本书用 count() 检查出现次数,若次数 > 1 则打印警告:"《书名》重复录入了N次,请检查!"。(提示:每本书只需警告一次)

4

切片取书:书单 books = ["算法", "Python", "数学", "英语", "物理", "化学", "生物"],分别用切片取出:① 前 3 本;② 最后 3 本;③ 中间部分(去掉首尾各 2 本);④ 用 [::-1] 将整个书单倒序(步长 -1)并打印。

5

二维列表统计:使用以下数据:lib = [["Python编程","Guido",0], ["AI导论","周志华",1], ["数学分析","陈纪修",0], ["深度学习","Goodfellow",1], ["统计学","贾俊平",0]]。要求:① 用 for 循环统计在馆书籍数量(第3列为0);② 用推导式提取所有在馆书名放入新列表并打印;③ 打印借出率:借出数/总数 × 100%

```
08

拓展思考题(3 道)

```
🤔

思考题 1 · 列表 vs 变量:为什么管理 100 本书用列表,而不是创建 100 个变量(如 book1 = "...", book2 = "..." ...)?列表相比多个变量有哪些优势?试着列举 3 个理由,结合图书管理的场景说明。

💭

思考题 2 · append vs extend vs insert:三种添加方法有什么区别?如果图书馆一次收到一整批捐赠书(20 本),你会选择哪个方法?如果想把新书放在最显眼的第 1 个位置,该用哪个?对比三种方法的使用场景。

🚀

思考题 3 · 系统升级设想:现在的图书管理系统用二维列表存储 [书名, 作者, 是否借出],如果要继续扩展,还想记录:出版年份、ISBN 编号、借书人姓名、借出日期。你会把这些信息加到二维列表的哪个位置(第几列)?访问"第 3 本书的 ISBN"要怎么写?列表越来越长,有什么缺点?(这自然引出了后续学习"字典"的必要性)

```