第 5 课 · 多分支选择

石头剪刀布游戏

用 elif 让程序在多种情况里「一次只选一种」,把上一课绕来绕去的嵌套 if 变得又直又清楚。

120 分钟完整闭环 4 个知识点 4 段示范代码 难度 ★★
🏠 学期课件主页 ← 上一课:做选择下一课:重复的力量 →
01

本课导览

先看这节课教什么、怎么分配 120 分钟,老师心里有底,课堂节奏就不乱。

第5课多分支选择
🎯 趣味项目:石头剪刀布游戏
if-elif-else分支互斥条件顺序多条件组合
🎯教学目标(学完这节课,学生能…)
  • 掌握 if-elif-else 多分支判断的语法,能读懂「从上往下、命中即停」的执行顺序;
  • 理解多分支与嵌套 if 的区别,知道什么场景用多分支更合适;
  • 理解分支的「互斥」性:只会执行第一个成立的分支,后面不再检查;
  • 能编写一个完整的石头剪刀布对战程序(电脑先固定出拳,随机出拳第 10 课再升级)。
🔑 教学重点
  • elif = else if:多种情况里选一种
  • 从上往下检查,哪个先成立就执行哪个,执行完整个 if 就结束
🧗 教学难点 / 易卡点
  • 把 elif 拼错(如 elif 写成 else if 或 elsif)
  • 分不清多个 if 和 if-elif 的区别,导致一个条件打印多行
  • 输赢判断的多个条件不会用 and 组合
🧰课前准备(老师 / 学生)
  • 老师:准备两三个石头剪刀布的手势教具或图片;预演主项目代码,确认固定出拳也能演示平局/输/赢三种结果。
  • 学生:打开作品文件夹;今天新作品保存为「第5课_石头剪刀布.py」。
  • 课堂小道具:请每组同桌准备「石头剪刀布」玩一轮,胜者获得优先上机权(活跃气氛)。
⏱️120 分钟教学流程(建议时间轴,可按班级情况微调)
时间环节做什么 / 师生互动要点
0–5候课 · 设备检查开机 → 打开编辑器 → 确认作品文件夹就位。
5–12上节回顾 · 快问快答if 后面要加什么?缩进的代码什么时候执行?== 和 = 区别?抢答热场。
12–20情景导入先让同桌玩一局真实的石头剪刀布,再问:电脑要当裁判,该怎么判断输赢?
20–32知识讲解elif 是什么 → 和嵌套 if 对比(上节课成绩判断器写成 elif 有多清爽)→ 执行顺序与互斥。
32–50示范代码 + 上机(示例1~3)出拳数字转文字 → 星期查询器 → 主项目石头剪刀布,边敲边讲分支流程。
50–70主项目深挖 · 输赢逻辑带着学生把「你赢」的三种情况用 and 组合成一个大条件,逐行讲清平局/赢/输。
70–85课堂练习 A/B练习 1 输入 1/2/3 验证;练习 2 把电脑改成出 2(剪刀)再测;投屏找茬。
85–95挑战练习 C月份天数判断器(先不考虑闰年);学有余力的同学给游戏加规则说明。
95–105闯关小测elif 拼写、执行顺序、互斥性、多个 if 的区别等 5 题抢答。
105–115总结 · 保存作品齐读口诀;保存「第5课_石头剪刀布.py」;点出下一课升级方向:让电脑随机出拳。
115–120布置作业 · 预告布置必做/选做/思考;预告第 6 课:for 循环——让电脑自己重复干活,打印九九乘法表!

时间轴把 2 小时切成 8 段:复习→导入→讲解→示范→上机→练习→检测→小结,每段都有明确产出。

02

情景导入 · 复习热身

先用 5 分钟把上节课的记忆叫醒,再用故事和类比把新知识挂到孩子已有的经验上。

🔁上节回顾 · 快问快答(建议 5 分钟)

问 1:if 语句判断的是「一种情况」,那成绩等级判断器要判断 4 种等级,上节课怎么写的?
→ 用嵌套 if-else 一层套一层——写法能用,但层数一多就像俄罗斯套娃,容易看花眼。

问 2:if 条件后面要加什么?下面的代码要怎么排?
→ 加英文冒号 :;下面的代码要缩进(Tab)。冒号 + 缩进是 if 的固定队形。

问 3:输入 95 分,嵌套的成绩判断器会打印几个等级?
→ 一个(优秀)——因为每层二选一,最终只走一条路。

📖情景故事 · 今天学什么

