第2章 2.1 if/elif/else 条件分支
上章我们用 for 循环做出了「个人名片生成器」,能批量打印名片了。但你有没有想过:如果我想根据不同的人显示不同的称呼怎么办?比如 VIP 客户要显示「尊贵的 VIP 用户」,普通客户显示「亲爱的用户」,那程序怎么「做选择」?
这就是今天要解决的问题——程序的选择能力。
🎯 开场 3 分钟:为什么要学这个?
你有没有遇到过这种情况:
- 超市结账时:如果购物满 200 元,打 8 折;没满 200 元,原价
- 成绩单打印时:90 分以上显示「优秀」,60-90 分显示「及格」,60 分以下显示「不及格」
- 登录验证时:密码正确显示「欢迎」,密码错误显示「密码错误」
这些场景的共同点是什么?
同一个输入,不同情况,程序要做不同的反应。
如果你只会「顺序执行」,那程序永远只会走一条路。但现实世界充满了「如果...就...」的分支决策。if/elif/else 就是 Python 给你的「决策工具」。
学完这章,你就能写出会根据不同情况做不同反应的智能程序。
🧱 基础 25 分钟:核心概念
2.1.1 if 语句:最基础的「如果...就...」
生活类比:就像红绿灯——「如果是绿灯,就通行;如果是红灯,就停下」。
为什么要用:让程序在不同条件下执行不同的代码。
怎么用:
# 场景:判断年龄是否成年
age = 20
if age >= 18:
print("已成年,可以投票")
print("程序结束")
运行结果:
已成年,可以投票
程序结束
解释:第 3 行检查 age >= 18 是否为真,如果为真就执行缩进内的 print;否则跳过,直接执行第 5 行。
注意:if 后面的条件结尾要有冒号
:,而且满足条件要执行的代码必须缩进(4 个空格或 1 个 Tab)。

2.1.2 else 语句:「否则...」
生活类比:如果明天不下雨,就去爬山;否则就在家看电影。
为什么要用:当条件不满足时,给程序一条「退路」。
怎么用:
# 场景:判断成绩是否及格
score = 55
if score >= 60:
print("及格了!")
else:
print("没及格,再接再厉")
print("程序结束")
运行结果:
没及格,再接再厉
程序结束
解释:第 3 行判断 score >= 60,55 不满足条件,所以执行 else 分支的第 7 行。
2.1.3 elif 语句:「否则如果...」
生活类比:考试成绩分类——90 分以上是「优秀」,80-90 分是「良好」,60-80 分是「及格」,60 分以下是「不及格」。一个 if 加多个 elif 就是处理这种多档位判断。
为什么要用:处理 3 个及以上的分支情况。
怎么用:
# 场景:成绩分类
score = 85
if score >= 90:
grade = "优秀"
elif score >= 80:
grade = "良好"
elif score >= 60:
grade = "及格"
else:
grade = "不及格"
print(f"你的成绩是:{grade}")
运行结果:
你的成绩是:良好
解释:Python 从上往下依次检查每个条件,遇到第一个满足的就执行对应代码,然后跳出整个 if-elif-else 块。所以 85 分虽然也满足 >= 60,但因为前面 >= 80 已经匹配了,就不会再往下看了。
坑来了:多个 elif 只会匹配其中一个,不会同时满足多个!
2.1.4 嵌套条件:「如果...如果...」
生活类比:进游乐园——先检查门票是否有效,如果有效,再检查是否带了危险物品。这是一种「先过第一关,再过第二关」的逻辑。
为什么要用:处理先决条件类的问题——只有满足外层条件,才考虑内层判断。
怎么用:
# 场景:VIP 用户打折
is_vip = True
purchase_amount = 150
if is_vip:
print("你是 VIP 用户")
if purchase_amount >= 100:
print("VIP 订单满 100,享 7 折优惠")
else:
print("VIP 订单未满 100,享 8 折优惠")
else:
print("普通用户")
if purchase_amount >= 200:
print("普通订单满 200,享 8 折优惠")
else:
print("普通订单不打折,原价")
运行结果:
你是 VIP 用户
VIP 订单满 100,享 7 折优惠
解释:先判断 is_vip,为真后再进入内层判断 purchase_amount >= 100。嵌套层次不要超过 3 层,否则代码会很难读。
2.1.5 pass 占位:什么都不做
生活类比:装修图纸上画了个「待定」的房间,先用粉笔打个框占位置,以后再决定里面放什么。
为什么要用:代码块必须存在,但暂时不知道要写什么,就可以用 pass 填充,否则会报语法错误。
怎么用:
# 场景:功能待实现
is_member = True
if is_member:
pass # TODO: 会员功能暂未开放
else:
print("欢迎成为新用户")
运行结果:
欢迎成为新用户
解释:if 块内有 pass,就真的什么都不做,直接跳过。如果删掉 pass,代码会报错。
2.1.6 条件判断的秘密:truthy 和 falsy
这是 Python 特有的一个概念,非常实用。
什么是 truthy:在 if 判断中,不是 False 的值都算 True。比如非零数字、非空字符串、非空列表。
什么是 falsy:以下这些值在 if 判断中直接当 False 看待:
- 0、0.0
- 空字符串 ""
- 空列表 []、空字典 {}、空集合 set()
- None
生活类比:就像你问「今天下雨了吗?」——晴天算「没有」(falsy),雨天算「有」(truthy)。你不需要说「今天降雨量是 0.0 毫米所以没下雨」,直接问「下雨了吗?」就行。
怎么用:
# 检查用户名是否填写
username = ""
if username: # 空字符串是 falsy,等价于 if False
print(f"欢迎,{username}!")
else:
print("请先填写用户名")
运行结果:
请先填写用户名
再看一个列表的例子:
# 检查购物车是否有商品
cart = ["苹果", "香蕉"]
if cart: # 非空列表是 truthy,等价于 if True
print(f"购物车有 {len(cart)} 件商品")
else:
print("购物车是空的")
运行结果:
购物车有 2 件商品
记住:以后判断「有没有」,直接用
if 变量:就行,不用写if 变量 != ""或if len(变量) > 0。

