# if：让程序学会判断，看情况走不同的路

承接上一篇的布尔类型：用比较运算符产生 True/False，学 if/elif/else 的写法与缩进规则，让程序按条件只走该走的那条路，为 for 循环做铺垫。

> 条件判断与流程控制 · 比较运算符与布尔逻辑 · 自动化入门 · 约 7 分钟 · 09 月 09 日

## 本篇要点

1. 判断的原料是布尔值 True/False，它由比较运算符产生：==、!=、<、>、<=、>= 每个都是一次“是还是否”的提问。
2. if 的固定写法是“if 条件：换行缩进”，条件为 True 就执行缩进块、为 False 就整块跳过；冒号不能丢。
3. Python 用缩进而不是花括号来分组代码，同一代码块缩进必须一致、约定 4 个空格，漏缩进或不一致会报 IndentationError。
4. else 接在 if 后面兜底，elif 用来加档位；整个 if/elif/else 从上往下只执行第一个条件为真的块，然后整个结构结束，所以多档条件要注意顺序。
5. == 是“问两边相等吗”，= 是“把值装进名字”，写判断时漏掉一个等号不会报错但逻辑会悄悄坏掉。

---

上一篇结尾留了个预告：真正替你干活的程序，得会**看情况行事**——金额超过 100 就发提醒，行数少得可疑就报警。可到目前为止，你写的代码都只会老老实实从上往下执行，每个 `print` 都必然跑一遍，一步不多、一步不少。这一篇就解决这个关键缺口：程序怎么自己问“是还是否”，并根据答案只走该走的那条路。今天要掌握四个东西：比较运算符、`if` 的写法、缩进规则、以及 `else` 和 `elif` 两个帮手。至于把多个条件用 `and`、`or` 组合、在条件里再套一个 `if`，那是后面的事，今天不碰。

## 判断的原料：比较运算符产生布尔值

程序拿什么来“问问题”？答案是上一篇认识的布尔类型——`True` 和 `False`。那时它只是静静躺在类型表格里的一行，今天它正式上岗：判断的依据就是布尔值。

怎么产生布尔值？拿两个东西比一比。Python 提供了六个**比较运算符**：

| 运算符 | 含义 | 例子 |
| --- | --- | --- |
| `==` | 等于 | `行数 == 0` |
| `!=` | 不等于 | `文件名 != "test.xlsx"` |
| `<` | 小于 | `行数 < 50` |
| `>` | 大于 | `金额 > 100` |
| `<=` | 小于等于 | `电量 <= 10` |
| `>=` | 大于等于 | `电量 >= 80` |

每个比较都是一次提问，答案不是 `True` 就是 `False`。你可以直接在 Shell 里验证：

```python
行数 = 860
print(行数 > 800)    # 输出 True
print(行数 == 0)     # 输出 False
```

注意这里的 `==` 是两个等号，上一篇说过它和赋值的 `=` 是两回事：`=` 是把右边的值装进左边的名字，`==` 是问“两边相等吗”。写判断时漏写成 `行数 = 0`，程序不会报错，而是先把 0 存进行数这个变量、再把它当条件用——逻辑就悄悄坏了。另外，字符串也能比较，`文件名 == "报表.xlsx"` 同样返回一个布尔值，只是大小写敏感：“报表”和“报表”没问题，全半角、大小写差一个字符都算不相等。

## if 的写法：冒号开门，缩进的代码才归它管

有了布尔值，就能写第一个判断。语法就一句话：`if` 后面跟条件，条件后加英文冒号 `:`，换行后**缩进**写上条件成立时要执行的代码：

```python
行数 = 0
if 行数 == 0:
    print("文件是空的，导出可能失败了。")

print("检查完毕。")
```

运行后输出两行：先是“文件是空的……”，再是“检查完毕。”。把 `行数` 改成 860 再跑，这次只输出“检查完毕。”——`if` 那一行后面的缩进块被整个跳过了。

这就是 `if` 的全部机制：**条件为 `True`，执行缩进块里的代码；为 `False`，跳过整个块**。两个细节值得盯住。第一，冒号不能丢，它相当于对 Python 说：“下面这块代码是归上面这个条件管的”。第二，缩进块可以有好几行，只要行首空格一样，就都属于这个 `if`；一旦某一行顶到了最左边（不再缩进），Python 就认为这个块到此结束。上面例子里“检查完毕。”没缩进，所以无论条件真假它都会执行——它不属于那个 `if`。

## 缩进为什么是命根子

别的很多语言用花括号 `{}` 把代码分组，Python 不一样：**缩进就是分组方式**。缩进在 Python 里不是排版美观问题，而是语法本身——块属于谁、嵌套多深，全看行首的空格。这也是新手栽跟头最多的地方，常见两种惨状：

