> **GESP等级：三级 | 考级考点：GESP Python 三级**

# 第4节 字典遍历——keys() / values() / items()

**GESP考点：** #41 字典基本操作（遍历部分）

---

## 导入：字典里有好多键值对，怎么全部拿出来？

| 列表（已学） | 字典（本节） |
|:-----------:|:-----------:|
| `colors = ["red","blue","green"]` | `colors = {"r":"red","b":"blue","g":"green"}` |
| `for c in colors:` → 取全部元素 | `for ??? in colors:` → 取什么？ |

**对比思考：**
```python
# 列表直接遍历
for c in ["red", "blue", "green"]:
    print(c)

# 字典直接遍历——取到的是？
colors = {"r": "red", "b": "blue", "g": "green"}
for x in colors:
    print(x)     # 输出：r  b  g  ← 键！不是值！
```

> **问题：** 想取值怎么办？想同时取键和值怎么办？

---

## ① `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
```

**要点：**
- 返回 `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.items()` —— 取所有(键, 值)对

```python
colors = {"r": "red", "b": "blue", "g": "green"}
print(colors.items())
# dict_items([('r', 'red'), ('b', 'blue'), ('g', 'green')])
```

**特点：**
- 每个元素是**元组** `(键, 值)`
- 字典遍历的"万能方法"

---

## ④ `for k, v in d.items()` —— 双变量遍历

```python
colors = {"r": "red", "b": "blue", "g": "green"}

# 推荐方式：两个变量同时接收
for k, v in colors.items():
    print(f"键={k}, 值={v}")

# 输出：
# 键=r, 值=red
# 键=b, 值=blue
# 键=g, 值=green
```

---

## 三种遍历方法对比

| 方法 | 遍历内容 | 适用场景 | 代码格式 |
|:----:|:--------:|:--------:|:--------:|
| `d.keys()` | 所有键 | 只需要键 | `for k in d.keys():` |
| `d.values()` | 所有值 | 只需要值 | `for v in d.values():` |
| `d.items()` | 所有(键,值)对 | 同时需要键和值 | `for k, v in d.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()
```

**扩展为5色：**
```python
colors = {
    "红色": "red",
    "橙色": "orange",
    "黄色": "yellow",
    "绿色": "green",
    "蓝色": "blue",
}
```

---

## 实操练习

### 练习1：填空遍历方法

```python
scores = {"小明": 90, "小红": 85, "小刚": 92}

# ① 遍历所有键
for name ____ scores.____():
    print(name)

# ② 遍历所有值
for score ____ scores.____():
    print(score)

# ③ 遍历所有键值对
for name, score ____ scores.____():
    print(f"{name}: {score}")
```

### 练习2：补全遍历字典画彩色圆

```python
import turtle
t = turtle.Turtle()
t.speed(3)

colors = {
    "red": "红色",
    "orange": "橙色",
    "yellow": "黄色",
    "green": "绿色",
    "blue": "蓝色",
}

# 补全：
____ en, cn ____ colors.____():
    t.color(____)       # 用英文键设颜色
    print(f"画了一个{____}色的圆")  # 用中文值打印
    t.circle(25)
    t.penup()
    t.forward(55)
    t.pendown()
```

### 练习3：用 items() 打印完整字典

```python
student = {"姓名": "张三", "年龄": 9, "班级": "3班", "爱好": "编程"}

# 用 for k, v in student.items() 逐行输出
# 格式：键 → 值
```

---

## 小测

1. `items()` 返回什么？
   - A. 所有键的列表
   - B. 所有值的列表
   - C. 所有(键, 值)对的视图
   - D. 所有键值对的个数

2. 补全代码：
   ```python
   info = {"name": "Tom", "age": 8}
   for ____, ____ in ____.____():
       print(f"{____} = {____}")
   ```

3. 判断对错：直接用 `for k in d:` 遍历得到的是值。（对/错）

---

## 记忆钩子

> **"keys() 取所有键，values() 取所有值，items() 取全部成对输出"**
> **"for k, v in d.items() —— 两个变量同时拿，键值对全不怕"**