运动会报名开始了!老师喊:报跳绳的站左边,报跑步的站右边,报跳远的站中间,什么都不报的回教室写作业。

同学们呼啦一下全站好了队。小刚发现:老师从头喊到尾,每个人只站了一队——先喊到谁的项目,谁就站过去,后面再喊就跟自己没关系了。

小刚突然想到:这不就是程序里的选择吗?电脑也想在「好几种情况」里选一种走,可是嵌套 if 写起来像套娃,太累了。

老师说:Python 里有个词叫 elif,就是「否则如果」。有了它,一条路一条路往下排,电脑从上往下找,找到第一个符合的就走,后面的统统不看——像不像老师喊报名?

💡生活类比:把新知识挂在旧经验上
🎤

elif = 老师挨个喊报名

从第一个开始问,问到谁谁出列,出列后后面的喊话就跟他无关了。

从上往下匹配
🔀

if-elif = 一条多岔路

路口的岔道一条接一条排开,车只会拐进第一个通的方向,不会连拐几条。

一次只走一条
🧱

elif = 给嵌套 if 做「电梯」

上节课成绩判断器一层套一层像爬楼梯,elif 把楼梯拉平成一条走廊,一眼看到底。

代码变扁平
🖐️

石头剪刀布 = 三种结果的判断

平局、你赢、电脑赢——正好三种情况,用 if-elif-else 分得清清楚楚。

三选一
🗝️本课核心口诀(板书 / 齐读)
核 心 口 诀elif 排队往下查,命中一条就停下;
互斥只走一条路,else 收尾管剩下!
03

知识讲解

分小块讲透语法点,每一块都配生活类比 + 要点小结,讲完立刻口头小试。

🎤if-elif-else——多种情况选一种

elif 是 else if 的缩写,意思是「否则如果」。当情况不止两种时,用它把条件一个个排下去:

格式长这样:if 条件1: … elif 条件2: … elif 条件3: … else: …。每个条件后都要英文冒号,下面都要缩进。

elif 想写几个就写几个,没有数量限制;最后的 else 可以省略,但写上更保险,用来接住「没想到的情况」。

和嵌套 if 对比:成绩判断器用嵌套要一层套一层,用 elif 就像排队,又直又清楚,这是 Python 推荐的多分支写法。

elif = 否则如果,可写多个每个分支都要冒号 + 缩进else 收尾,可写可不写
💡 写 elif 时注意拼写:e-l-i-f,不是 else if,也不是 elsif。
🔀多分支的执行顺序——命中即停

if-elif-else 是「互斥」的:程序从上往下检查,哪个条件先成立就执行哪个分支,执行完整个判断就结束。

一旦某个条件成立,后面的 elif 和 else 都不会再看——这就是「命中即停」。

所以条件的顺序非常重要:要把更严格、更特殊的条件放在前面。比如等级判断,先判 ≥90 再判 ≥80,顺序反了结果就乱了。

想验证?把成绩判断器的顺序打乱,输入 95 分看看会输出什么——你会立刻明白「顺序」的分量。

从上往下检查第一个成立的执行,其余跳过特殊条件放前面
💡 多分支=多条路任选其一;多个独立 if=每条路都可能走一遍。这是两种完全不同的「脾气」。
🖐️用 and 组合条件——为输赢判断做准备

石头剪刀布的输赢不是只比一个数:你出石头、电脑出剪刀才算你赢。要同时满足两个条件,就用 and(并且)。

写法:条件1 and 条件2——两个都成立,整体才成立。例:(player == 1 and computer == 2) 表示「你出石头 并且 电脑出剪刀」。

你赢一共有 3 种组合:石头赢剪刀、剪刀赢布、布赢石头。把三种用 or(或者) 连成一个大条件:(…) or (…) or (…)。

这一课先把固定出拳的逻辑跑通(电脑先出石头),第 10 课学了 random 随机数,把 computer = 1 改成随机,游戏就真正能玩了。

and = 并且,两个都要成立or = 或者,一个成立就行先把判断逻辑写对,再让它随机
💡 第 9 课会系统学 and/or/not,今天先「混个脸熟」,会用即可。
04

示范代码 · 动手做

老师先带读代码、讲注释,再让学生亲手敲一遍——敲错正好学习调试。

Python示例 1 · elif 初体验:出拳数字转文字
# 第5课:elif 示例——把玩家出的数字变成文字
player = int(input("请选择:1=石头 2=剪刀 3=布:"))

if player == 1:
    player_text = "石头"
elif player == 2:
    player_text = "剪刀"
