当前位置:首页>python>《Python基础及应用》第3章 分支程序设计-3.3 复杂分支程序设计

《Python基础及应用》第3章 分支程序设计-3.3 复杂分支程序设计

  • 2026-09-10 06:31:47
《Python基础及应用》第3章 分支程序设计-3.3 复杂分支程序设计

第3章 分支程序设计 - 3.3 复杂分支程序设计

教学平台:Anaconda Jupyter Notebook

课前回顾 (Review)

 * 双路分支 (if-else):处理“非黑即白”的二选一情况。 

* 单路分支 (if):处理“满足条件则执行,否则跳过”的情况。 

* 关系与逻辑运算:>, <, ==, and, or, not 是构建条件的砖瓦。 

3.3.1 分支语句的嵌套 (Nested Branch Statements)

1. 知识点详解

在实际生活中,决策往往不是单一的。例如:“如果下雨,我就带伞;如果没下雨但风大,我就戴帽子;如果既没下雨风也不大,我就不带任何东西。” 或者更复杂的:“如果是CK学校的在校生,且成绩大于90分,则获得一等奖学金;如果是在校生但成绩在80-90之间,则获得二等奖学金…”

这就需要在 if 或 else 的代码块内部,再包含完整的 if-else 结构,这就是分支语句的嵌套。

•语法结构: 

if 条件1:    # 条件1成立时执行    if 条件2:        # 条件1和条件2都成立时执行        语句块A    else:        # 条件1成立但条件2不成立时执行        语句块Belse:    # 条件1不成立时执行    语句块C

•关键点:

1.缩进严格:Python依靠缩进来判断层级。内层的 if 必须比外层的 if 多一个缩进级别(通常是4个空格)。

2.逻辑清晰:嵌套层数不宜过多(建议不超过3层),否则代码难以阅读和维护。如果嵌套过深,应考虑使用 elif 或逻辑运算符优化。

2. 案例设计:CK学校奖学金评定系统(初级版)

场景描述: CK学校为了鼓励数字经济专业的学生,制定了初步的奖学金评定规则: 1. 首先判断学生是否为“CK”在册学生。 2. 如果是册内学生,再根据绩点(GPA)判断: * GPA >= 3.8:获得“特等奖学金”。 * 3.5 <= GPA < 3.8:获得“一等奖学金”。 * GPA < 3.5:获得“鼓励奖”。 3. 如果不是册内学生,直接提示“无评定资格”。

代码实现:

# 定义变量student_status = "CK"  # 模拟输入:'CK' 表示在册,其他表示非在册gpa = 3.9              # 模拟输入:学生的绩点print(f"--- CK学校奖学金评定系统 ---")print(f"当前学生状态:{student_status}")print(f"当前学生绩点:{gpa}")# 外层分支:判断身份if student_status == "CK":    print("身份验证通过,开始评定成绩...")    # 内层分支:判断绩点 (嵌套)    if gpa >= 3.8:        scholarship = "特等奖学金"        bonus = 5000    elif gpa >= 3.5:        # 这里虽然用了elif,但在逻辑上它属于内层判断的一部分        scholarship = "一等奖学金"        bonus = 3000    else:        scholarship = "鼓励奖"        bonus = 500    print(f"评定结果:恭喜获得【{scholarship}】,奖金 {bonus} 元!")else:    # 外层else    print("评定结果:抱歉,您不是CK在册学生,无评定资格。")

代码解析与知识点串联: 

* 变量定义:回顾了第2章的变量与数据类型(字符串、浮点数)。 

* 关系运算:>= 的使用。 

* 逻辑流:只有当 student_status == "CK" 为 True 时,程序才会进入内部去判断 gpa。如果外层为 False,内部代码完全被跳过。 

* 缩进:注意观察 if gpa >= 3.8: 及其后续代码块的缩进,它们都属于外层 if 的子块。

3.3.2 多路分支语句 if-elif-else

1. 知识点详解

当我们需要在多个互斥的条件中进行选择时(例如:成绩等级分为A、B、C、D、E五档),如果使用多层嵌套的 if-else,代码会变得像“阶梯”一样难以阅读。Python提供了 elif (else if 的缩写) 来优雅地解决这个问题。

•语法结构:

if 条件1:    语句块1elif 条件2:    语句块2elif 条件3:    语句块3...else:    语句块N

•执行流程:

1.程序从上到下依次判断条件。

2.一旦某个条件为 True,执行对应的语句块,然后立即跳出整个结构,不再判断后续条件。

3.如果所有 if 和 elif 都不满足,则执行 else 块(如果有的话)。

