Python if 条件判断
我们要做一组“根据情况给出下一步提示”的小程序:红灯时停车、根据成绩输出等级、登录后检查作业。它们都在解决同一个问题:条件不同,程序应该走哪条路线?
先从“条件成立时才提示”开始,再处理“不成立时也要有结果”“多个结果只能选一个”“只有前一步成功才继续判断”,最后把简单的二选一赋值缩短成条件表达式。
这种“条件不同,执行路线不同”的结构叫作分支。Python 使用 if、elif 和 else 编写分支。
单分支判断:if
先解决第一个问题:成绩达到 60 分时显示“成绩及格”,成绩不够时暂时不输出提示。
只需要在条件成立时执行一段代码,可以单独使用 if:
score = 75
if score >= 60:
print("成绩及格")score >= 60 的结果是布尔值:
- 条件为
True,执行缩进的代码 - 条件为
False,跳过缩进的代码
基本语法如下:
if condition:
... # 条件成立时执行写 if 时先注意三点:
if后面需要一个能够判断真假的条件- 条件后面必须写英文冒号
: - 属于
if的代码需要统一缩进 4 个空格
缩进决定代码属于哪个分支。缩进结束后,后面的代码会恢复正常顺序执行。
双分支判断:if...else
但交通信号灯不能只处理红灯;如果不是红灯,程序也必须告诉我们下一步怎么做。
如果条件成立和不成立时都要执行代码,可以增加 else:
light = "红灯"
if light == "红灯":
print("立刻停车")
else:
print("继续前行")
print("完成本次判断")运行结果:
立刻停车
完成本次判断if 和 else 只会执行其中一个分支。最后一条 print() 没有缩进,不属于任何分支,所以判断结束后一定会执行。
程序的执行路线如下:
多分支判断:if...elif...else
如果结果不止两个怎么办?成绩等级和信号灯都有多个互斥结果,程序需要从上到下选择第一个匹配的分支。
需要在多个互斥条件中选择一个结果时,可以使用 elif。elif 可以理解为“否则,如果……”。
基本语法如下:
if condition1:
... # 条件 1 成立时执行
elif condition2:
... # 条件 2 成立时执行
elif condition3:
... # 条件 3 成立时执行
else:
... # 前面的条件都不成立时执行Python 会从上到下检查条件。一旦找到第一个为 True 的条件,就执行对应分支,并跳过后面的其他分支。
案例:交通信号灯
先把“红灯、绿灯和其他状态分别怎么处理”这个任务写出来:
light = "绿灯"
if light == "红灯":
print("立刻停车")
elif light == "绿灯":
print("继续前行")
else:
print("观察信号灯后再行动")运行结果:
继续前行这里的三个结果互相排斥,每次只会选择一个分支。
案例:成绩等级
接下来把同样的结构用于更常见的成绩反馈问题:
假设成绩范围是 0~100,根据分数输出等级:
| 分数 | 等级 |
|---|---|
| 90~100 | 优秀 |
| 80~89 | 良好 |
| 70~79 | 中等 |
| 60~69 | 及格 |
| 0~59 | 暂未及格 |
第一种写法把每个分数区间完整写出来:
score = int(input("请输入成绩:"))
if score >= 90:
print("优秀")
elif score >= 80 and score < 90:
print("良好")
elif score >= 70 and score < 80:
print("中等")
elif score >= 60 and score < 70:
print("及格")
else:
print("暂未及格")这段代码可以继续简化。因为 Python 只会进入第一个满足条件的分支,所以执行到第二个条件时,已经能够确定成绩小于 90:
score = int(input("请输入成绩:"))
if score >= 90:
print("优秀")
elif score >= 80:
print("良好")
elif score >= 70:
print("中等")
elif score >= 60:
print("及格")
else:
print("暂未及格")条件必须从高分到低分排列。如果先写 score >= 60,那么 90 分也会在第一个分支中匹配,后面的等级就没有机会执行。
如果全部写成独立的 if 会怎样
如果把“只能选一个等级”误写成多个独立 if,会出现什么结果?
运行下面的代码:
score = 95
if score >= 90:
print("优秀")
if score >= 80:
print("良好")
if score >= 70:
print("中等")
if score >= 60:
print("及格")
else:
print("暂未及格")运行结果:
优秀
良好
中等
及格这些 if 彼此独立,每个条件都会单独判断。最后的 else 只和它前面的 if score >= 60 配对,不会和上面所有 if 共同组成多分支。
多个独立 if 并不是错误。当多个条件可以同时成立,并且每个成立的条件都要执行时,就应该使用多个 if。成绩等级只能选择一个结果,所以这里更适合使用 if...elif...else。
嵌套判断
前面的多分支解决了“从同一组条件中选一个结果”,但有些任务有先后依赖:只有第一步成功后,才有必要检查下一步。
如果只有在第一层条件成立后,才需要继续判断第二层条件,可以把一个 if 写进另一个分支中。这种结构叫作嵌套判断。
if condition1:
... # 第一层条件成立
if condition2:
... # 第二层条件也成立
else:
... # 第二层条件不成立
else:
... # 第一层条件不成立嵌套判断没有增加新的关键字,重点是看清缩进层级。
案例:细分未及格成绩
成绩等级已经给出大类;现在继续解决“未及格后还要给出不同建议”的问题:
在前面的成绩等级基础上,继续细分 60 分以下的情况:
score = int(input("请输入成绩:"))
if score >= 90:
print("优秀")
elif score >= 80:
print("良好")
elif score >= 70:
print("中等")
elif score >= 60:
print("及格")
else:
print("暂未及格")
if score < 40:
print("建议先复习基础知识")
elif score < 50:
print("建议完成补充练习")
else:
print("已经接近及格,继续练习")只有成绩低于 60 分时,程序才会进入外层 else,继续执行里面的第二层判断。
案例:检查作业提交
提交作业前,需要先登录;登录后,还要确认作业内容不能为空。这两个条件存在先后依赖,适合使用嵌套判断:
is_logged_in = True
if is_logged_in:
homework = input("请输入作业内容:").strip()
if homework:
print("作业提交成功")
else:
print("作业内容不能为空")
else:
print("请先登录")这里不能只看条件数量。选择嵌套结构的原因是:只有登录成功后,才需要接收并检查作业内容。
不要嵌套得太深
嵌套层级越多,代码越难阅读。当前阶段先保证每一层判断关系清楚,并通过空行和统一缩进区分代码块。
条件表达式
最后一个问题:如果只是把两个值中的较大者保存到变量,是否需要写完整的多行分支?
如果判断只是“根据一个条件选择两个值”,可以使用条件表达式。它也常被叫作三元表达式。
先看普通的 if...else 写法:
number1 = int(input("请输入第一个数字:"))
number2 = int(input("请输入第二个数字:"))
if number1 > number2:
max_number = number1
else:
max_number = number2
print("较大的数字:", max_number)使用条件表达式可以写成:
number1 = int(input("请输入第一个数字:"))
number2 = int(input("请输入第二个数字:"))
max_number = number1 if number1 > number2 else number2
print("较大的数字:", max_number)条件表达式的结构是:
条件成立时的值 if 条件 else 条件不成立时的值它适合简单的二选一赋值。如果分支中需要执行多条语句,继续使用普通的 if...else,不要为了缩短代码强行写成一行。
小结
本章沿着 5 个问题推进:
- 只在条件成立时执行什么?使用
if - 条件不成立时也要有结果怎么办?使用
if...else - 多个互斥结果如何只选一个?使用
if...elif...else - 后一个判断依赖前一个条件怎么办?使用嵌套
if - 只做简单的二选一赋值,如何缩短写法?使用条件表达式
写判断语句时,重点检查条件顺序、英文冒号和缩进层级。