第2章 2.1 if/elif/else 条件分支
🎯 开场 3 分钟:为什么要学这个?
上一章我们做了一个个人名片生成器,学会了用变量、print、input 这些基本功。现在你每次运行程序,它都是一条道走到黑——从开头执行到结尾,不会拐弯。
但现实生活不是这样的。
早上出门前,你会想:
- 如果下雨了,就带伞
- 如果没下雨,就不用带
这就是条件分支——根据不同情况,走不同的路。没有它,程序就是个愣头青,永远只会执行一套逻辑。
今天学完,你就能写出会"看情况办事"的程序——根据用户输入、数据内容、时间点不同,做不同响应。
🧱 基础 25 分钟:核心概念
2.1.1 if 语句:最简单的判断
是什么:if 就是"如果……就……"的意思。
生活类比:就像红绿灯——绿灯行,红灯停。程序遇到 if,就先看条件是否为真,为真就执行块里的代码。
怎么用:
weather = "下雨"
if weather == "下雨":
print("记得带伞!")
输出:
记得带伞!
注意!weather == "下雨" 这里的 == 是比较,不是赋值 =。新手最容易在这里犯错,把 == 写成 =,程序不会报错,但逻辑完全错了。
2.1.2 if/else:两条路选一条
是什么:if 只能处理"对了怎么办",else 就是"不对怎么办"。
生活类比:考试60分以上及格,以下不及格。不是及格就是不及格,必然走一条路。
怎么用:
score = 75
if score >= 60:
print("及格了!")
else:
print("不及格,要加油了")
输出:
及格了!

2.1.3 if/elif/else:多条路选一条
是什么:当情况超过两种时,用 elif(else if 的缩写)来处理。
生活类比:买东西打折——消费500以上8折,300以上9折,其他不打折。三个情况三选一。
怎么用:
consumption = 400
if consumption >= 500:
print("总价:", consumption * 0.8, "元(8折)")
elif consumption >= 300:
print("总价:", consumption * 0.9, "元(9折)")
else:
print("总价:", consumption, "元(不打折)")
输出:
总价: 360.0 元(9折)
注意:elif 可以有多个,按顺序匹配,一旦命中就执行对应的块,后面的 elif/else 不会再看了。
2.1.4 嵌套 if:判断里面再判断
是什么:在 if 的执行块里,再放一个 if。
生活类比:进游乐园——先看你有没有票,有票再看是不是VIP,VIP可以走快速通道。
怎么用:
has_ticket = True
is_vip = False
if has_ticket:
print("可以入场")
if is_vip:
print("VIP用户,请走快速通道")
else:
print("普通用户,请排队")
else:
print("没票,不能入场")
输出:
可以入场
普通用户,请排队

