上一篇结尾留了个预告:真正替你干活的程序,得会 看情况行事——金额超过 100 就发提醒,行数少得可疑就报警。可到目前为止,你写的代码都只会老老实实从上往下执行,每个 print 都必然跑一遍,一步不多、一步不少。这一篇就解决这个关键缺口:程序怎么自己问“是还是否”,并根据答案只走该走的那条路。今天要掌握四个东西:比较运算符、if 的写法、缩进规则、以及 else 和 elif 两个帮手。至于把多个条件用 and、or 组合、在条件里再套一个 if,那是后面的事,今天不碰。
判断的原料:比较运算符产生布尔值
程序拿什么来“问问题”?答案是上一篇认识的布尔类型——True 和 False。那时它只是静静躺在类型表格里的一行,今天它正式上岗:判断的依据就是布尔值。
怎么产生布尔值?拿两个东西比一比。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” 的缩写,插在 if 和 else 之间,用来加更多档位 1。看一个多档判断——判断手机电量该不该充:
1电量 = 15
2if 电量 <= 10:
3 print("电量告急,请马上充电。")
4elif 电量 <= 30:
5 print("电量偏低,建议充电。")
6else:
7 print("电量充足,放心用。")这里有个新手最容易忽略的关键机制:if、elif、else 连成一整个判断结构,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"共 {行数} 条记录,开始整理。")把 行数 依次改成 0、12、860 各跑一遍,程序会分别说出三句不同的话。规则一旦写定,程序就会毫无怨言地按同一标准检查每一次——人眼盯三天会累,脚本盯三年不会。这就是“让电脑替你干活”的第一层意思:把你看情况办事的经验,翻译成看得见、不会忘的规则。
到这里,程序已经会“记住数据”(变量)、“说出结果”(f-string)、“自己拿主意”(if)。可你多半已经注意到一个别扭的地方:真实报表不是一两个数字,是几百行记录,每一行都要做类似的检查或处理,总不能让代码把那几行判断复制八百遍。把“对每一行都做一遍同样的事”交给程序,正是下一站——for 循环。