第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("不及格,要加油了")

输出

及格了!

配图1 - 配图1

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("没票,不能入场")

输出

可以入场
普通用户,请排队

配图2 - 配图2

坑来了:嵌套层次太深代码会很难读,一般超过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 点

  1. if/elif/else:让程序学会"看情况办事",根据不同条件走不同分支
  2. 嵌套和缩进:Python 用缩进表示代码块,嵌套层次不要太深
  3. truthy/falsy:很多值可以被当成真假来判断,空值和零通常是假

延伸资源

  • Python 官方文档:if 语句
  • 《Python编程:从入门到实践》第5章「条件判断」
  • 视频:B站小甲鱼《零基础入门学习Python》第35讲

互动钩子

你在实际工作中遇到过需要用 if/elif/else 判断的场景吗?比如自动化脚本里判断文件类型、数据处理时分类汇总?评论区聊聊,老粉优先回复!


下章剧透:如果 if/elif/else 是"问问题选答案",那下一章的 match-case 就是"看东西选菜单"——它能让你写出一眼就能看懂的"查表式"代码,特别适合处理那种选项特别多的情况。敬请期待!

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