> **GESP等级：三级 | 考级考点：GESP Python 三级**

# 第07节 字典 dict {key:value}

> **GESP 考点**：#字典
> **时长**：60 分钟
> **记忆钩子**："字典 = 查字典，key 查 value，键不可变值可以变"

---

## "听不懂"怎么破？

### 为什么不用列表？

孩子已经学过列表（虽然可能是 _old 阶段），当他们想表达"红色的 RGB 是什么"时，下意识会用列表：

```python
colors = ["#FF0000", "#0000FF", "#00FF00"]
```

但问题来了：`colors[0]` 是红色还是蓝色？索引 0/1/2 没有任何意义。
字典解决的就是这个问题——用**有意义的名字**当"索引"。

> 身体记忆：列表 = 按座位号找人（0号、1号、2号...），字典 = 喊名字找人（"小红！"）。

### 键是啥？为啥不能变？

用身份证打比方：身份证号（键）不能改，但你的住址（值）可以搬。

- 键 = 身份证号 → **不可变**（字符串、数字、元组）
- 值 = 你的信息 → **可以变**

---

## "记不住"怎么破？

| 容易忘 | 锚点 |
|--------|------|
| 字典用 `{}`，列表用 `[]` | 花括号像一本翻开的字典，方括号像排列的货架 |
| `d[key]` 取值 | 查字典——翻到 key 那页，看到 value |
| `get(key)` 安全取值 | get = "给我这个key，没有就算了"——脾气好，不报错 |
| `d[key] = 新值` | 字典是活的——直接赋值，有就改、没有就加 |
| `pop(key)` 删除 | pop = "砰！弹出去"，不但删了还把值还给你 |
| `del d[key]` 删除 | del = delete，删了就没了，不像 pop 会返回值 |
| 键只能用不可变类型 | 列表不能当键（会报错 TypeError），字符串/数字/元组可以 |

---

## 课程流程

### 00:00-10:00 导入：颜色名→RGB 值

**提问**："如果我想知道 '红色' 的 RGB 值，用列表怎么写？"

```python
colors_list = ["#FF0000", "#0000FF", "#00FF00"]
# colors_list[0] 是红色还是绿色？谁知道！
```

**痛点**：索引 0/1/2 没有意义，根本记不住。

**引出字典**：如果我们用颜色名当索引呢？

```python
colors_dict = {"red": "#FF0000", "blue": "#0000FF", "green": "#00FF00"}
```

> 老师演示：`print(colors_dict["red"])` —— 直接说"给我红色的 RGB"，多直观！

---

### 10:00-30:00 知识点：字典的 7 种操作

#### ① 创建字典

```python
d = {"red": "红", "blue": "蓝"}
e = {}                # 空字典
f = dict(red="红", blue="蓝")  # 另一种方式
```

#### ② d[key] 取值

```python
print(d["red"])       # → "红"
# print(d["green"])   # KeyError！没有这个键
```

#### ③ d[key] = 新值（修改/添加）

```python
d["red"] = "红色"     # 修改已有键的值
d["green"] = "绿"     # 添加新键值对
```

#### ④ get(key) 安全取值

```python
print(d.get("red"))       # → "红色"
print(d.get("green"))     # → None（不报错！）
print(d.get("green", "没有这个颜色"))  # → "没有这个颜色"
```

#### ⑤ pop(key) 删除并返回值

```python
val = d.pop("red")        # 删除 red，val = "红色"
```

#### ⑥ del d[key] 删除

```python
del d["blue"]             # 直接删，不返回任何值
```

#### ⑦ clear() 清空

```python
d.clear()                 # 字典空了，{}
```

---

### 30:00-40:00 演示：colors 字典

```python
colors = {
    "red": "#FF0000",
    "blue": "#0000FF",
    "green": "#00FF00"
}
print(colors["red"])       # → #FF0000

colors["yellow"] = "#FFFF00"   # 添加
colors["red"] = "#FF2222"      # 修改
del colors["blue"]             # 删除
print(colors.get("black"))     # → None

for k, v in colors.items():
    print(f"{k} → {v}")
```

**带着学生一行一行敲**，每敲一行问一句"这行做了什么？"

---

### 40:00-55:00 实操：三个练习

按 `04_dict_practice.py` 文件依次完成：

1. **填空字典增删改查**——补全 `___`，练习创建/读取/修改/删除
2. **补全 get 取值**——对比 `d[key]` 和 `get(key)` 的区别
3. **用字典管 turtle 颜色名→中文名**——遍历字典，turtle 画出每种颜色并标注中文名

**教师巡堂重点**：
- 学生是否把逗号写漏了（字典每对键值后要逗号）
- 学生是否把 `:` 写成 `=`（字典用冒号不是等号）
- `get()` 和 `[]` 的区别是否理解

---

### 55:00-60:00 小测

**问**："`d.get('red')` 和 `d['red']` 有什么区别？"

**参考答案**：
- `d['red']` —— key 不存在时**报错**（KeyError）
- `d.get('red')` —— key 不存在时返回 `None`，不报错
- `d.get('red', 默认值)` —— 还可以自己指定找不到时返回什么

**拓展问**："字典的键能不能用列表？为什么？"
答：不能。列表是可变的（可以 append/remove），而字典键要求**不可变类型**（字符串、数字、元组）。

---

## 常见错误预警

| 错误写法 | 正确写法 | 说明 |
|---------|---------|------|
| `d = {red: "红"}` | `d = {"red": "红"}` | 键是字符串要加引号 |
| `d["red"] = ` 写成了 `=` 后没写值 | 确保赋值完整 | |
| `d.get("red")` 忘了返回值赋值 | `val = d.get("red")` | get 返回的是值，要接住 |
| `d["red"]` 写成了 `d(red)` | `d["red"]` | 字典用方括号取值，不是圆括号 |
| 遍历时写 `for k, v in d` | `for k, v in d.items()` | 直接 `for k in d` 只拿到键 |
