第14集:嵌套条件语句

本集学习目标

  • 理解什么是嵌套条件语句
  • 掌握嵌套if语句的语法和用法
  • 学会处理多层次的条件判断
  • 掌握嵌套的缩进规则
  • 通过实际练习掌握嵌套条件语句的使用

什么是嵌套条件语句?

嵌套条件语句是指在一个条件语句的代码块中再包含另一个条件语句。就像俄罗斯套娃一样,一个套一个。

生活中的类比

  • 如果下雨,就带伞;如果带伞且风大,就要打结实一点的伞
  • 如果考试及格,就去看电影;如果看电影且周末,就去影院;如果不是周末,就在家看

语法结构

if 条件1:
    # 外层if的代码块
    if 条件2:
        # 内层if的代码块
        代码块1
    else:
        # 内层else的代码块
        代码块2
else:
    # 外层else的代码块
    代码块3

基本示例

示例1:简单的嵌套

number = 15

# 第一层:判断正负
if number > 0:
    print("这是一个正数")
    # 第二层:判断奇偶
    if number % 2 == 0:
        print("这是一个偶数")
    else:
        print("这是一个奇数")
else:
    print("这不是一个正数")

输出

这是一个正数
这是一个奇数

执行流程

  1. 判断 number > 0:15 > 0 → True
  2. 执行外层if的代码块,输出"这是一个正数"
  3. 进入内层if,判断 number % 2 == 0:15 % 2 = 1 → False
  4. 执行内层else,输出"这是一个奇数"

示例2:三层嵌套

score = 85
attendance = 90

# 第一层:判断是否及格
if score >= 60:
    print("成绩及格")
    # 第二层:判断 attendance
    if attendance >= 80:
        print("出勤率良好")
        # 第三层:判断是否优秀
        if score >= 90:
            print("成绩优秀")
        else:
            print("成绩良好")
    else:
        print("出勤率不足")
else:
    print("成绩不及格")

输出

成绩及格
出勤率良好
成绩良好

嵌套if-elif-else

示例3:嵌套if-elif-else

age = 17
has_permission = False

# 外层:判断年龄
if age >= 18:
    print("你已经成年了")
    # 内层:判断是否有权限
    if has_permission:
        print("你有权限访问")
    else:
        print("你没有权限访问")
elif age >= 14:
    print("你是青少年")
    # 内层:判断是否有监护人
    if has_permission:
        print("在监护人陪同下可以访问")
    else:
        print("需要监护人陪同")
else:
    print("你太小了,不能访问")

输出

你是青少年
需要监护人陪同

示例4:成绩分类系统

score = 85
is_retest = False

if score >= 60:
    print("及格")
    if score >= 90:
        print("优秀")
        if is_retest:
            print("虽然是补考,但表现优秀!")
    elif score >= 80:
        print("良好")
    elif score >= 70:
        print("中等")
    else:
        print("及格边缘")
else:
    print("不及格")
    if is_retest:
        print("补考也不及格,需要重修")
    else:
        print("准备补考吧")

输出

及格
良好

实际应用案例

案例1:登录验证系统

username = "admin"
password = "123456"
is_active = True

# 验证用户名
if username == "admin":
    print("用户名正确")
    # 验证密码
    if password == "123456":
        print("密码正确")
        # 检查账户状态
        if is_active:
            print("登录成功!")
        else:
            print("账户已被禁用")
    else:
        print("密码错误")
else:
    print("用户名不存在")

输出

用户名正确
密码正确
登录成功!

案例2:购物优惠系统

total_amount = 1500
is_member = True

# 判断是否达到优惠门槛
if total_amount >= 1000:
    print("达到满减门槛")
    # 判断是否是会员
    if is_member:
        print("会员用户")
        if total_amount >= 2000:
            discount = 0.7  # 7折
        elif total_amount >= 1500:
            discount = 0.75  # 7.5折
        else:
            discount = 0.8  # 8折
    else:
        print("非会员用户")
        discount = 0.9  # 9折
else:
    print("未达到优惠门槛")
    discount = 1.0  # 无折扣

final_price = total_amount * discount
print(f"最终价格:¥{final_price:.2f}")

输出

达到满减门槛
会员用户
最终价格:¥1125.00

案例3:学生综合评价系统

score = 85
attendance = 90
behavior = 80

# 综合评价
if score >= 60:
    print("成绩:及格")
    if attendance >= 80:
        print("出勤:良好")
        if behavior >= 80:
            print("表现:优秀")
            print("综合评价:优秀学生")
        elif behavior >= 60:
            print("表现:良好")
            print("综合评价:良好学生")
        else:
            print("表现:一般")
            print("综合评价:需要改进表现")
    else:
        print("出勤:不足")
        print("综合评价:需要改进出勤")