坑来了:嵌套层次太深代码会很难读,一般超过3层就要考虑重构。
2.1.5 pass:占位符,什么都不做
是什么:pass 是 Python 的空操作语句,意思就是"这里什么都不会发生"。
为什么要用:有时候你写了 if 语句,但暂时没想好分支里要做什么代码。直接空着会报错,pass 就能帮你占着这个位置。
怎么用:
age = 20
if age >= 18:
pass # 成年人逻辑还没想好,先留着
else:
print("未成年")
输出:没有任何输出,因为 pass 就是"什么都不做"。
2.1.6 真相与假象:truthy 和 falsy
是什么:在 Python 里,不只是 True/False 能在 if 判断里用。很多值可以被当成"真"或"假"来对待。
生活类比:说"有空吗",回答的不一定是"有空/没空"两种,可能回答"我很忙"(假)或者"随时可以"(真)。
Python 的规则:
| 值 | 被当成 |
|---|---|
0, 0.0, "", [], {}, None |
假(Falsy) |
| 非零数字,非空字符串/列表/字典 | 真(Truthy) |
怎么用:
name = ""
if name:
print(f"你好,{name}!")
else:
print("请输入你的名字")
输出:
请输入你的名字
空字符串 "" 是 falsy,所以走了 else 分支。
再看一个列表的例子:
shopping_list = ["苹果", "香蕉"]
if shopping_list: # 非空列表,truthy
print("要买", len(shopping_list), "样东西")
else:
print("购物清单是空的")
输出:
要买 2 样东西
🔥 实战 35 分钟:3 个递进的小项目
项目 1:体温检测小工具(5 分钟)
场景:疫情期间,写一个体温检测程序,根据体温判断是否可以进入场所。
完整代码:
temperature = 37.3
print("=== 体温检测 ===")
print(f"当前体温:{temperature}°C")
if temperature < 36.5:
print("体温过低,请重新测量")
elif temperature < 37.3:
print("体温正常,请通行")
else:
print("体温异常,不能进入")
预期输出:
=== 体温检测 ===
当前体温:37.3°C
体温异常,不能进入
一句话解释:用连续的条件判断(elif)来划分多个区间,36.5度以下、36.5-37.3度、37.3度以上三选一。
项目 2:小明的购物清单分类统计(15 分钟)
场景:小明去超市买了这些东西,按分类统计花销。
完整代码:
# 小明的购物清单:商品, 价格, 分类
shopping_list = [
{"name": "可口可乐", "price": 3, "category": "饮料"},
{"name": "农夫山泉", "price": 2, "category": "饮料"},
{"name": "薯片", "price": 8, "category": "零食"},
{"name": "巧克力", "price": 15, "category": "零食"},
{"name": "鸡蛋", "price": 20, "category": "食材"},
{"name": "青菜", "price": 5, "category": "食材"},
]
# 按分类统计
total_by_category = {}
total_price = 0
for item in shopping_list:
category = item["category"]
price = item["price"]
# 如果是新分类,先初始化为0
if category not in total_by_category:
total_by_category[category] = 0
total_by_category[category] += price
total_price += price
# 输出结果
print("=== 小明的购物统计 ===")
print(f"总消费:{total_price}元\n")
for category, amount in total_by_category.items():
print(f"{category}类:{amount}元")
预期输出:
=== 小明的购物统计 ===
总消费:53元
饮料类:5元
零食类:23元
食材类:25元
一句话解释:用 if category not in 判断是否是新的分类,是的话先初始化计数器。
项目 3:个人支出记录工具(15 分钟)
场景:做一个命令行支出记录工具,可以添加支出、查看分类汇总、查看是否超预算。
完整代码:
import json
from datetime import datetime
# 存储支出的列表
expenses = []
def add_expense():
"""添加一笔支出"""
print("\n--- 添加支出 ---")
category = input("分类(餐饮/交通/购物/娱乐/其他):")
amount = float(input("金额:"))
note = input("备注(可选):")
expense = {
"date": datetime.now().strftime("%Y-%m-%d"),
"category": category,
"amount": amount,
"note": note if note else ""
}
expenses.append(expense)
print(f"已添加:{category} {amount}元")
def show_summary():
"""显示支出汇总"""
if not expenses:
print("\n目前没有支出记录")
return
total = 0
by_category = {}
for e in expenses:
total += e["amount"]
cat = e["category"]
if cat not in by_category:
by_category[cat] = 0
by_category[cat] += e["amount"]
print(f"\n=== 支出汇总(总计 {total} 元)===")
for cat, amount in by_category.items():
print(f" {cat}:{amount}元")
def check_budget(budget):
"""检查是否超预算"""
total = sum(e["amount"] for e in expenses)
remaining = budget - total
print(f"\n=== 预算检查 ===")
print(f"预算:{budget}元,已花费:{total}元")
if remaining < 0:
print(f"⚠️ 已超预算 {-remaining} 元!")
else:
print(f"还剩 {remaining} 元")
def main():
budget = float(input("请设置本月预算:"))
while True:
print("\n===== 支出记录工具 =====")
print("1. 添加支出")
print("2. 查看汇总")
print("3. 检查预算")
print("4. 退出")
choice = input("请选择(1-4):")
if choice == "1":
add_expense()
elif choice == "2":
show_summary()
elif choice == "3":
check_budget(budget)
elif choice == "4":
print("再见!")
break
else:
print("无效选择,请重试")
main()
预期输出示例:
请设置本月预算:1000
===== 支出记录工具 =====
1. 添加支出
2. 查看汇总
3. 检查预算
4. 退出
请选择(1-4):1
--- 添加支出 ---
分类(餐饮/交通/购物/娱乐/其他):餐饮
金额:35
备注(可选):午饭
已添加:餐饮 35.0元
===== 支出记录工具 =====
请选择(1-4):2
=== 支出汇总(总计 35.0 元)===
餐饮:35.0元
一句话解释:用 if/elif/else 菜单选择,配合字典统计和 truthy 判断(if not expenses)实现完整的小工具。
💪 进阶 20 分钟:常见坑 + 性能小贴士
坑 1:赋值 = 和比较 == 傻傻分不清
# ❌ 错误示例
age = 18
if age = 20: # 语法上没问题,但逻辑错了!
print("成年了")
# ✅ 正确示例
age = 18
if age == 20:
print("刚好20岁")
说白了:一个等号是"把右边的东西装进左边的盒子",两个等号是"看看两边的值一不一样"。
坑 2:条件写反了
# ❌ 错误示例
if not age >= 18: # 双重否定,容易晕
print("未成年")
# ✅ 正确示例
if age < 18:
print("未成年")
说白了:条件太复杂时,试着换个写法,让自己一眼就能看懂。
坑 3:elif 的条件写重复了
# ❌ 错误示例
score = 85
if score >= 90:
print("优秀")
elif score >= 80: # 85 >= 80 为真,会进这个分支
print("良好")
elif score >= 60:
print("及格")
# ✅ 正确示例
# 条件按从大到小写,命中后就不会看后面了
score = 85
if score >= 90:
print("优秀")
elif score >= 80:
print("良好")
elif score >= 60:
print("及格")
else:
print("不及格")
说白了:elif 的条件是"从上往下挨个问,问到第一个对的就停下"。
坑 4:忘了处理边界情况
# ❌ 错误示例
name = ""
if name: # 空字符串是 falsy,不会进这个分支
print(f"Hello, {name}")
# 什么都不输出,用户不知道为什么
# ✅ 正确示例
name = ""
if name:
print(f"Hello, {name}")
else:
print("请输入名字") # 明确告诉用户要输入
说白了:每个 if 最好都有 else 分支,或者至少想清楚"如果什么都不满足怎么办"。
坑 5:嵌套太深
# ❌ 错误示例(嵌套4层,阅读困难)
if is_login:
if is_vip:
if has_coupon:
if coupon_amount > 0:
print("可以使用优惠券")
# ✅ 正确示例(用 and 合并条件)
if is_login and is_vip and has_coupon and coupon_amount > 0:
print("可以使用优惠券")
说白了:嵌套太深说明条件可能可以合并,或者逻辑需要重构。
性能小贴士:把常走的路放前面
# 如果90%的情况都是普通用户
# ❌ 把 VIP 判断放前面(每次先判断小概率事件)
if is_vip:
handle_vip()
elif is_admin:
handle_admin()
else:
handle_normal()
# ✅ 把普通用户放前面(直接命中大多数情况)
if is_normal:
handle_normal()
elif is_vip:
handle_vip()
elif is_admin:
handle_admin()
说白了:程序从上往下执行,把常走的路放前面,程序就少判断几次。
调试技巧:print 大法
def find_user(users, user_id):
for user in users:
print(f"检查用户:{user}") # 调试print,看看循环到哪了
if user["id"] == user_id:
print(f"找到了:{user}") # 调试print,确认找到了
return user
print("没找到用户") # 调试print,确认没找到
return None
说白了:怀疑哪出错就在那前面加 print,程序跑起来你就知道它到底在想什么了。
✏️ 练习题 + 作业题
练习题(10 分钟)
练习 1(2 分钟):改条件
- 输入:temperature = 38.5
- 预期输出:体温异常,不能进入
- 提示:把项目 1 的温度改成 38.5,看看输出什么
练习 2(2 分钟):加一个判断
- 输入:在练习 1 的基础上,体温超过 39 度要提示"高烧"
- 预期输出:体温异常,高烧请就医
- 提示:用 elif 加一个新的条件分支
练习 3(2 分钟):处理新数据
- 输入:用项目 2 的方法,统计以下水果销量:
fruits = [
{"name": "苹果", "count": 10, "type": "国产"},
{"name": "车厘子", "count": 3, "type": "进口"},
{"name": "香蕉", "count": 15, "type": "国产"},
]
- 预期输出:国产水果共 25 斤,进口水果共 3 斤
- 提示:把
category换成type,把price换成count
练习 4(2 分钟):串起两个项目
- 输入:用项目 2 的分类统计方法,找出项目 3 支出最多的分类
- 预期输出:显示支出最多的分类和金额
- 提示:遍历 by_category 字典,找最大的那个值
练习 5(2 分钟):读懂报错
- 输入:下面代码为什么输出"未成年"?
age = 20
if age = 18:
print("成年了")
else:
print("未成年")
- 预期输出:分析并修复
- 提示:
age = 18把 age 改成了 18,if 判断的是赋值后的值
作业题(30 分钟 - 2 小时)
作业:做一个「成绩分级查询工具」
需求描述:老师输入一个学生的成绩,程序根据成绩给出等级和建议。
功能点:
1. 输入成绩,判断等级(90+ 优秀、80-89 良好、70-79 中等、60-69 及格、<60 不及格)
2. 针对每个等级给出学习建议
3. 支持多次查询,输入 q 退出
4. 统计本次查询了多少次、优秀率是多少
加分项:
1. 处理非法输入(成绩不在 0-100 范围内)
2. 保存查询记录到文件
验收标准:
- 能跑起来
- 输入不同成绩给出正确等级
- 有统计功能
提交方式:评论区贴代码或 GitHub 链接
📚 总结 + 资源
本章核心 3 点
- if/elif/else:让程序学会"看情况办事",根据不同条件走不同分支
- 嵌套和缩进:Python 用缩进表示代码块,嵌套层次不要太深
- truthy/falsy:很多值可以被当成真假来判断,空值和零通常是假
延伸资源
- Python 官方文档:if 语句
- 《Python编程:从入门到实践》第5章「条件判断」
- 视频:B站小甲鱼《零基础入门学习Python》第35讲
互动钩子
你在实际工作中遇到过需要用 if/elif/else 判断的场景吗?比如自动化脚本里判断文件类型、数据处理时分类汇总?评论区聊聊,老粉优先回复!
下章剧透:如果 if/elif/else 是"问问题选答案",那下一章的 match-case 就是"看东西选菜单"——它能让你写出一眼就能看懂的"查表式"代码,特别适合处理那种选项特别多的情况。敬请期待!

评论(0)