•优势:扁平化结构,逻辑清晰,避免了深层嵌套。

2. 案例设计:CK学校食堂智能推荐系统

场景描述: 重庆的夏天炎热,冬天湿冷。CK学校食堂根据当前的气温(temperature)和天气状况(weather),利用多路分支为学生推荐不同的窗口菜品。

•气温 > 30℃:推荐“清凉窗口”(凉面、冰粉)。

•20℃ < 气温 <= 30℃:推荐“家常窗口”(回锅肉、炒青菜)。

•10℃ < 气温 <= 20℃:推荐“温暖窗口”(红烧肉、热汤)。

•气温 <= 10℃:推荐“火锅窗口”(重庆老火锅、冒菜)。

•特殊情况:如果下雨(weather == 'rain')且气温 <= 20℃,优先推荐“室内快餐”(避免排队淋雨)。

注意:为了演示 elif 的顺序重要性,我们将优先判断气温,再在特定区间内结合逻辑运算处理下雨情况,或者调整顺序优先处理特殊逻辑。这里我们采用优先处理特殊逻辑的方式,展示 elif 的灵活性。

代码实现:

# 模拟输入temperature = 15.5  # 摄氏度weather = 'rain'    # 'sunny', 'rain', 'cloudy'print(f"--- CK学校食堂智能推荐 ---")print(f"当前气温:{temperature}℃, 天气:{weather}")recommendation = ""# 多路分支逻辑if weather == 'rain' and temperature <= 20:    # 优先判断特殊情况:下雨且较冷,推荐室内快餐    recommendation = "室内快餐窗口(避免淋雨,快速用餐)"elif temperature > 30:    recommendation = "清凉窗口(推荐:凉面、冰粉)"elif temperature > 20:    # 20 < temp <= 30    recommendation = "家常窗口(推荐:回锅肉、炒青菜)"elif temperature > 10:    # 10 < temp <= 20 (且不是下雨天,因为上面已经拦截了)    recommendation = "温暖窗口(推荐:红烧肉、热汤)"else:    # temperature <= 10    recommendation = "火锅窗口(推荐:重庆老火锅、冒菜)"print(f"系统推荐您前往:{recommendation}")

代码解析与知识点串联: 

* 逻辑运算结合:第一个 if 使用了 and (回顾3.1节),体现了复杂条件的组合。 

* 顺序敏感性:elif 的顺序至关重要。如果把 temperature > 10 放在 weather == 'rain' 之前,那么下雨天的特殊逻辑可能无法被正确捕获(取决于具体写法)。

 * 互斥性:一旦满足 temperature > 30,后面的 elif 都不会执行,提高了效率。

3.3.3 程序异常处理 (Exception Handling)

1. 知识点详解

程序在运行过程中,难免会遇到错误(如:用户输入了字母而不是数字、文件不存在、除以零等)。如果不处理,程序会直接崩溃(Crash),给用户极差的体验。Python 提供了 try-except 结构来捕获和处理这些异常。

•语法结构: 

try:    # 可能出错的代码块    语句块Aexcept 异常类型 as e:    # 当发生指定异常时执行的代码    print(f"出错了:{e}")    语句块Belse:    # 如果没有发生异常,执行这里的代码    语句块Cfinally:    # 无论是否发生异常,最后都会执行的代码(常用于资源关闭)    语句块D

•常见异常类型:

–ValueError: 值错误(如 int('abc'))。

–ZeroDivisionError: 除以零。

–NameError: 变量未定义。

–TypeError: 类型错误。

–Exception: 捕获所有异常(通用兜底)。

2. 案例设计:CK图书馆借阅数量计算器

场景描述: CK图书馆允许学生输入想借书的数量。但是,学生可能会输入非法字符(如”五本”)、负数或者巨大的数字。我们需要用异常处理来保证程序不崩溃,并给出友好提示。

代码实现:

print("--- CK图书馆借阅系统 ---")try:    # 尝试将用户输入转换为整数    book_count_str = input("请输入您想借阅的书籍数量:")    book_count = int(book_count_str)    # 业务逻辑检查(主动抛出异常或逻辑判断)    if book_count < 0:        # 手动抛出 ValueError        raise ValueError("借阅数量不能为负数!")    elif book_count > 20:        print("温馨提示:每人每次限借20本,已为您自动调整为20本。")        book_count = 20except ValueError as ve:    # 捕获值错误(包括转换失败和手动抛出)    print(f"输入无效:{ve}")    print("请确保输入的是正整数。")except Exception as e:    # 捕获其他未知错误    print(f"发生未知错误:{e}")else:    # 没有异常时执行    print(f"成功登记!您将借阅 {book_count} 本书籍。")finally:    # 无论成功与否,都执行    print("感谢使用CK图书馆系统,祝您阅读愉快!")