- 漏缩进：`if` 下面直接顶格写代码，报 `IndentationError: expected an indented block`，意思就是“这里该有缩进却没有”；
- 缩进不一致：同一块里有的行空 4 格、有的空 8 格，或混用了 Tab 键和空格，报 `IndentationError: unexpected indent`，甚至不报错但逻辑错乱。

规矩只有两条：同一代码块内缩进必须一致；约定俗成用 4 个空格。在 IDLE 里写代码时，直接按 Tab 键通常会自动插进 4 个空格，别手动数着敲，也别一会儿 Tab 一会儿空格。

## else 与 elif：两条路，多条路

光有 `if` 只能决定“做或不做”。真实判断通常是“做 A，否则做 B”，甚至“A、B、C 三选一”。于是有两位帮手：

`else` 不需要条件，它接在 `if` 块后面，含义是“以上条件都不成立时，执行我”：

```python
行数 = 860
if 行数 == 0:
    print("文件是空的，导出可能失败了。")
else:
    print("文件有内容，开始整理。")
```

`elif` 是 “else if” 的缩写，插在 `if` 和 `else` 之间，用来加更多档位 [1]。看一个多档判断——判断手机电量该不该充：

```python
电量 = 15
if 电量 <= 10:
    print("电量告急，请马上充电。")
elif 电量 <= 30:
    print("电量偏低，建议充电。")
else:
    print("电量充足，放心用。")
```

这里有个新手最容易忽略的关键机制：`if`、`elif`、`else` 连成一整个判断结构，Python 从上往下逐条检查，**执行第一个条件为真的那块，然后整个结构就结束了，后面的条件一概不再看** [2]。也就是说，一档只走一条路。如果你自作主张把顺序换一下：

```python
if 电量 <= 30:      # 电量 15 时这里就为真
    ...
elif 电量 <= 10:    # 永远不会轮到它检查
    ...
```

电量 15 会落入“偏低”，这没错；可一旦电量跌到 5，“告急”那条也永远不会触发——因为 `<= 30` 先拦住了它。所以写多档判断时，条件要从“最苛刻”往“最宽松”排，或者反过来用上限区间把档位切干净。

这个结构的执行路径，画出来更直观：

```mermaid
flowchart TD
    A["检查电量"] --> B{"电量 <= 10？"}
    B -- "是" --> C["打印：电量告急，请马上充电"]
    B -- "否" --> D{"电量 <= 30？"}
    D -- "是" --> E["打印：电量偏低，建议充电"]
    D -- "否" --> F["打印：电量充足，放心用"]
```

`else` 是整个链条里唯一没有条件的收尾档——只有前面全为 `False` 时才轮到它，所以它必须是最后一个。

## 一个完整例子：把“把关标准”交给脚本

把三档判断套到你每天的真实场景里。假设你每天下午导出一份销售数据，文件有时是空的（导出失败），有时只有十几行（多半漏了数据），正常时是几百上千行。过去你得逐个打开看，现在把把关标准写进代码：

```python
行数 = 12
if 行数 == 0:
    print("文件是空的，导出可能失败了。")
elif 行数 < 50:
    print(f"只有 {行数} 条记录，可能漏了数据，请人工核对。")
else:
    print(f"共 {行数} 条记录，开始整理。")
```

把 `行数` 依次改成 `0`、`12`、`860` 各跑一遍，程序会分别说出三句不同的话。规则一旦写定，程序就会毫无怨言地按同一标准检查每一次——人眼盯三天会累，脚本盯三年不会。这就是“让电脑替你干活”的第一层意思：**把你看情况办事的经验，翻译成看得见、不会忘的规则**。

到这里，程序已经会“记住数据”（变量）、“说出结果”（f-string）、“自己拿主意”（`if`）。可你多半已经注意到一个别扭的地方：真实报表不是一两个数字，是几百行记录，每一行都要做类似的检查或处理，总不能让代码把那几行判断复制八百遍。把“对每一行都做一遍同样的事”交给程序，正是下一站——`for` 循环。

## 来源

1. [Python 官方教程：More Control Flow Tools —— if 语句写法、elif 是 else if 的缩写、elif 可有多个而 else 可选](https://docs.python.org/3/tutorial/controlflow.html)
2. [Python 语言参考：Compound statements —— if 语句逐条评估条件、只执行第一个为真的分支、其余不再执行或评估](https://docs.python.org/3/reference/compound_stmts.html)

---

原文：https://pangzhengboyin.com/articles/python-if-else-elif-conditionals-64673915

> **庞征博引** · 想学的，慢慢都会
>
> 庞征博引是把想学的东西写成连载的 AI 学习工具。说出想学什么，它会先了解你的基础，再把主题写成一篇篇 5–10 分钟能读完的文章；边读边问，接下来学什么跟着你走。这篇就是这样写出来的。
>
> 开始你自己的连载 → https://pangzhengboyin.com