else:
    print("成绩:不及格")
    if attendance >= 80:
        print("出勤良好,但成绩需要提高")
    else:
        print("出勤和成绩都需要改进")

输出

成绩:及格
出勤:良好
表现:优秀
综合评价:优秀学生

案例4:天气穿衣建议系统

temperature = 15
is_raining = True
is_windy = False

# 外层:判断温度
if temperature >= 25:
    print("天气炎热")
    print("建议:穿短袖、短裤")
elif temperature >= 15:
    print("天气舒适")
    # 中层:判断是否下雨
    if is_raining:
        print("正在下雨")
        # 内层:判断是否有风
        if is_windy:
            print("刮风下雨")
            print("建议:穿长袖,带雨衣,注意保暖")
        else:
            print("只下雨")
            print("建议:穿长袖,带雨伞")
    else:
        print("没有下雨")
        if is_windy:
            print("有风")
            print("建议:穿薄外套")
        else:
            print("无雨无风")
            print("建议:穿舒适的衣服")
else:
    print("天气寒冷")
    print("建议:穿厚衣服")
    if is_raining:
        print("记得带雨伞")

输出

天气舒适
正在下雨
只下雨
建议:穿长袖,带雨伞

案例5:游戏角色伤害计算

class_type = "warrior"  # 战士
level = 30
weapon_level = 25
has_buff = True

# 基础伤害
base_damage = 100

# 外层:判断职业
if class_type == "warrior":
    print("战士职业")
    # 中层:判断等级
    if level >= 30:
        print("高级战士")
        damage = base_damage * 1.5
        # 内层:判断武器
        if weapon_level >= 25:
            print("高级武器")
            damage *= 1.3
            # 再内层:判断是否有增益
            if has_buff:
                print("有增益效果")
                damage *= 1.2
        else:
            print("普通武器")
            damage *= 1.1
    else:
        print("初级战士")
        damage = base_damage * 1.2
elif class_type == "mage":
    print("法师职业")
    damage = base_damage * 1.3
else:
    print("其他职业")
    damage = base_damage

print(f"最终伤害:{damage:.1f}")

输出

战士职业
高级战士
高级武器
有增益效果
最终伤害:234.0

嵌套的缩进规则

缩进规则

  1. 每一层嵌套增加一级缩进(通常4个空格)
  2. 同一级别的代码块缩进必须一致
  3. 不能混用Tab和空格

示例6:正确的缩进

age = 17
has_permission = False

if age >= 18:
    print("成年")          # 4个空格
    if has_permission:
        print("有权限")    # 8个空格
    else:
        print("无权限")    # 8个空格
elif age >= 14:
    print("青少年")         # 4个空格
    if has_permission:
        print("需监护人")   # 8个空格
else:
    print("太小了")         # 4个空格

错误示例:缩进不一致

# 错误
age = 17

if age >= 18:
    print("成年")
  if has_permission:      # 错误:缩进不一致
      print("有权限")

错误IndentationError: unexpected indent

嵌套的深度

建议的嵌套深度

通常建议嵌套深度不超过3-4层,否则代码会变得难以理解和维护。

示例7:嵌套过深的问题

# 不推荐:嵌套过深
if 条件1:
    if 条件2:
        if 条件3:
            if 条件4:
                if 条件5:
                    代码

问题:代码难以阅读和维护

优化方法

  1. 提前返回(early return)
  2. 使用guard clause
  3. 使用函数封装

示例8:使用提前返回优化

# 原始代码(嵌套过深)
def check_access(age, has_permission, is_active, is_member):
    if age >= 18:
        if has_permission:
            if is_active:
                if is_member:
                    return "可以访问"
                else:
                    return "不是会员"
            else:
                return "账户未激活"
        else:
            return "无权限"
    else:
        return "年龄不足"

# 优化后的代码
def check_access(age, has_permission, is_active, is_member):
    if age < 18:
        return "年龄不足"
    if not has_permission:
        return "无权限"
    if not is_active:
        return "账户未激活"
    if not is_member:
        return "不是会员"
    return "可以访问"

实际应用:成绩管理系统

示例9:完整的成绩管理系统

