> **GESP等级：二级 | 考级考点：GESP Python 二级**

# 第3节 if/elif/else · 条件顺序陷阱

---

## 📍 导入：四色区域

| 范围 | 名称 |
|------|------|
| x ≤ 100 | 🔵 极西（Extreme West） |
| 100 < x ≤ 200 | 🟢 西区（West Zone） |
| 200 < x ≤ 300 | 🟡 东区（East Zone） |
| x > 300 | 🔴 极东（Extreme East） |

**问题：** 如何用代码判断 4 种情况？

---

## ① elif = else + if 合体

**不使用 elif：** if 嵌套，一层套一层

```python
if x <= 100:
    color = "极西"
else:
    if x <= 200:
        color = "西区"
    else:
        if x <= 300:
            color = "东区"
        else:
            color = "极东"
```

**使用 elif：** 扁平化、更清晰

```python
if x <= 100:
    color = "极西"
elif x <= 200:
    color = "西区"
elif x <= 300:
    color = "东区"
else:
    color = "极东"
```

> **`elif` = `else` + `if` = "否则，如果……"**

---

## ② 执行规则：从上到下，第一个真就停

```
if 条件1 → True?  →  执行代码块1  →  跳出!
    ↓False
elif 条件2 → True?  →  执行代码块2  →  跳出!
    ↓False
elif 条件3 → True?  →  执行代码块3  →  跳出!
    ↓False
else →  执行代码块4  →  跳出!
```

**关键：** 一旦找到满足的条件，执行后**立即跳出**，不再检查后面的条件。

---

## ③ 条件顺序陷阱 ⚠️

### ❌ 错误示范：宽条件放前面

```python
if x > 100:       # ① 所有 >100 的数都被拦截
    color = "西区"
elif x > 200:     # ② 永远不会执行！
    color = "东区"
elif x > 300:     # ③ 永远不会执行！
    color = "极东"
else:
    color = "极西"
```

**当 x = 300：**
- `300 > 100` → **True** → 输出 "西区" ❌（本应是"东区"）

### ✅ 正确示范：窄条件放前面

```python
if x <= 100:      # ① 最窄
    color = "极西"
elif x <= 200:    # ② 次窄
    color = "西区"
elif x <= 300:    # ③ 再次
    color = "东区"
else:             # ④ 兜底
    color = "极东"
```

**当 x = 300：**
- `300 <= 100` → False
- `300 <= 200` → False
- `300 <= 300` → **True** → 输出 "东区" ✅

---

## 对比结果

| x | 正确顺序 | 错误顺序 |
|---|---------|---------|
| 50 | 极西 ✅ | 极西 ✅ |
| 150 | 西区 ✅ | 西区 ✅ |
| 300 | 东区 ✅ | ❌ 西区 |
| 500 | 极东 ✅ | ❌ 西区 |

---

## 实操练习

### 练习 1：补全代码

```python
x = int(input("请输入坐标 x："))
if x <= 100:
    color = "极西"
_____ x <= 200:    # 这里填什么？
    color = "西区"
_____ x <= 300:
    color = "东区"
_____:
    color = "极东"
print("区域：", color)
```

### 练习 2：预测输出

使用**正确顺序**（窄→宽），x = 50：
- `50 <= 100` → True → `color = "____"`

使用**错误顺序**（宽→窄），x = 50：
- 预测结果有什么不同？为什么？

### 练习 3：修改顺序看影响

把 `x > 200` 放到第一个条件，x = 250 时输出什么？

---

## 📝 小测

1. `elif` 为什么不能独立使用？
2. 多分支中，条件顺序为什么重要？
3. 如果 `if` 和所有 `elif` 都不满足，执行哪里？

---

## 💡 记忆钩子

> **"elif = else + if 合体排队检查，第一个对的执行，后面全部跳过"**
