第2章 2.1 if/switch 条件分支
「上章回顾」 上一章我们学会了怎么处理用户输入、给程序留"后门"(错误处理),就像学会了怎么跟电脑对话。但光会对话还不够——你跟电脑说「买这件衣服」,电脑会问:「买哪件?买几件?有没有优惠券?」电脑得学会做「选择题」,才能真正帮你干活。这一章,我们让电脑长出「判断力」。
🎯 开场 3 分钟:为什么要学条件分支?
场景引入:超市收银台的思考
你去超市买水果,结账时收银台在想什么呢?
如果 买了超过5个苹果 → 打8折
否则 如果 办了会员卡 → 减5元
否则 如果 今天周三 → 满100减20
否则 → 按原价
这就是条件分支——根据不同情况,走不同的路。程序也一样:用户输入不同,程序就做不同的事。
痛点问题
- ❌ 「我的程序只能做一件事,输入什么都一个结果,太傻了」
- ❌ 「不知道怎么处理用户的错误输入,比如年龄填了负数」
学了能解决什么
- 根据不同情况执行不同代码
- 处理用户输入的边界情况(年龄不能\n\n
\n\n
\n\n为负数) - 让程序变得「聪明」——会根据条件做判断
🧱 基础 25 分钟:核心概念
概念1:if 语句——最基础的「如果…就…」
生活类比:如果明天下雨,就带伞。不下雨就不带。
为什么要用:程序需要根据条件真假,决定要不要执行某段代码。
# 小明的购物判断
age = 20
if age >= 18:
print("已成年,可以购买会员")
输出:
已成年,可以购买会员
if 后面跟一个条件(age >= 18),条件成立就执行缩进的代码块。
概念2:else——「否则」的后路
生活类比:如果下雨就带伞,否则戴帽子。
为什么要用:条件不满足时,需要有兜底的方案。
# 继续小明的购物
is_student = False # 不是学生
if is_student:
print("学生票半价")
else:
print("请购买全价票")
输出:
请购买全价票
else 必须在 if 后面,它的意思是「上面的条件不满足,就走这里」。
概念3:elif——多个条件的「分叉路口」
生活类比:如果下雨就带伞,如果下雪就穿冲锋衣,否则就戴帽子。
为什么要用:现实情况往往不只有两种可能,需要多个分支。
# 小明买水果,根据会员等级打折
member_level = "gold" # gold=金牌, silver=银牌, normal=普通
if member_level == "gold":
print("金牌会员:7折优惠")
elif member_level == "silver":
print("银牌会员:8折优惠")
elif member_level == "normal":
print("普通会员:9折优惠")
else:
print("不是会员,原价购买")
输出:
金牌会员:7折优惠
elif 是 "else if" 的缩写,可以加无数个。else 放最后当保底。
概念4:Python 3.10+ match 语句——更优雅的多选一
生活类比:就像查字典——输入「苹果」找到「水果」,输入「白菜」找到「蔬菜」。
为什么要用:当你的条件是「等于某个具体值」时,match 比 if/elif 更清晰。
# 用 match 判断水果类型
fruit = "apple"
match fruit:
case "apple":
print("苹果是水果")
case "banana":
print("香蕉是水果")
case "carrot":
print("胡萝卜是蔬菜")
case _:
print("不认识这种食物")
输出:
苹果是水果
case _ 是通配符,相当于 else。
概念5:三元运算符——一行搞定简单判断
生活类比:就像快捷方式——「如果有钱就吃火锅,否则吃泡面」可以压缩成一行。
为什么要用:简单的 if/else 可以写得更简洁。
# 判断是否成年
age = 16
status = "成年" if age >= 18 else "未成年"
print(f"小明{status}")
输出:
小明未成年
值1 if 条件 else 值2——条件成立取值1,否则取值2。
概念6:条件中的「且/或/非」
生活类比:进入游乐园的条件是「有票 且 (大于120cm 或 有大人陪同)」。
为什么要用:复杂条件需要组合多个判断。
# 复合条件判断
has_ticket = True
height = 130
has_adult = False
# 进入条件:有票 且 (身高够 或 有大人)
if has_ticket and (height >= 120 or has_adult):
print("可以进入游乐园")
else:
print("不能进入")
输出:
可以进入游乐园
and= 且(两边都要成立)or= 或(至少一边成立)not= 非(取反)
🔥 实战 35 分钟:3 个递进小项目
项目1(5分钟):BMI计算器
根据身高体重判断体型。
# bmi_calculator.py
height = 1.75 # 米
weight = 70 # 公斤
bmi = weight / (height ** 2)
print(f"BMI值:{bmi:.1f}")
if bmi < 18.5:
print("体型:偏瘦")
elif bmi < 24:
print("体型:正常")
elif bmi < 28:
print("体型:超重")
else:
print("体型:肥胖")
输出:
BMI值:22.9
体型:正常
解释:计算BMI后,用 if/elif/else 判断属于哪个区间。
项目2(15分钟):学生成绩分类器
从CSV读取学生成绩,输出等级。
# grade_classifier.py
import csv
# 模拟CSV数据(实际可以从文件读取)
students = [
{"name": "小明", "score": 85},
{"name": "小红", "score": 72},
{"name": "小刚", "score": 91},
{"name": "小芳", "score": 55},
{"name": "小李", "score": 78},
]
print("=" * 30)
print("学生成绩等级一览")
print("=" * 30)
for student in students:
name = student["name"]
score = student["score"]
# 等级判断
if score >= 90:
grade = "A"
elif score >= 80:
grade = "B"
elif score >= 70:
grade = "C"
elif score >= 60:
grade = "D"
else:
grade = "E"
# 及格/不及格标记
status = "及格" if score >= 60 else "不及格"
print(f"{name}:{score}分 → {grade}等 [{status}]")
print("=" * 30)
print(f"共{len(students)}名学生")
输出:
==============================
学生成绩等级一览
==============================
小明:85分 → B等 [及格]
小红:72分 → C等 [及格]
小刚:91分 → A等 [及格]
小芳:55分 → E等 [不及格]
小李:78分 → C等 [及格]
==============================
共5名学生
解释:用循环处理每个学生,用 if/elif/else 判断等级。
项目3(15分钟):智能购物车折扣计算器
根据商品类型和会员等级,计算最终价格。
# shopping_cart.py
# 小明的购物清单
cart = [
{"name": "iPhone手机", "price": 6999, "type": "电子产品"},
{"name": "T恤", "price": 199, "type": "服装"},
{"name": "进口奶粉", "price": 388, "type": "食品"},
{"name": "运动鞋", "price": 599, "type": "服装"},
]
member_level = "silver" # 普通=normal, 银牌=silver, 金牌=gold
def calculate_discount(item, member):
"""计算单个商品的折扣"""
price = item["price"]
item_type = item["type"]
# 基础折扣(会员等级)
if member == "gold":
base_discount = 0.7 # 7折
elif member == "silver":
base_discount = 0.85 # 85折
else:
base_discount = 1.0 # 不打折
# 品类额外优惠
if item_type == "食品":
# 食品95折(政府补贴)
type_discount = 0.95
elif item_type == "服装":
# 服装满200减30
if price >= 200:
price = price - 30
return price # 已经减过,直接返回
type_discount = 1.0
else:
type_discount = 1.0
return price * base_discount * type_discount
print("🛒 小明的购物车")
print("-" * 45)
print(f"{'商品':<15} {'原价':>8} {'折后价':>8}")
print("-" * 45)
total_original = 0
total_final = 0
for item in cart:
original = item["price"]
final = calculate_discount(item, member_level)
total_original += original
total_final += final
print(f"{item['name']:<12} {original:>8.1f} {final:>8.1f}")
print("-" * 45)
print(f"{'合计':<15} {total_original:>8.1f} {total_final:>8.1f}")
print(f"{'节省':<15} {'-':>8} {total_original - total_final:>8.1f}")
print("-" * 45)
print(f"会员等级:{member_level}")
输出:
🛒 小明的购物车
---------------------------------------------
商品 原价 折后价
---------------------------------------------
iPhone手机 6999.0 5949.2
T恤 199.0 169.2
进口奶粉 388.0 312.5
运动鞋 599.0 569.0
---------------------------------------------
合计 8185.0 6999.9
节省 - 1185.1
---------------------------------------------
会员等级:silver
解释:
1. 根据会员等级决定基础折扣
2. 食品有额外95折
3. 服装满200减30(特殊处理)
4. 最终价格 = 原价 × 会员折扣 × 品类折扣
💪 进阶 20 分钟:常见坑 + 技巧
坑1:赋值 = 和比较 == 傻傻分不清
# ❌ 错误写法(这是赋值,不是比较!)
age = 18
if age = 20: # SyntaxError!
print("成年人")
# ✅ 正确写法
age = 18
if age == 20:
print("20岁")
记忆口诀:「一个等号是赋值,两个等号才比较」
坑2:忘记了 elif 的互斥性
# ❌ 错误写法(用两个独立 if)
age = 25
if age >= 18:
print("成年人")
if age < 30: # 这个也会执行!
print("30岁以下")
# ✅ 正确写法(elif 是互斥的)
age = 25
if age >= 18:
print("成年人")
elif age < 30: # 只有上面不满足才判断这里
print("30岁以下")
注意:elif 一旦某个条件满足,后面的都不看了。
坑3:比较字符串忘了加引号
# ❌ 错误写法
member = "gold"
if member == gold: # NameError: name 'gold' is not defined
print("金牌会员")
# ✅ 正确写法
member = "gold"
if member == "gold":
print("金牌会员")
注意:字符串比较要加引号,否则 Python 以为你在比较变量。
坑4:空值 None 和 False 混淆
# ❌ 错误判断
data = None
if data == False: # 永远不走这里!
print("没有数据")
# ✅ 正确写法
data = None
if data is None: # 用 is None 判断空值
print("没有数据")
elif data == False:
print("数据是False")
技巧:is None 判断空值,== False 判断布尔假。
坑5:缩进不一致
# ❌ 错误写法(混用空格和 Tab)
name = "小明"
if name == "小明":
print("你好") # 用的是Tab
else:
print("再见") # 用的是4个空格
# ✅ 正确写法(统一用4个空格)
name = "小明"
if name == "小明":
print("你好")
else:
print("再见")
注意:Python 中Tab和空格不能混用!建议在编辑器里把 Tab 转换为空格。
性能小贴士:把常走的路放前面
# 假设90%的用户都是普通会员
# ❌ 低效写法(每次都判断3次)
if member == "gold":
discount = 0.7
elif member == "silver":
discount = 0.85
elif member == "normal":
discount = 1.0
# ✅ 高效写法(把最常见的放前面)
if member == "normal": # 90%的人会直接命中
discount = 1.0
elif member == "silver":
discount = 0.85
else: # gold
discount = 0.7
原理:CPU 遇到 return/break 会提前结束判断,减少不必要的计算。
调试技巧:加 print 中间变量
# 复杂条件判断时,先打印中间结果
age = 25
is_student = True
has_coupon = False
# ❌ 直接写容易出错
if (age < 18 or is_student) and has_coupon:
print("特殊优惠")
# ✅ 加中间变量,逐步调试
is_young_or_student = age < 18 or is_student
can_use_coupon = has_coupon and is_young_or_student
print(f"age={age}, is_student={is_student}, has_coupon={has_coupon}")
print(f"is_young_or_student={is_young_or_student}, can_use_coupon={can_use_coupon}")
if can_use_coupon:
print("特殊优惠")
技巧:把复杂条件拆成多个中间变量,方便定位问题。
✏️ 练习题
练习1(1分钟):改年龄判断
age = 20
# 在下面写 if 判断:
# 如果 age >= 18,打印 "成年人",否则打印 "未成年"
- 预期输出:
成年人
练习2(2分钟):加一个会员等级
member = "normal"
# 用 if/elif/else 判断:
# normal → "普通会员"
# silver → "银牌会员"
# gold → "金牌会员"
# 其他 → "不认识这个等级"
- 预期输出:
普通会员
练习3(5分钟):计算购物找零
total_price = 156
paid = 200
# 如果 paid >= total_price,计算并打印找零
# 否则打印 "钱不够,还差XX元"
- 预期输出:
找零:44元
练习4(8分钟):改进BMI计算器
在项目1的基础上:
- 增加「偏瘦」和「肥胖」的提示
- 偏瘦建议「多吃点」
- 肥胖建议「多运动」
练习5(10分钟):修复报错
小明写了这段代码,但运行报错:
score = 85
if score >= 60:
print("及格")
elif score >= 80:
print("良好")
elif score >= 90:
print("优秀")
问题是:分数85明明满足>=80,但为什么只打印了"及格"?
请修复代码。
📚 作业:做一个折扣计算器
需求:做一个命令行折扣计算器
功能点:
1. 输入商品原价和折扣码,自动计算折后价
2. 折扣码规则:SAVE10(减10元)、SAVE20(减20元)、PERCENT30(7折)
3. 如果折扣码不认识,提示「无效折扣码」
4. 额外功能:满200包邮,否则收10元运费
加分项:
1. 支持输入多个商品,累加计算
2. 显示节省了多少钱
验收标准:
- 能运行
- 输入 150 + SAVE10 → 输出折后价 140(加运费 150)
- 输入 250 + PERCENT30 → 输出折后价 175(包邮)
📚 总结
本文学了3个核心点:
1. if/elif/else 是程序的「决策器」,让程序学会做选择
2. 多个互斥条件用 elif,记得把最可能的情况放前面
3. match(Python 3.10+)是更优雅的多选一,但 if/elif/else 更通用
延伸资源:
- 官方文档:https://docs.python.org/3/tutorial/controlflow.html
- 书籍:《Python编程:从入门到实践》第5章
- 视频:B站「小甲鱼Python入门」条件控制部分
互动钩子:你在写代码时,因为条件判断写过什么bug?评论区聊聊,老粉优先回复!
下章预告:这一章电脑学会了「做判断」,但如果要让电脑「重复做一件事100次」,难道要写100行代码?下一章我们教电脑学会「循环」——让它自己知道什么时候该停下。

评论(0)