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

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

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

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

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

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

1行数 = 860
2print(行数 > 800)    # 输出 True
3print(行数 == 0)     # 输出 False

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

if 的写法:冒号开门,缩进的代码才归它管

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

1行数 = 0
2if 行数 == 0:
3    print("文件是空的,导出可能失败了。")
4
5print("检查完毕。")

运行后输出两行:先是“文件是空的……”,再是“检查完毕。”。把 行数 改成 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 块后面,含义是“以上条件都不成立时,执行我”:

1行数 = 860
2if 行数 == 0:
3    print("文件是空的,导出可能失败了。")
4else:
5    print("文件有内容,开始整理。")

elif 是 “else if” 的缩写,插在 ifelse 之间,用来加更多档位 1。看一个多档判断——判断手机电量该不该充:

1电量 = 15
2if 电量 <= 10:
3    print("电量告急,请马上充电。")
4elif 电量 <= 30:
5    print("电量偏低,建议充电。")
6else:
7    print("电量充足,放心用。")

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

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

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

这个结构的执行路径,画出来更直观:

正在绘制图表

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

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

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

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

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

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