> **GESP等级：三级 | 考级考点：GESP Python 三级**

# 第08节 字典遍历 keys() / values() / items()
**课时：** 1课时（约60分钟）
**目标学生：** 已掌握字典创建与基本操作（第08节）
**GESP考点：** #41 字典基本操作（遍历部分）

---

## 教学目标

1. **理解遍历字典的必要性**：字典里有好多键值对，需要一次性全部拿出来
2. **掌握 `d.keys()`**：获取字典中所有键的视图，可用于遍历
3. **掌握 `d.values()`**：获取字典中所有值的视图，可用于遍历
4. **掌握 `d.items()`**：获取字典中所有(键, 值)对的视图
5. **掌握 `for k, v in d.items()` 双变量遍历**：同时拿到键和值
6. **能应用字典遍历解决实际问题**：用颜色字典 + turtle 画彩色圆

---

## 教学重难点

| 类型 | 内容 |
|------|------|
| 重点 | `keys()` 取所有键、`values()` 取所有值、`items()` 取所有(键,值)对 |
| 难点 | `d.items()` 返回的是(键,值)元组、用两个变量 `k, v` 同时接收 |
| 易错点 | 忘记加括号写成 `d.keys` / `d.items`、混淆 `keys()` 和 `items()` 的返回值 |

---

## 教学过程

### 第一部分：导入——字典里有好多键值对，怎么全部拿出来？（00:00-10:00）

**复习引入：**

> 上节课我们学了字典，它是"键→值"的映射表。
> 如果要拿一个值，我们写 `d["key"]`。
> 那如果我要**全部**拿出来呢？一个一个地写吗？

**场景对比：**

```python
# 之前：列表遍历——拿全部元素
colors_list = ["red", "blue", "green"]
for c in colors_list:
    print(c)     # 一个一个全拿出来

# 现在：字典——里面是"键→值"对，怎么全拿出来？
colors_dict = {"r": "red", "b": "blue", "g": "green"}
# ???
```

**引导提问：**
- 列表可以用 `for c in colors:` 遍历所有元素，字典行吗？
- 如果直接 `for c in colors_dict:` —— 遍历的是什么？（键）
- 那怎么拿到值？怎么同时拿到键和值？

**记忆钩子引入：**
> **"keys() 取所有键，values() 取所有值，items() 取全部成对输出"**

---

### 第二部分：知识点讲解（10:00-30:00）

#### ① `d.keys()` —— 取所有键

```python
colors = {"r": "red", "b": "blue", "g": "green"}
print(colors.keys())   # dict_keys(['r', 'b', 'g'])

# 遍历所有键
for k in colors.keys():
    print(k)    # 依次输出 r, b, g
```

**要点：**
- `d.keys()` 返回一个 `dict_keys` 视图对象，像列表一样可以遍历
- 视图会随原字典变化而变化（动态的）
- 可以直接用 `for k in d:` —— 默认就是遍历键

#### ② `d.values()` —— 取所有值

```python
colors = {"r": "red", "b": "blue", "g": "green"}
print(colors.values())   # dict_values(['red', 'blue', 'green'])

# 遍历所有值
for v in colors.values():
    print(v)    # 依次输出 red, blue, green
```

**要点：**
- `d.values()` 返回 `dict_values` 视图
- 适合只关心值不关心键的场景

#### ③ `d.items()` —— 取所有(键, 值)对

```python
colors = {"r": "red", "b": "blue", "g": "green"}
print(colors.items())
# dict_items([('r', 'red'), ('b', 'blue'), ('g', 'green')])
```

**要点：**
- `d.items()` 返回 `dict_items` 视图
- 每个元素是一个**元组**（键, 值）
- 这是字典遍历最常用的方法

#### ④ `for k, v in d.items()` —— 双变量遍历

```python
colors = {"r": "red", "b": "blue", "g": "green"}

# 方式一：用两个变量接收（推荐）
for k, v in colors.items():
    print(f"键={k}, 值={v}")

# 方式二：用一个变量接收元组
for item in colors.items():
    k = item[0]
    v = item[1]
    print(f"键={k}, 值={v}")
```

**三种遍历方式对比：**

| 方法 | 遍历什么 | 什么时候用 | 代码 |
|:----:|---------|-----------|------|
| `d.keys()` | 所有键 | 只需要键 | `for k in d.keys():` |
| `d.values()` | 所有值 | 只需要值 | `for v in d.values():` |
| `d.items()` | 所有(键,值)对 | 同时需要键和值 | `for k, v in d.items():` |

**常见错误：**
- 忘记括号：`d.keys` 不是 `d.keys()` —— 少了括号拿不到方法结果！
- `d.items` 返回的是视图对象，不是真正的列表（但可以遍历）
- 遍历时不要修改字典的大小（增删键），否则报错！

---

### 第三部分：演示——用字典遍历画彩色圆（30:00-40:00）

讲师现场运行 `10第08节4_代码.py` 中的 `demo_items_circles()`。

**演示流程：**

**第1步：颜色字典 + items() 遍历**

