新年快到了,班里要布置教室。小刚领到任务:用彩灯在窗户上摆一棵圣诞树。
他先摆了树冠——最上面 1 颗星,第二行 3 颗,第三行 5 颗……他摆着摆着发现规律:每往下一行,就多 2 颗。
小刚偷了个懒:能不能让同桌小美站在椅子上,按「第几行摆几颗」的口令帮他摆?小美气得直瞪眼:你把我当循环用啊!
小刚一拍脑门:对啊!我只需要外层数到第几行,内层按行数摆灯——这不就是循环套循环吗?
今天,就用 Python 的嵌套循环,在屏幕上种出一棵会自己长大的圣诞树!
循环里再套循环:外层管行、内层管列,一层层画出矩形、三角形,最后拼出一棵漂亮的圣诞树。
先看这节课教什么、怎么分配 120 分钟,老师心里有底,课堂节奏就不乱。
| 时间 | 环节 | 做什么 / 师生互动要点 |
|---|---|---|
| 0–5 | 候课 · 设备检查 | 开机 → 打开编辑器 → 确认作品文件夹就位。 |
| 5–12 | 上节回顾 · 快问快答 | while 和 for 怎么选?break 干什么?怎么避免死循环?猜数字谁猜得次数最少? |
| 12–22 | 情景导入 | 展示方格纸圣诞树,问:一行行手写太累,能不能让循环「造」出这棵树?引出循环套循环。 |
| 22–35 | 知识讲解 | 什么是嵌套循环 → 用时钟/日历讲执行顺序(外层 1 次 = 内层 1 轮)→ 外层管行、内层管列。 |
| 35–55 | 示范代码 + 上机(示例1~3) | 矩形 → 直角三角形 → 等腰三角形,三步递进,每步都先数格子再写码。 |
| 55–75 | 主项目:圣诞树 | 先拆解:三角形树冠(含空格)+ 树干 → 老师带读 → 学生敲 → 改 height 看树长大。 |
| 75–88 | 课堂练习 A/B | 练习 1 改 height 观察变化;练习 2 倒直角三角形;投屏典型错误找茬。 |
| 88–98 | 挑战练习 C | 打印菱形;学有余力的同学给圣诞树加「星星树顶」或装饰字符。 |
| 98–106 | 闯关小测 | 外层 3 次内层 2 次共几次?内层次数怎么和外层挂钩?end="" 干嘛的?…… |
| 106–115 | 总结 · 保存作品 | 齐读口诀;保存「第8课_圣诞树.py」;强调「外层行、内层列」的心法。 |
| 115–120 | 布置作业 · 预告 | 布置必做/选做/思考;预告第 9 课:and/or/not 逻辑运算——让条件判断更聪明,做闰年判断器! |
时间轴把 2 小时切成 8 段:复习→导入→讲解→示范→上机→练习→检测→小结,每段都有明确产出。
先用 5 分钟把上节课的记忆叫醒,再用故事和类比把新知识挂到孩子已有的经验上。
问 1:for 循环适合什么任务?while 呢?
→ for 适合知道次数的;while 适合靠条件停的(猜数字)。两种循环是重复任务的两员大将。
问 2:break 跳出循环后,程序去哪儿了?
→ 跳到整个循环后面的第一行继续执行。while True + break 猜对即停。
问 3:倒计时程序里「刹车」是哪一行?
→ n = n - 1,让条件 n > 0 最终变假——没有刹车的循环 = 死循环。
新年快到了,班里要布置教室。小刚领到任务:用彩灯在窗户上摆一棵圣诞树。
他先摆了树冠——最上面 1 颗星,第二行 3 颗,第三行 5 颗……他摆着摆着发现规律:每往下一行,就多 2 颗。
小刚偷了个懒:能不能让同桌小美站在椅子上,按「第几行摆几颗」的口令帮他摆?小美气得直瞪眼:你把我当循环用啊!
小刚一拍脑门:对啊!我只需要外层数到第几行,内层按行数摆灯——这不就是循环套循环吗?
今天,就用 Python 的嵌套循环,在屏幕上种出一棵会自己长大的圣诞树!
分针走 1 格(外层 1 次),秒针要走满 60 格(内层一整轮)。
外层1次=内层1轮月份是外层,日期是内层:1 月过完 31 天,才轮到 2 月的第 1 天。
一层层往里钻一行一行往下写(外层),每一行从左往右写满(内层),写完一行换行。
行与列先打「树宽-行号」个空格把它推到中间,再打「2×行号-1」个星号。
两段内层循环分小块讲透语法点,每一块都配生活类比 + 要点小结,讲完立刻口头小试。
在一个循环的里面再写一个循环,就叫嵌套循环。循环体里不只有 print,还可以是另一个 for/while。
看名字就懂:nest(窝)+ 循环 = 循环里「窝」着循环。就像套娃,大娃肚子里有小娃。
写法很简单:外层循环的缩进块里,再写一个完整的内层循环(它自己也要有冒号 + 缩进)。
经典例子:打印一个 5 行 3 列的矩形——外层循环 5 次管 5 行,内层循环 3 次管每行 3 个星号。
嵌套循环怎么走?记住一句话:外层走一次,内层走完整的一轮。
举例:外层 i 从 1 到 3,内层 j 从 1 到 2。执行顺序是:i=1 时 j=1、j=2;i=2 时 j=1、j=2;i=3 时 j=1、j=2。
一共执行 3 × 2 = 6 次 内层代码。想算总次数?外层次数 × 内层次数。
内层循环的次数可以是固定的(矩形:每行都 3 个),也可以是跟外层 i 挂钩的(三角形:第 i 行打 i 个)——挂钩写法是打印图案的关键。
所有字符图案都能拆成两件事:外层循环控制行数,内层循环控制每行打印什么。
直角三角形:第 1 行打 1 个星、第 2 行打 2 个……所以内层写 range(i)——i 是几就打几个。
等腰三角形 / 圣诞树:先打空格把星号推到中间,再打星号。第 i 行空格数 = 总行数 - i,星号数 = 2×i - 1。
每打完一行要 print() 换行(单独一行、不带内容);想让星号连着不换行,print 里要写 end=""。
老师先带读代码、讲注释,再让学生亲手敲一遍——敲错正好学习调试。
# 第8课:嵌套循环——打印矩形
for i in range(5): # 外层:5行
for j in range(3): # 内层:每行3个星号
print("*", end="") # 不换行,连着打
print() # 一行打完,换行***
***
***
***
***🤔 想一想:end="" 是什么意思?如果没有它,每打一个星号就换行,会变成什么样子?
# 直角三角形:第i行打i个星号
for i in range(1, 6): # 外层:5行
for j in range(i): # 内层:打i个(跟外层挂钩!)
print("*", end="")
print()*
**
***
****
*****🤔 想一想:如果内层写成 range(5) 而不是 range(i),图案会变成什么?(矩形!)
# 等腰三角形:每行先打空格,再打星号
for i in range(1, 6): # 5行
for j in range(5 - i): # 空格:5-i个
print(" ", end="")
for j in range(2 * i - 1): # 星号:2i-1个
print("*", end="")
print() *
***
*****
*******
*********🤔 想一想:第 4 行(i=4)有几个空格、几个星号?套公式 5-i 和 2i-1 算算再验证。
# 第8课主项目:圣诞树
# 树冠 = 等腰三角形(height行)+ 树干
height = 6 # 树冠有几层,改这个数树就变高
# ---- 树冠:等腰三角形 ----
for i in range(1, height + 1):
for j in range(height - i): # 空格
print(" ", end="")
for j in range(2 * i - 1): # 星号
print("*", end="")
print()
# ---- 树干:2行 x 3个星号 ----
for i in range(2):
for j in range(height - 2): # 空格(和树冠底部对齐)
print(" ", end="")
print("***") *
***
*****
*******
*********
***********
***
***🤔 想一想:树干为什么要打 height - 2 个空格?树冠底部是 2×height-1 个星号,树干是 3 个,怎么算差值?
# 挑战:菱形 = 上半等腰三角形 + 下半倒三角形
for i in range(1, 6): # 上半:5行
print(" " * (5 - i) + "*" * (2 * i - 1))
for i in range(4, 0, -1): # 下半:4行,i从4倒到1
print(" " * (5 - i) + "*" * (2 * i - 1)) *
***
*****
*******
*********
*******
*****
***
*🤔 想一想:能不能把下半改成 range(1, 5) 的循环,用 (5-i) 或 (4-i) 之类凑出来?试试哪种更好写。
把最容易翻车的写法先亮出来,见一次、错一次、就会了。
for i in range(3):
for j in range(2):
print("*")for i in range(3):
for j in range(2):
print("*")for i in range(5):
for j in range(3):
print("*", end="")for i in range(5):
for j in range(3):
print("*", end="")
print()for i in range(1, 6):
for j in range(5):
print("*")for i in range(1, 6):
for j in range(i):
print("*")基础题人人过关,进阶题鼓励尝试,挑战题给学有余力的孩子。参考答案给老师做巡视对照。
收尾前 10 分钟,用口答 / 举手抢答把今天的关键点过一遍。
嵌套循环里,外层走 1 次,内层要走几次?
💡 外层 3 次 × 内层 2 次 = 共 6 次。
外层 3 次、内层 4 次,内层代码总共执行多少次?
💡 总次数 = 外层次数 × 内层次数。
打印图案时,外层循环管什么?内层管什么?
💡 行和列的分工。
print("*", end="") 和 print("*") 有什么区别?
💡 想分行要在内层结束后用 print() 换行。
等腰三角形第 i 行:空格数和星号数怎么算(共 5 行)?
💡 先推位置(空格),再画身体(星号)。
用一句话带走今天的内容;作业分层布置,作品记得保存进成长档案。