条件语句:if/elif/else、三元表达式
一句话概述
条件语句是程序做出判断的核心机制,让代码能够根据不同的情况执行不同的逻辑。Python 通过 if、elif、else 关键字构建多分支判断结构,同时还提供了简洁的三元表达式来实现单行条件赋值。掌握条件语句,才能写出有「智能感」的程序——这也是 AI 模型决策逻辑的最基础原型。
💡 核心要点:① if 语句通过布尔值(True/False)决定代码走向 ② elif 实现多分支互斥判断,从上到下依次匹配 ③ else 作为兜底分支,处理所有未命中情况 ④ 三元表达式 x if cond else y 是单行条件赋值的利器
教学与演示
一、if 语句:程序的第一个判断
是什么:if 是 Python 中最基本的条件判断语句,当 if 后面的条件为 True 时,执行其缩进的代码块;否则跳过该代码块。
大白话 把 if 想象成家门口的门禁系统——你输入密码(条件),密码正确(True)门就开了(执行代码块),密码错误(False)门就不开(跳过代码块)。
为什么:真实世界的程序几乎时刻都在做判断——用户是否登录、数据是否合法、模型准确率是否达标。没有 if,程序只能机械地从头执行到尾,无法根据情况变化做出不同反应。
怎么做:
import numpy as np
# 模拟一个简单的评分判断系统
# numpy 生成一个 0 到 100 之间的随机分数
score = np.random.randint(0, 101) # 生成随机整数分数,范围[0, 100]
print(f"当前分数:{score}")
# if 语句:判断分数是否及格
if score >= 60: # 条件:分数大于等于60
print("✅ 恭喜,你及格了!") # 条件为True时执行的代码块
# 注意:if 条件为 False 时,上面的 print 不会执行
# 下面的代码不受 if 影响,始终会执行
print(f"评分结束。") # 无论是否及格,这行都会执行什么用:在 AI 模型评估中,我们经常需要判断模型准确率是否达到阈值——「如果验证集准确率 > 95%,则停止训练」,这就是典型的 if 应用。在数据清洗中,也需要判断「如果某列缺失值超过 50%,则删除该列」。
二、if/elif/else:多分支判断
是什么:if/elif/else 构成多分支条件判断结构。程序从上到下依次检查每个条件,命中第一个为 True 的条件后执行对应代码块并跳出整个结构;如果所有条件都不满足,则执行 else 代码块。
大白话 就像体检报告的等级评定:≥90 分是「优秀」, 80-89 分是「良好」, 60-79 分是「及格」, 60 以下「不及格」。你不会同时拿到两个等级,只会命中第一个满足的条件。
为什么:现实中的判断往往不止「是/否」两种结果。成绩分 A/B/C/D 档、用户分 VIP/普通/访客、风险分高/中/低——多分支判断让程序能够精细化应对不同场景。
怎么做:
import numpy as np
# 模拟 AI 模型在测试集上的准确率
accuracy = np.random.uniform(0.5, 1.0) # 生成 0.5~1.0 之间的随机浮点数
accuracy = round(accuracy, 4) # 保留4位小数,模拟真实评估精度
print(f"模型准确率:{accuracy * 100:.2f}%")
# if/elif/else 多分支判断:给模型评级
if accuracy >= 0.95: # 第一优先级:检查是否 >= 95%
grade = "S级(卓越)"
comment = "可以直接部署上线!"
elif accuracy >= 0.90: # 第二优先级:上面没命中才检查这里
grade = "A级(优秀)"
comment = "再微调一下就可以部署"
elif accuracy >= 0.80: # 第三优先级:前面都没命中才检查
grade = "B级(良好)"
comment = "需要继续优化模型"
elif accuracy >= 0.70: # 第四优先级
grade = "C级(一般)"
comment = "建议调整网络结构"
else: # 兜底分支:以上所有条件都不满足时执行
grade = "D级(需改进)"
comment = "需要重新设计模型"
print(f"评级:{grade}")
print(f"建议:{comment}")什么用:在 AI 项目中,模型部署前需要根据准确率、推理速度、内存占用等多个指标综合评级。在强化学习中,智能体根据当前状态所处的区间选择不同策略,本质上就是一个多分支判断。在 NLP 情感分析中,根据情感分数落在哪个区间输出「正面/中性/负面」。
三、三元表达式:单行条件的优雅写法
是什么:三元表达式是 if/else 的简写形式,语法为 值1 if 条件 else 值2——当条件为 True 时返回「值1」,否则返回「值2」。整个表达式求值为一个值,因此可以直接用于赋值、函数参数等场景。
大白话 就像点外卖时的选择:「下雨就不出门(点外卖)if 下雨 else 出去吃」。一个条件决定两种结果,写在一行里干脆利落。
为什么:当判断逻辑只是简单的二选一赋值时,写四行 if/else 显得冗余。三元表达式让代码更紧凑、可读性更高,特别适合在列表推导和函数调用中做内联判断。
怎么做:
import numpy as np
# 模拟一个二分类 AI 模型的预测结果
# 模型输出是 sigmoid 后的概率值,>0.5 判为正类,否则负类
prob = np.random.random() # 生成 0~1 之间的随机概率值
prob = round(prob, 4)
print(f"模型预测概率:{prob}")
# 三元表达式:一行完成二选一赋值
# 语法:结果A if 条件 else 结果B
label = "正类 🟢" if prob > 0.5 else "负类 🔴"
print(f"分类结果:{label}")
# 三元表达式的嵌套(虽然不推荐过度嵌套,但要知道可以这样做)
# 模拟三个区间的分类
score = np.random.randint(0, 101) # 生成 0~100 随机整数
print(f"\n分数:{score}")
level = "优秀" if score >= 90 else ("及格" if score >= 60 else "不及格")
print(f"等级:{level}")什么用:在 AI 数据预处理中,经常需要根据条件快速转换标签——「如果类别是 'cat' 则编码为 0,否则编码为 1」,三元表达式一行搞定。在特征工程中,根据阈值二值化特征值也是同理。PyTorch/TensorFlow 的很多代码中,三元表达式用于动态选择设备(GPU/CPU)、调整学习率等。
四、复合条件与逻辑运算符
是什么:通过 and(与)、or(或)、not(非)三个逻辑运算符,可以将多个简单条件组合成复合条件,实现更精细的判断逻辑。
大白话 就像筛选简历:「学历是硕士以上 and 工作经验3年以上」——两个条件同时满足才安排面试。而「会 Python or 会 Java」——满足一个就行。
为什么:真实场景中的判断很少只依赖单一条件。AI 模型的部署决策可能同时考虑准确率、延迟、资源占用等多个维度。复合条件让你能表达「所有条件都要满足」或「满足任意一个即可」的复杂逻辑。
怎么做:
import numpy as np
# 模拟 AI 模型部署的综合评估
# 三个关键指标
accuracy = np.random.uniform(0.85, 0.99) # 准确率
latency = np.random.randint(10, 200) # 推理延迟(毫秒)
memory = np.random.randint(100, 1000) # 内存占用(MB)
accuracy = round(accuracy, 3)
print(f"📊 模型评估报告:")
print(f" 准确率:{accuracy*100:.1f}%")
print(f" 延迟:{latency}ms")
print(f" 内存:{memory}MB")
# 复合条件:使用 and 要求所有条件同时满足
if accuracy >= 0.95 and latency < 100 and memory < 500:
print("\n✅ 全部达标,建议直接部署!")
# 使用 or:满足任意一个宽松条件即可
elif accuracy >= 0.90 or (latency < 50 and memory < 300):
print("\n⚠️ 部分达标,建议优化后部署")
# 使用 not:取反逻辑
elif not (accuracy < 0.85): # 等价于 accuracy >= 0.85
print("\n🔧 需要进一步调优")
else:
print("\n❌ 不满足部署条件,需重新训练")
# 展示逻辑运算符的短路行为(重要特性!)
print("\n--- 短路求值演示 ---")
# and 短路:左边为 False 时,右边不会执行
a = 0
result = (a != 0) and (10 / a > 5) # a=0,左边为False,右边10/0不会执行(安全!)
print(f"and 短路结果:{result}(避免了除以零错误)")
# or 短路:左边为 True 时,右边不会执行
result = (5 > 3) or (10 / 0 > 1) # 左边为True,右边10/0不会执行(安全!)
print(f"or 短路结果:{result}(避免了除以零错误)")什么用:在 AI 模型推理服务中,需要同时检查「请求速率是否超限 and GPU 显存是否充足 and 模型是否已加载」才能处理请求。在异常检测系统中,「如果数据偏差超过阈值 or 连续三次预测置信度过低」则触发告警。逻辑运算符的短路特性在避免空值错误(如 obj is not None and obj.method())中也至关重要。
概念关系图谱
| 概念 | 核心含义 | 与AI的关系 | 关联概念 |
|---|---|---|---|
| if | 单分支条件判断,条件True则执行 | 模型评分阈值判断、数据过滤 | 布尔值、缩进 |
| elif | 多分支互斥判断,从上到下匹配 | 模型等级评定、策略选择 | if、else |
| else | 兜底分支,捕获所有未命中情况 | 异常情况默认处理 | if、elif |
| 三元表达式 | 单行二选一条件赋值 | 二分类标签转换、设备选择 | if/else、赋值 |
| and | 逻辑与,两边都为True才为True | 多指标同时达标判断 | 短路求值 |
| or | 逻辑或,任一边为True即为True | 多条件任一满足触发 | 短路求值 |
| not | 逻辑非,取反 | 反向条件判断 | 布尔运算 |
| 短路求值 | 逻辑运算中提前终止计算 | 安全避免空指针错误 | and、or |
重点答疑
Q1: if 后面可以写什么类型的条件?
if 后面可以写任何最终能求值为布尔值(True/False)的表达式。包括:比较运算符(==、>、<、>=、<=、!=)、成员运算符(in、not in)、身份运算符(is、is not)、逻辑运算符组合(and、or、not),以及直接返回布尔值的函数调用。在 Python 中,非零数字、非空字符串、非空列表等「真值」也会被视为 True——这称为「真值测试」。
Q2: elif 和多个 if 有什么区别?
elif 是互斥的——多个 elif 中最多只有一个会被执行,一旦命中就跳出整个结构。而多个独立的 if 是并列的——每个都会被检查,可能执行多个分支。比如判断分数:用 if score>=90 / elif score>=80 时,95 分只会被评「优秀」;但用 if score>=90 / if score>=80 时,95 分会被同时评「优秀」和「良好」,造成逻辑错误。选择哪个取决于业务需求——互斥判断用 elif,独立判断用多个 if。
Q3: 三元表达式可以嵌套多层吗?
语法上可以(如 a if c1 else b if c2 else c),但实际上强烈不推荐。嵌套三元表达式会严重降低可读性,让代码变成「密码」。PEP 8(Python 官方风格指南)也建议避免嵌套三元表达式。如果逻辑复杂,老老实实用 if/elif/else 写多行,代码是写给人看的。
章节单词汇总
| 英文 | 音标 | 术语/释义 |
|---|---|---|
| condition | /kənˈdɪʃən/ | 条件(名词);决定程序走向的布尔表达式 |
| execute | /ˈeksɪkjuːt/ | 执行;运行代码块 |
| branch | /bræntʃ/ | 分支;程序根据不同条件走不同路径 |
| ternary | /ˈtɜːrnəri/ | 三元的;指三元表达式「x if cond else y」 |
| short-circuit | /ʃɔːrt ˈsɜːrkɪt/ | 短路;逻辑运算中提前终止求值 |
| indentation | /ˌɪndenˈteɪʃən/ | 缩进;Python 用缩进定义代码块 |
| boolean | /ˈbuːliən/ | 布尔值;只有 True 和 False 两种值 |
| evaluate | /ɪˈvæljueɪt/ | 求值;计算表达式的结果 |
面试练习
Q1 [单选] Python 中,以下哪个不是合法的条件表达式?
- A.
if x > 5: - B.
if x == 5: - C.
if x = 5: - D.
if x != 5:
解答:C 使用了赋值运算符=,而在 if 条件中应该使用比较运算符==。=是赋值操作,==是判断相等,这是初学者最常犯的错误。Python 会直接抛出 SyntaxError,因为赋值语句不能作为条件表达式。
Q2 [单选] 以下代码输出什么?x = 10; print("A") if x > 5 else print("B")
- A. B
- B. A
- C. A和B都输出
- D. 报错
解答:三元表达式中,x > 5为 True(10 > 5),所以执行print("A"),输出 A。注意:三元表达式确实可以用于控制函数调用,但通常更推荐用于值的选择而非副作用操作。
Q3 [单选] 以下哪个关于 elif 的描述是错误的?
- A. elif 可以有多个
- B. elif 必须跟在 if 之后
- C. 多个 elif 可以同时被执行
- D. elif 是 else if 的缩写
解答:C 是错误的。elif 具有互斥性,从上到下依次检查,一旦命中就跳出整个结构,最多只有一个分支被执行。如果 95 分同时满足score>=90和score>=80,只会走第一个 elif。
Q4 [多选] Python 中被视为 False 的值包括哪些?
- A.
0 - B.
None - C.
""(空字符串) - D.
[](空列表)
解答:以上全部在布尔上下文中被视为 False。此外还包括0.0、{}(空字典)、()(空元组)、set()(空集合)、False本身。这称为「假值」(Falsy values),其余值均为「真值」(Truthy values)。
Q5 [单选] 阅读代码:x = 0; if x: print("A"); else: print("B"),输出什么?
- A. A
- B. B
- C. 什么都不输出
- D. 报错
解答:x = 0,0 在 Python 的真值测试中被视为 False,所以 if 条件不成立,执行 else 分支输出 B。这就是「真值测试」的实际应用。
Q6 [多选] 关于逻辑运算符的短路求值,以下说法正确的是?
- A.
False and any_func()中 any_func() 不会被调用 - B.
True or any_func()中 any_func() 不会被调用 - C.
True and any_func()中 any_func() 不会被调用 - D. 短路求值可以用来避免除零等运行时错误
解答:A 正确(and 左边 False,直接返回 False)。B 正确(or 左边 True,直接返回 True)。C 错误(and 左边 True,还必须计算右边才能确定结果)。D 正确,x != 0 and 10/x > 5 当 x=0 时避免了除零。
Q7 [单选] 以下代码的输出是?print("及格" if 55 >= 60 else "不及格")
- A. 及格
- B. 不及格
- C. True
- D. 报错
解答:55 >= 60为 False,所以三元表达式返回else后面的值「不及格」。注意:Python 的三元表达式顺序是「真值 if 条件 else 假值」,和 C 语言的条件 ? 真值 : 假值顺序不同。
Q8 [单选] 要使程序输出「中等」,score 应该是多少?if score>=90: print("优秀") elif score>=70: print("中等") else: print("加油")
- A. 95
- B. 80
- C. 60
- D. 50
解答:score=80 时:先检查>=90为 False,再检查>=70为 True,执行「中等」。score=95 输出「优秀」;score=60 输出「加油」;score=50 输出「加油」。
Q9 [多选] 以下哪些是使用条件语句时的最佳实践?
- A. 避免过深的嵌套(超过3层)
- B. 优先处理常见或简单的条件分支
- C. 始终把 else 放在最前面
- D. 复杂条件提取为有意义的变量名
解答:A 正确,过深嵌套降低可读性,可考虑提前 return 或重构。B 正确,把最常见的分支放前面可提高可读性。C 错误,else 必须放在最后。D 正确,if user_is_admin and has_permission比if u.r == 'admin' and p.check()清晰得多。
Q10 [单选] result = "通过" if score > 60 else "不通过" 中,如果 score = 60,result 的值是?
- A. 通过
- B. 不通过
- C. None
- D. 报错
解答:条件是score > 60(严格大于),60 不大于 60,条件为 False,所以返回「不通过」。如果需求是 60 分也算通过,条件应该改为score >= 60。注意边界条件的处理在实际开发中非常重要。