条件语句:if/elif/else、三元表达式

一句话概述

条件语句是程序做出判断的核心机制,让代码能够根据不同的情况执行不同的逻辑。Python 通过 ifelifelse 关键字构建多分支判断结构,同时还提供了简洁的三元表达式来实现单行条件赋值。掌握条件语句,才能写出有「智能感」的程序——这也是 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)的表达式。包括:比较运算符(==><>=<=!=)、成员运算符(innot in)、身份运算符(isis not)、逻辑运算符组合(andornot),以及直接返回布尔值的函数调用。在 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>=90score>=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_permissionif 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。注意边界条件的处理在实际开发中非常重要。