第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 中,逐行调试,并尝试修改参数,观察输出变化。