elif player == 3:
    player_text = "布"
else:
    player_text = "未知"

print("你出了:" + player_text)
运 行 结 果
请选择:1=石头 2=剪刀 3=布:2
你出了:剪刀
✍ 分别输入 1、2、3、9,看看 elif 怎么从上往下「命中即停」,9 会落到 else 里。

🤔 想一想:如果输入 3,程序还会去检查 else 吗?还会检查前面的 elif player == 3 之后的代码吗?

Python示例 2 · 星期查询器:一条 elif 长龙
# 用 elif 把数字 1-7 翻译成星期几
day = int(input("请输入数字 1-7:"))
if day == 1:
    print("星期一")
elif day == 2:
    print("星期二")
elif day == 3:
    print("星期三")
elif day == 4:
    print("星期四")
elif day == 5:
    print("星期五")
elif day == 6:
    print("星期六")
else:
    print("星期日")
运 行 结 果
请输入数字 1-7:5
星期五
✍ 输入 1~7 各试一次,再输入 8,看看 else 怎么接住非法输入。

🤔 想一想:如果把 else 删掉,输入 8 会怎么样?(提示:if 结束后没有任何分支执行,程序继续往下走)

Python示例 3 · 主项目:石头剪刀布(电脑固定出石头)
# 第5课主项目:石头剪刀布游戏
# 功能:玩家出拳,电脑固定出石头,判断输赢
print("=== 石头剪刀布游戏 ===")
print("请选择:1=石头  2=剪刀  3=布")

# 获取玩家选择
player = int(input("请输入你的选择(1/2/3):"))

# 电脑固定出石头(第10课学随机数后可以改成随机)
computer = 1

# 把数字转换成文字,方便显示
if player == 1:
    player_text = "石头"
elif player == 2:
    player_text = "剪刀"
elif player == 3:
    player_text = "布"
else:
    player_text = "未知"

print("你出了:" + player_text)
print("电脑出了:石头")

# 判断输赢
if player == computer:
    print("结果:平局!")
elif (player == 1 and computer == 2) or \
     (player == 2 and computer == 3) or \
     (player == 3 and computer == 1):
    print("结果:你赢了!")
else:
    print("结果:电脑赢了!")
运 行 结 果
=== 石头剪刀布游戏 ===
请选择:1=石头  2=剪刀  3=布
请输入你的选择(1/2/3):2
你出了:剪刀
电脑出了:石头
结果:你赢了!
✍ 输入 1(平局)、2(你赢)、3(电脑赢)各试一次,确保三种结果都见过。

🤔 想一想:反斜杠 \ 放在行尾表示「这行还没写完,下一行接着来」。找找代码里哪个长条件用它分成了三行?

Python示例 4 · 挑战示例:月份天数判断器(预习)
# 挑战:输入月份,输出这个月有多少天
# 先不考虑闰年,2月按28天算
month = int(input("请输入月份(1-12):"))

if month == 2:
    print("2月有28天")
elif month == 4 or month == 6 or month == 9 or month == 11:
    print(str(month) + "月有30天")
elif month >= 1 and month <= 12:
    print(str(month) + "月有31天")
else:
    print("输入错误,请输入1-12")
运 行 结 果
请输入月份(1-12):7
7月有31天
✍ 输入 2、4、7、13 验证四条分支,注意 elif 条件的顺序为什么要这样排。

🤔 想一想:如果 month = 13,它满足 month >= 1 and month <= 12 吗?会被哪条分支接住?

05

易错提醒

把最容易翻车的写法先亮出来,见一次、错一次、就会了。

易错点 1

elif 拼写错误

✗ 错误写法
if a == 1:
    print("一")
else if a == 2:
    print("二")
✓ 正确写法
if a == 1:
    print("一")
elif a == 2:
    print("二")
为什么:elif 是 Python 的关键字,写成 else if 或 elsif 都会报语法错误。它是 else + if 的连体缩写。
易错点 2

把 if-elif 写成一堆独立 if

✗ 错误写法
if score >= 90:
    print("优秀")
if score >= 80:
    print("良好")
✓ 正确写法
if score >= 90:
    print("优秀")
elif score >= 80:
    print("良好")
为什么:多个独立 if 会挨个检查、可能打印好几行;if-elif 命中即停、只打印一行。想「多选一」必须用 elif。
易错点 3

条件顺序颠倒导致结果错误

✗ 错误写法
if score >= 60:
    print("及格")
elif score >= 90:
    print("优秀")