代码解析与知识点串联: 

* 输入输出:input() 返回的是字符串,必须用 int() 转换。 

* 主动抛出:raise 关键字允许我们在逻辑判断不符合时(如负数),人为制造一个异常,统一由 except 处理,使代码结构更清晰。 

* 流程控制:else 块只有在 try 完美执行时才运行;finally 块总是运行,适合做“收尾”工作。

3.3.4 3个程序设计实例

本节将通过三个综合实例,将嵌套、多路分支和异常处理结合起来,解决CK学校的实际问题。

实例一:CK宿舍电费阶梯计费系统

需求: 重庆夏季用电量大,CK宿舍实行阶梯电价: 

1. 月用电量 <= 100度:0.5元/度。 

2. 100 < 用电量 <= 200度:超出100的部分,0.8元/度。 

3. 用电量 > 200度:超出200的部分,1.2元/度。 

4. 需处理用户输入非数字的情况。

def calculate_electricity_fee():    print("\n=== 实例一:CK宿舍电费计算 ===")    try:        usage_str = input("请输入本月用电量(度):")        usage = float(usage_str)        if usage < 0:            print("错误:用电量不能为负数。")            return        fee = 0.0        level = ""        if usage <= 100:            fee = usage * 0.5            level = "第一阶梯"        elif usage <= 200:            # 分段计算            fee = 100 * 0.5 + (usage - 100) * 0.8            level = "第二阶梯"        else:            fee = 100 * 0.5 + 100 * 0.8 + (usage - 200) * 1.2            level = "第三阶梯"        print(f"用电等级:{level}")        print(f"本月电费总额:{fee:.2f} 元") # 保留两位小数    except ValueError:        print("输入错误:请输入有效的数字。")    except Exception as e:        print(f"系统异常:{e}")# 调用函数calculate_electricity_fee()

实例二:CK校园运动会报名资格筛选

需求: CK举办运动会,不同项目有不同要求: 

* 百米赛跑:仅限大一、大二学生,年龄<22岁。 

* 马拉松:仅限大三、大四生,需提交体检证明(模拟输入 ‘yes’/‘no’)。 

* 趣味接力:全校皆可,但需组队(人数>=4)。 * 使用嵌套和多路分支处理逻辑。

def sports_registration():    print("\n=== 实例二:CK运动会报名 ===")    grade = input("请输入年级(大一/大二/大三/大四):")    age = int(input("请输入年龄:"))    event = input("想报名的项目(百米/马拉松/接力):")    eligible = False    reason = ""    if event == "百米":        if grade in ["大一", "大二"]:            if age < 22:                eligible = True            else:                reason = "年龄超限(需<22岁)"        else:            reason = "年级不符(仅限大一、大二)"    elif event == "马拉松":        if grade in ["大三", "大四"]:            health_check = input("是否有体检证明?(yes/no): ")            if health_check.lower() == 'yes':                eligible = True            else:                reason = "缺少体检证明"        else:            reason = "年级不符(仅限高年级)"    elif event == "接力":        team_size = int(input("请输入组队人数:"))        if team_size >= 4:            eligible = True        else:            reason = f"人数不足(需>=4人,当前{team_size}人)"    else:        reason = "未知项目"    if eligible:        print(f"✅ 报名成功!您已报名参加【{event}】。")    else:        print(f"❌ 报名失败:{reason}")# 注意:实际运行时需处理输入非整数的异常,此处为简化逻辑略去try-except,# 建议学生在练习时自行添加异常处理。# sports_registration() 

实例三:CK简易登录验证系统(综合版)

需求: 模拟CK教务系统登录: 

1. 输入用户名和密码。 

2. 用户名固定为 “ck_student”,密码固定为 “2026pass”。 

3. 允许尝试3次,超过3次锁定账户。 

4. 结合 while 循环(回顾第4章预告)或仅用分支模拟单次逻辑? 

* 修正:本章主要讲分支,我们用一个带有计数器的逻辑来模拟多次尝试的分支判断,或者简单演示一次登录中的多重判断。 

* 调整:为了紧扣“分支”主题,我们设计一个单次登录但包含多重验证的逻辑:验证格式 -> 验证账号 -> 验证密码 -> 验证验证码。