🔥 实战 35 分钟:3 个递进的小项目
项目 1(5 分钟):智能打折计算器
场景:电商促销,满 100 打 9 折,满 200 打 8 折,满 500 打 7 折。
完整代码:
# 项目 1:智能打折计算器
def calculate_discount(original_price):
"""根据原价计算折后价"""
if original_price >= 500:
discount = 0.7
label = "7折"
elif original_price >= 200:
discount = 0.8
label = "8折"
elif original_price >= 100:
discount = 0.9
label = "9折"
else:
discount = 1.0
label = "不打折"
final_price = original_price * discount
return final_price, label
# 测试几个价格
for price in [50, 150, 300, 600]:
final, label = calculate_discount(price)
print(f"原价 {price} 元 → {label} → 实付 {final} 元")
运行结果:
原价 50 元 → 不打折 → 实付 50 元
原价 150 元 → 9折 → 实付 135.0 元
原价 300 元 → 8折 → 实付 240.0 元
原价 600 元 → 7折 → 实付 420.0 元
解释:函数接收原价,逐层判断所属折扣区间,返回折后价和折扣标签。这就是商场常见的阶梯打折逻辑。
项目 2(15 分钟):学生成绩分析器(从数据文件读取)
场景:读取一份 CSV 成绩文件,给每个学生评级,输出分析报告。
首先创建一个测试文件 students.csv:
name,score
小明,92
小红,78
小刚,55
小美,88
小丽,65
完整代码:
import csv
def grade_student(score):
"""根据分数返回等级"""
if score >= 90:
return "A (优秀)"
elif score >= 80:
return "B (良好)"
elif score >= 70:
return "C (中等)"
elif score >= 60:
return "D (及格)"
else:
return "F (不及格)"
def analyze_grades(csv_file):
"""读取成绩文件并分析"""
results = []
with open(csv_file, 'r', encoding='utf-8') as f:
reader = csv.DictReader(f)
for row in reader:
name = row['name']
score = int(row['score'])
grade = grade_student(score)
results.append((name, score, grade))
# 输出报告
print("=" * 40)
print("📊 学生成绩分析报告")
print("=" * 40)
for name, score, grade in results:
print(f"{name}: {score}分 → {grade}")
# 统计各等级人数
grade_counts = {"A": 0, "B": 0, "C": 0, "D": 0, "F": 0}
for _, _, grade in results:
if grade.startswith("A"):
grade_counts["A"] += 1
elif grade.startswith("B"):
grade_counts["B"] += 1
elif grade.startswith("C"):
grade_counts["C"] += 1
elif grade.startswith("D"):
grade_counts["D"] += 1
else:
grade_counts["F"] += 1
print("-" * 40)
print("📈 等级分布:", grade_counts)
# 运行分析
analyze_grades('students.csv')
运行结果:
========================================
📊 学生成绩分析报告
========================================
小明: 92分 → A (优秀)
小红: 78分 → C (中等)
小刚: 55分 → F (不及格)
小美: 88分 → B (良好)
小丽: 65分 → D (及格)
----------------------------------------
📈 等级分布: {'A': 1, 'B': 1, 'C': 1, 'D': 1, 'F': 1}
解释:从 CSV 文件读取数据,用 if-elif-else 判断每个学生的等级,最后统计各等级分布。这个模式在数据处理中非常常见。
项目 3(15 分钟):个人日常任务分类器
场景:你有一个待办事项列表(用列表存储),自动按「紧急程度」和「耗时」分类,并给出处理建议。
完整代码:
# 项目 3:个人日常任务分类器
def classify_task(urgency, duration):
"""
根据紧急程度(1-5)和耗时(分钟)分类任务
返回:(分类名称, 处理建议)
"""
if urgency >= 4 and duration <= 30:
category = "🔥 立即执行"
advice = "放下手头工作,现在就做!"
elif urgency >= 4:
category = "📋 计划执行"
advice = "今天必须完成,加入待办列表"
elif urgency >= 3 and duration <= 15:
category = "⚡ 快速处理"
advice = "趁碎片时间快速搞定"
elif duration <= 30:
category = "📌 稍后处理"
advice = "有空再做,不要忘记就行"
else:
category = "🎯 可委托"
advice = "考虑是否能交给别人做"
return category, advice
def main():
# 模拟今日任务列表
tasks = [
{"name": "回复客户邮件", "urgency": 4, "duration": 15},
{"name": "整理项目文档", "urgency": 3, "duration": 60},
{"name": "购买办公用品", "urgency": 2, "duration": 20},
{"name": "参加周会", "urgency": 5, "duration": 45},
{"name": "更新简历", "urgency": 1, "duration": 120},
]
print("📝 今日任务分类")
print("=" * 50)
for task in tasks:
category, advice = classify_task(task['urgency'], task['duration'])
print(f"\n任务:{task['name']}")
print(f" 紧急度:{task['urgency']}/5 | 耗时:{task['duration']}分钟")
print(f" → {category}")
print(f" 建议:{advice}")
# 按紧急程度排序任务
print("\n" + "=" * 50)
print("📌 按紧急程度排序(高→低):")
sorted_tasks = sorted(tasks, key=lambda x: x['urgency'], reverse=True)
for i, task in enumerate(sorted_tasks, 1):
print(f" {i}. {task['name']} (紧急度:{task['urgency']})")
if __name__ == "__main__":
main()
运行结果:
📝 今日任务分类
==================================================
任务:回复客户邮件
紧急度:4/5 | 耗时:15分钟
→ 🔥 立即执行
建议:放下手头工作,现在就做!
任务:整理项目文档
紧急度:3 | 耗时:60分钟
→ 🎯 可委托
建议:考虑是否能交给别人做
任务:购买办公用品
紧急度:2 | 耗时:20分钟
→ 📌 稍后处理
建议:有空再做,不要忘记就行
任务:参加周会
紧急度:5 | 耗时:45分钟
→ 📋 计划执行
建议:今天必须完成,加入待办列表
任务:更新简历
紧急度:1 | 耗时:120分钟
→ 🎯 可委托
建议:考虑是否能交给别人做
==================================================
📌 按紧急程度排序(高→低):
1. 参加周会 (紧急度:5)
2. 回复客户邮件 (紧急度:4)
3. 整理项目文档 (紧急度:3)
4. 购买办公用品 (紧急度:2)
5. 更新简历 (紧急度:1)
解释:这个程序把「紧急程度」和「耗时」两个维度结合起来,用多个条件判断给任务分类,还支持按紧急度排序。这是一个真实可用的时间管理小工具。
💪 进阶 20 分钟:常见坑 + 性能小贴士
坑 1:赋值 = 和比较 == 混淆
# ❌ 错误示例
age = 18
if age = 18: # SyntaxError! 赋值不是判断
print("已成年")
# ✅ 正确示例
age = 18
if age == 18: # 用 == 比较
print("已成年")
解释:= 是把右边的值赋给左边,== 才是判断是否相等。写反了轻则报错,重则把数据改坏了。
坑 2:条件判断写了 if 变量 == True
# ❌ 画蛇添足
is_logged_in = True
if is_logged_in == True:
print("已登录")
# ✅ 直接写变量名更 Pythonic
is_logged_in = True
if is_logged_in:
print("已登录")
解释:因为 True 和 False 本身就是布尔值,直接用变量做条件判断即可,加上 == True 纯属多余。
坑 3:多个 elif 写成了多个独立的 if
# ❌ 错误:两个 if 都会执行
score = 85
if score >= 60:
print("及格")
if score >= 80:
print("良好") # 这行也会执行!
# ✅ 正确:用 elif
score = 85
if score >= 90:
print("优秀")
elif score >= 80:
print("良好")
elif score >= 60:
print("及格")
else:
print("不及格")
解释:多个独立的 if 会每个都判断一遍,而 elif 是「互斥」的,匹配一个就跳过后面的。
坑 4:条件判断用了「魔法数字」
# ❌ 数字满天飞,不知道啥意思
if status == 1:
print("处理中")
elif status == 2:
print("已完成")
elif status == 3:
print("已取消")
# ✅ 用枚举或常量
class OrderStatus:
PROCESSING = 1
COMPLETED = 2
CANCELLED = 3
status = OrderStatus.PROCESSING
if status == OrderStatus.PROCESSING:
print("处理中")
elif status == OrderStatus.COMPLETED:
print("已完成")
elif status == OrderStatus.CANCELLED:
print("已取消")
解释:数字 1、2、3 没人记得住是啥意思。用有意义的常量名,代码可读性大大提高。
坑 5:嵌套过深
# ❌ 嵌套 4 层,看着头晕
if is_vip:
if age >= 18:
if income >= 10000:
if region == "一线城市":
print("目标用户")
# ✅ 用 AND 合并条件,或者提前 return
is_target = is_vip and age >= 18 and income >= 10000 and region == "一线城市"
if is_target:
print("目标用户")
性能小贴士:把最可能匹配的条件放前面
# 假设 90% 的用户都是普通用户
# ❌ 把小概率放前面,每次都多判断一次
if user_type == "VIP":
print("尊贵的 VIP")
elif user_type == "SVIP":
print("超级 VIP")
else: # 大多数人走这里,但前面判断了两次
print("普通用户")
# ✅ 把大概率放前面
if user_type == "普通用户":
print("普通用户")
elif user_type == "VIP":
print("尊贵的 VIP")
else:
print("超级 VIP")
解释:条件判断有性能开销,把大概率匹配的条件放前面可以减少平均判断次数。
调试技巧:用 print 大法
def buggy_function(x, y):
result = x * y
if result > 100: # 假设这里有问题
result = result - 50
return result
# ❌ 直接调用,不知道哪里出错
print(buggy_function(10, 15))
# ✅ 加 print 调试
def buggy_function_debug(x, y):
result = x * y
print(f"[DEBUG] x={x}, y={y}, result={result}") # 打印中间变量
if result > 100:
result = result - 50
print(f"[DEBUG] 触发条件,result={result}")
return result
print(buggy_function_debug(10, 15))
运行结果:
[DEBUG] x=10, y=15, result=150
[DEBUG] 触发条件,result=100
100
解释:加几个 print 语句打印中间变量,能快速定位问题出在哪一步。复杂的项目用 logging 模块更专业,但 print 大法对付简单 bug 够用了。
✏️ 练习题
练习 1(2 分钟):改改条件
# 输入:把下面的年龄判断改成 60 岁以上算老年人
age = 25
if age >= 18:
print("成年人")
else:
print("未成年")
- 输入:无
- 预期输出:
成年 - 提示:把
>= 18改成>= 60,然后把输出文字改一下
练习 2(2 分钟):加一个判断
在上面的代码里再加一个 elif,判断 age >= 60 并输出 老年人。
- 输入:无
- 预期输出:
成年人 - 提示:用
elif age >= 60:加在 if 和 else 中间
练习 3(3 分钟):判断列表是否为空
my_list = [1, 2, 3]
# 用 truthy/falsy 方式判断列表是否非空
# 如果非空打印第一个元素
- 输入:无
- 预期输出:
1 - 提示:直接
if my_list:判断非空,然后print(my_list[0])
练习 4(5 分钟):用项目 2 的方法处理新数据
创建一个 CSV 文件 grades.csv,内容如下:
name,score
张三,91
李四,72
王五,88
赵六,45
用项目 2 的代码结构,读取这个文件并输出每个人的等级。
- 输入:
grades.csv文件 - 预期输出:每人一行等级(如
张三: 91分 → A (优秀)) - 提示:把
students.csv改成grades.csv,代码其他部分基本不用改
练习 5(3 分钟):找出错误
下面代码运行会报什么错?为什么?
score = 85
if score >= 60:
print("及格")
elif score >= 80:
print("良好")
else score < 60:
print("不及格")
- 预期输出:指出错误并给出正确写法
- 提示:else 后面不能加条件,elif 才是带条件的
📝 作业:做一个「个人消费分类器」
需求描述:做一个小工具,读取你的消费记录,自动分类统计。
功能点:
1. 支持从列表读取消费记录,每条记录包含:日期、金额、分类(餐饮/交通/购物/娱乐/其他)
2. 用 if-elif-else 判断金额所属区间:小额(<50)、中额(50-200)、大额(>200)
3. 输出每种消费分类的总额和平均金额
4. 判断是否超支(当月总消费 > 2000 视为超支)
加分项:
1. 支持从 CSV 文件读取消费记录
2. 用 truthy/falsy 判断分类是否存在
验收标准:
- 能跑起来,运行不报错
- 输出格式清晰,能一眼看出各分类的统计结果
- 代码有注释,说明每个 if-elif-else 在做什么
提交方式:把代码保存为 expense_tracker.py,在评论区贴代码或 GitHub 链接。
📚 总结 + 资源
本文学到的 3 个核心点:
1. if-elif-else 让你程序能「做选择」,根据不同条件走不同分支
2. 条件判断是互斥的,用 elif 而不是多个独立 if
3. Python 的 truthy/falsy 让你写 if 列表: 而不是 if len(列表) > 0:
延伸学习资源:
- Python 官方文档:Comparisons(条件判断的完整语法)
- 《Python编程:从入门到实践》第 5 章(条件判断基础)
- 视频:B站「小甲鱼」Python 教程第 38 讲(if-elif-else 详解)
互动钩子:你在实际工作中遇到过哪些「需要程序做选择」的场景?是权限判断?状态机?还是数据清洗?评论区聊聊,老粉优先回复!
下章剧透:if-elif-else 能处理 3-5 个分支,但如果你要处理 10 个、20 个分支呢?比如根据国家代码返回国家名,根据月份返回天数……下一章要讲的 match-case,专治这种「多分支选择困难症」!

评论(0)