```python
import turtle
t = turtle.Turtle()
t.speed(3)
t.pensize(3)

# 颜色字典：键是中文名，值是英文名
colors = {
    "红色": "red",
    "蓝色": "blue",
    "绿色": "green",
}

for c, cn in colors.items():
    print(f"{c}→{cn}")    # 打印：红色→red
    t.color(cn)            # 设置颜色（用英文值）
    t.circle(20)           # 画圆
    t.penup()
    t.forward(60)
    t.pendown()
```

**关键观察点：**
- `colors.items()` 取出全部键值对
- `for c, cn in colors.items():` 用**两个变量**同时接收键和值
- `f"{c}→{cn}"` 格式化输出——中文键→英文值
- `t.color(cn)` 用的是**值**（英文），不是键（中文）

**第2步：扩展为5种颜色**

```python
colors = {
    "红色": "red",
    "橙色": "orange", 
    "黄色": "yellow",
    "绿色": "green",
    "蓝色": "blue",
}

for c, cn in colors.items():
    print(f"{c}→{cn}")
    t.color(cn)
    t.circle(25)
    t.penup()
    t.forward(55)
    t.pendown()
```

---

### 第四部分：实操练习（40:00-55:00）

**练习1：填空遍历方法（10分钟）**

```python
scores = {"小明": 90, "小红": 85, "小刚": 92}

# ① 遍历所有键
for name ____ scores.____():
    print(name)

# ② 遍历所有值
for score ____ scores.____():
    print(score)

# ③ 遍历所有键值对
for name, score ____ scores.____():
    print(f"{name}: {score}")
```

**练习2：补全遍历字典画彩色圆（15分钟）**

```python
import turtle
t = turtle.Turtle()
t.speed(3)

# 颜色字典：英文→RGB近似色名
colors = {
    "red": "红色",
    "orange": "橙色",
    "yellow": "黄色",
    "green": "绿色",
    "blue": "蓝色",
}

# 补全代码：用 items() 遍历 colors 字典
# 用键（英文）设置颜色，打印"画了一个xxx色的圆"
____ en, cn ____ colors.____():
    t.color(____)       # 用英文键设置颜色
    print(f"画了一个{____}色的圆")  # 用中文值打印
    t.circle(25)
    t.penup()
    t.forward(55)
    t.pendown()
```

**练习3：用 items() 打印完整字典信息（10分钟）**

```python
student = {"姓名": "张三", "年龄": 9, "班级": "3班", "爱好": "编程"}

# 用 for k, v in student.items(): 逐行打印字典的全部内容
# 输出格式：键 → 值
```

**参考答案：** 见 `10第08节4_代码.py` 中的 `practice_answers()`

---

### 第五部分：小测与总结（55:00-60:00）

**小测题目：**

1. `items()` 返回什么？
   - A. 所有键的列表
   - B. 所有值的列表
   - C. 所有(键, 值)对的视图   ← 正确答案
   - D. 所有键值对的个数

2. 下面代码哪行会报错？
   ```python
   d = {"a": 1, "b": 2}
   # A
   for k in d.keys():
       print(k)
   # B
   for v in d.values():
       print(v)
   # C
   for k, v in d.items():
       print(k, v)
   # D
   for k in d.items():
       print(k)       # ← 这里不报错，但 k 是元组不是键
   ```
   追问：D 中 `k` 是什么类型？（元组 tuple）

3. 补全代码：遍历 `info = {"name": "Tom", "age": 8}`，输出 `"name = Tom"` 和 `"age = 8"`
   ```python
   info = {"name": "Tom", "age": 8}
   for ____, ____ in ____.____():
       print(f"{____} = {____}")
   ```

4. 判断对错：直接用 `for k in d:` 遍历字典，得到的是值而不是键。（错，得到的是键）

**记忆钩子：**
> **"keys() 取所有键，values() 取所有值，items() 取全部成对输出"**
> **"for k, v in d.items() —— 两个变量同时拿，键值对全不怕"**

---

## 板书设计

```
┌──────────────────────────────────────────────────────┐
│  第08节 字典遍历 keys() / values() / items()           │
│                                                      │
│  d = {"r":"red", "b":"blue", "g":"green"}           │
│                                                      │
│  ┌──────────────────────────────┐                    │
│  │  d.keys()    → 所有键        │                    │
│  │  d.values()  → 所有值        │                    │
│  │  d.items()   → 所有(键,值)对  │                    │
│  └──────────────────────────────┘                    │
│                                                      │
│  遍历：                                               │
│    for k in d.keys():        # 只拿键                │
│    for v in d.values():      # 只拿值                │
│    for k, v in d.items():    # 同时拿键和值  ★推荐    │
│                                                      │
│  记忆：keys()取键 values()取值 items()取全部成对输出    │
└──────────────────────────────────────────────────────┘
```

---

## 课后反思

- 学生对"视图"概念是否理解？还是直接当列表用即可？
- `for k, v in d.items()` 的双变量赋值是否掌握？
- 是否有人混淆了 `keys()` 和 `items()` 的用法？
- 实操练习中，字典画彩圆的输出是否达到预期效果？
