第2章 2.1 if/switch 条件分支

「上章回顾」 上一章我们学会了怎么处理用户输入、给程序留"后门"(错误处理),就像学会了怎么跟电脑对话。但光会对话还不够——你跟电脑说「买这件衣服」,电脑会问:「买哪件?买几件?有没有优惠券?」电脑得学会做「选择题」,才能真正帮你干活。这一章,我们让电脑长出「判断力」。


🎯 开场 3 分钟:为什么要学条件分支?

场景引入:超市收银台的思考

你去超市买水果,结账时收银台在想什么呢?

如果 买了超过5个苹果 → 打8折
否则 如果 办了会员卡 → 减5元
否则 如果 今天周三 → 满100减20
否则 → 按原价

这就是条件分支——根据不同情况,走不同的路。程序也一样:用户输入不同,程序就做不同的事。

痛点问题

  • ❌ 「我的程序只能做一件事,输入什么都一个结果,太傻了」
  • ❌ 「不知道怎么处理用户的错误输入,比如年龄填了负数」

学了能解决什么

  • 根据不同情况执行不同代码
  • 处理用户输入的边界情况(年龄不能\n\nSimple tech illustration expla\n\nAI comic creation scene, creat\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 语句——更优雅的多选一

生活类比:就像查字典——输入「苹果」找到「水果」,输入「白菜」找到「蔬菜」。

为什么要用:当你的条件是「等于某个具体值」时,matchif/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行代码?下一章我们教电脑学会「循环」——让它自己知道什么时候该停下。

声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。