def 成绩评价(score, attendance, behavior, projects):
    """
    完整的成绩评价系统
    参数:
        score: 考试成绩(0-100)
        attendance: 出勤率(0-100)
        behavior: 行为表现(0-100)
        projects: 项目成绩(0-100)
    返回:综合评价
    """

    # 外层:判断考试成绩
    if score >= 60:
        print("考试成绩:及格")
        # 中层:判断出勤率
        if attendance >= 80:
            print("出勤率:良好")
            # 内层:判断行为表现
            if behavior >= 80:
                print("行为表现:优秀")
                # 再内层:判断项目成绩
                if projects >= 85:
                    print("项目成绩:优秀")
                    return "综合评价:优秀学生"
                elif projects >= 70:
                    print("项目成绩:良好")
                    return "综合评价:良好学生"
                else:
                    print("项目成绩:一般")
                    return "综合评价:需要提高项目能力"
            elif behavior >= 60:
                print("行为表现:良好")
                return "综合评价:良好,但需改进行为"
            else:
                print("行为表现:需要改进")
                return "综合评价:需要改进行为表现"
        else:
            print("出勤率:不足")
            return "综合评价:需要改进出勤率"
    else:
        print("考试成绩:不及格")
        if attendance >= 80:
            print("出勤率良好,但成绩需要提高")
            return "综合评价:需要提高成绩"
        else:
            print("出勤率和成绩都需要改进")
            return "综合评价:需要全面改进"

# 测试
print("=" * 50)
print("测试1:各方面都优秀")
result = 成绩评价(90, 95, 90, 95)
print(f"结果:{result}")
print()

print("=" * 50)
print("测试2:成绩良好,项目一般")
result = 成绩评价(85, 90, 85, 65)
print(f"结果:{result}")
print()

print("=" * 50)
print("测试3:出勤不足")
result = 成绩评价(75, 70, 80, 80)
print(f"结果:{result}")

常见错误与注意事项

错误1:缩进不一致

# 错误:缩进不一致
age = 17

if age >= 18:
    print("成年")
    if has_permission:
      print("有权限")  # 错误:缩进不一致

正确

age = 17

if age >= 18:
    print("成年")
    if has_permission:
        print("有权限")  # 正确:缩进一致

错误2:忘记冒号

# 错误:忘记冒号
if age >= 18:
    if has_permission   # 忘记冒号
        print("有权限")

正确

if age >= 18:
    if has_permission:  # 添加冒号
        print("有权限")

错误3:嵌套过深

# 不推荐:嵌套过深
if a:
    if b:
        if c:
            if d:
                if e:
                    代码

优化:使用提前返回或提取函数

错误4:逻辑混乱

# 错误:条件顺序混乱
age = 17

if age >= 14:
    if age >= 18:
        print("成年")
    else:
        print("青少年")
else:
    print("太大了")  # 逻辑错误

正确

age = 17

if age >= 18:
    print("成年")
elif age >= 14:
    print("青少年")
else:
    print("太小了")

本集小结

  1. 嵌套条件语句是在条件语句中再包含条件语句
  2. 每一层嵌套增加一级缩进(通常是4个空格)
  3. 只执行匹配条件的代码块
  4. 嵌套层数不要超过3-4层
  5. 使用提前返回可以优化嵌套
  6. 条件的顺序很重要
  7. 保持代码的可读性
  8. 可以使用函数封装来减少嵌套
  9. 复杂的逻辑可以考虑提取为独立函数

课后练习

练习1:判断数字的正负奇偶

编写程序,判断一个数字是正奇数、正偶数、负奇数、负偶数或零。

number = -15
# 你的代码在这里

练习2:学生成绩评价

编写程序,根据成绩和出勤率评价学生:

  • 成绩>=90且出勤>=90:优秀学生
  • 成绩>=80且出勤>=80:良好学生
  • 成绩>=60且出勤>=70:合格学生
  • 其他:需要改进
score = 85
attendance = 85
# 你的代码在这里

练习3:登录验证

编写程序,验证用户名、密码和账户状态。

username = "admin"
password = "123456"
is_active = True
# 验证:用户名admin,密码123456,账户必须激活

练习4:购物优惠计算

编写程序,根据购物金额和会员等级计算折扣:

  • =2000元且VIP会员:7折

  • =1000元且VIP会员:8折

  • =1000元且普通会员:9折

  • 其他:无折扣
total = 1500
is_vip = True
# 计算折后价格

练习5:天气穿衣建议

编写程序,根据温度、天气和风力给出穿衣建议。

temperature = 15
is_raining = True
is_windy = False
# 给出穿衣建议

下集预告

下一集我们将学习第15集:while循环基础。循环是编程中最重要的控制结构之一,它可以让代码重复执行,大大提高编程效率。

敬请期待!

« 上一篇 if-elif-else多条件判断 下一篇 » while循环基础