def login_system():    print("\n=== 实例三:CK教务系统登录 ===")    # 模拟数据库    correct_user = "ck_student"    correct_pwd = "2026pass"    try:        user = input("用户名:")        pwd = input("密码:")        captcha = input("验证码 (输入 'aBcD'):")        # 1. 验证验证码 (大小写敏感)        if captcha != "aBcD":            print("❌ 验证码错误!")            return # 直接结束函数        # 2. 验证用户名        if user != correct_user:            print("❌ 用户名不存在!")            return        # 3. 验证密码        if pwd == correct_pwd:            print("✅ 登录成功!欢迎进入CK教务系统。")            # 这里可以嵌套判断用户角色等            role = "student"            if role == "student":                print(">> 跳转至学生个人中心...")        else:            print("❌ 密码错误!")    except Exception as e:        print(f"系统故障:{e}")login_system()

🤖 AI 辅助学习:让代码“活”起来

任务一:用分支语句画一颗“爱心”

目标:利用 if-else 或数学公式结合分支,在控制台打印出一个爱心形状。 AI提示词建议: > “我是一个Python初学者,正在学习分支结构。请帮我写一段Python代码,使用嵌套的 for 循环和 if-else 分支语句,在控制台打印出一个爱心图案。请详细注释每一行代码,特别是 if 判断条件是如何决定打印星号还是空格的。另外,请解释这个逻辑如何体现了‘多路分支’的思想(如果有用到的话)。”

学习要点: * 观察AI生成的代码中,if 条件是如何通过坐标 (x, y) 的关系来判断是否在爱心轮廓内的。 * 尝试修改 if 中的数学公式,看看爱心形状会发生什么变化(变胖、变瘦、变形)。

任务二:设计一个“情绪化”的异常处理机器人

目标:创建一个程序,当用户输入错误时,机器人会根据错误次数表现出不同的“情绪”(幽默、严肃、安慰),这需要用到计数器(变量)和多重 if-elif 分支。 AI提示词建议: > “请帮我设计一个Python程序,模拟一个‘情绪化’的输入验证机器人。 > 要求: > 1. 让用户输入一个整数。 > 2. 如果用户输入错误(触发 ValueError),机器人会记录错误次数。 > 3. 使用 if-elif-else 多路分支: > - 第1次错误:机器人说‘哎呀,不小心手滑了吗?再试一次吧~’ > - 第2次错误:机器人说‘有点不对劲哦,请仔细检查输入的是不是数字。’ > - 第3次及以上:机器人说‘警告!系统即将锁定,请立即输入正确的数字!’ > 4. 请使用 try-except 结构捕获异常。 > 请提供完整代码,并告诉我如何在 Jupyter Notebook 中运行它。”

学习要点: * 学习如何将变量状态(错误次数)与分支逻辑结合。 * 体会异常处理不仅仅是报错,还可以用来构建友好的用户交互流程。 * 互动挑战:运行AI给出的代码后,试着让AI“把机器人的语气变得更像重庆方言”,看看AI如何修改字符串输出,增加趣味性。

任务三:CK校园天气穿衣指南(进阶版)

目标:让AI生成一个更复杂的决策树,不仅考虑温度,还考虑湿度(重庆特色)、风力,并输出建议的穿搭图片描述(使用ASCII Art或简单的字符画)。 AI提示词建议: > “我要为CK学校(位于重庆)制作一个智能穿衣助手。请编写一个Python程序: > 1. 输入:温度、湿度(0-100)、风力等级。 > 2. 逻辑:使用复杂的嵌套 if-elif-else。 > - 重庆特色:如果湿度>80%且温度>25,提示‘闷热,建议穿透气短袖’。 > - 如果温度<10且风力>3,提示‘湿冷刺骨,务必穿羽绒服并戴围巾’。 > - 其他情况给出常规建议。 > 3. 输出:除了文字建议,请用字符画(ASCII Art)简单画一件对应的衣服(如T恤、羽绒服的简笔画)。 > 请确保代码结构清晰,并在 Jupyter Notebook 中可直接运行。”

学习要点: * 综合应用逻辑运算符 (and, or) 和嵌套分支。 * 体验编程解决实际生活问题的乐趣。 * 通过字符画输出,直观看到分支结果的不同。

课后作业: 1. 完善“实例二:运动会报名”,加入 try-except 处理用户输入年龄为非数字的情况。 2. 利用AI辅助,设计一个“CK食堂今日特价”程序,根据星期几(周一到周日)和时段(早餐、午餐、晚餐)输出不同的特价菜,要求至少使用3层逻辑判断。 3. 将本节课的三个实例代码复制到你的 Jupyter Notebook 中,逐行调试,并尝试修改参数,观察输出变化。

最新文章

随机文章