✓ 正确写法
if score >= 90:
    print("优秀")
elif score >= 60:
    print("及格")
为什么:程序从上往下找第一个成立的。90 分先撞上 ≥60 就打印「及格」了,永远轮不到「优秀」。特殊/严格的条件要放前面。
06

课堂练习(分层)

基础题人人过关,进阶题鼓励尝试,挑战题给学有余力的孩子。参考答案给老师做巡视对照。

A组 · 基础(人人必做)课堂完成,老师巡回指导
  1. 运行石头剪刀布游戏,依次输入 1、2、3,对照规则本确认平局/赢/输三种结果都对。 (提示:你出2(剪刀),电脑固定出1(石头),想想谁赢。)
  2. 把星期查询器抄一遍并运行,输入 4 和 7 验证输出。 (提示:elif 长龙从上往下数到第几个就打印第几个。)
B组 · 进阶(鼓励尝试)课堂完成,老师巡回指导
  1. 把石头剪刀布里电脑的出拳改成 2(剪刀),再测三次,看看输赢判断是否正确。 (提示:只改 computer = 1 这一行,改成 computer = 2。)
  2. 写「一日三餐推荐器」:输入 1 输出"吃面条"、2 输出"吃米饭"、3 输出"吃饺子"、其他输出"好好吃饭"。 (提示:if-elif-else 四选一。)
C组 · 挑战(学有余力)课堂完成,老师巡回指导
  1. 写「月份天数判断器」:输入月份 1-12,输出这个月有多少天(2 月按 28 天)。 (提示:先用 == 分出 2 月,再用 or 分出 30 天的 4 个月。)
  2. 给石头剪刀布加一个开头:先打印 3 行游戏规则,再开始游戏。 (提示:print 规则放在 input 之前即可。)
07

闯关小测

收尾前 10 分钟,用口答 / 举手抢答把今天的关键点过一遍。

闯关 1先举手回答,再对答案

elif 是哪个短语的缩写?

答案:else if(否则如果)。

💡 写成一个词 elif,不要分开写。

闯关 2先举手回答,再对答案

if-elif-else 从上往下检查,遇到第一个成立的条件会怎样?

答案:执行该分支,后面的都不再检查(命中即停)。

💡 这就是互斥:一次只走一条路。

闯关 3先举手回答,再对答案

三个独立的 if 和 if-elif-else 有什么不一样?

答案:独立 if 可能执行多个;if-elif 最多执行一个。

💡 想「多选一」用 elif,想「全检查」用多个 if。

闯关 4先举手回答,再对答案

多分支判断时,特殊的条件应该放前面还是后面?

答案:放前面。

💡 否则会被宽松的条件「截胡」,永远轮不到它。

闯关 5先举手回答,再对答案

石头剪刀布判你赢的条件是「你出石头 并且 电脑出剪刀」,用什么关键字连接?

答案:and(并且)。

💡 三种赢法再用 or 连成一个大条件。

08

小结 · 作业与预告

用一句话带走今天的内容;作业分层布置,作品记得保存进成长档案。

🖍️本课小结(一句话 + 板书核心词)
一句话带走用 elif 让程序在多种情况里「一次只选一种」,把上一课绕来绕去的嵌套 if 变得又直又清楚。
if-elif-elseelif = 否则如果从上往下查,命中即停分支互斥特殊条件放前面and 组合条件石头剪刀布三种结果
必做 · 人人过关
  1. 必做题:完善石头剪刀布游戏——游戏开始前打印 3 行游戏规则,结束后问玩家「要不要再来一局?」,输入 y 就再来一局。
  2. 把今天的作品保存为「第5课_石头剪刀布.py」放进作品文件夹(老师检查)。
选做 · 鼓励挑战
  1. 选做题:写「BMI 计算器」——输入身高(米)和体重(公斤),算 BMI = 体重 ÷ (身高×身高),再按 BMI 范围给一句建议(自己定 3~4 档)。
  2. 选做题:用 if-elif-else 把第 4 课的成绩等级判断器改写一遍(不嵌套),对比哪种写法更好读。
思考 · 烧脑一下
  1. 思考题:把成绩判断器里的 elif 全部改成独立的 if,输入 95 分会打印几行?亲手改一改、跑一跑,把现象记下来。
  2. 想一想:elif 能单独使用吗?比如只写 elif 不写 if——试着写写看,会发生什么?
👉 下节课预告:下一课《重复的力量》:让电脑自己重复干活——for 循环 + range(),一口气打印 100 遍你好,再打印九九乘法表!