循环嵌套:用代码画出你想要的任何图形
你有没有想过,为什么同样的几行代码,有人能画出菱形、字母塔、九九乘法表,而你却只会打印一个正方形?
区别不在天赋,而在于你是否真正理解了循环嵌套的本质。今天,我们就用"排队做操"和"套娃"这两个生活场景,把循环嵌套彻底讲透。
循环嵌套的本质:外层管行,内层管列
循环嵌套就是一个循环里面再套一个循环。执行时,外层循环每跑一次,内层循环就要完整地从头跑到尾。
想象你在操场上排队做操:
- 外层循环 = 你在第几排
- 内层循环 = 这一排有多少个同学
每换一排,这一排的同学都要从头到尾报数一遍。这就是嵌套循环的执行逻辑。
在代码里,这个结构长这样:
for 行 in range(行数):
for 列 in range(每行个数):
打印内容(不换行)
换行
记住这个骨架,你已经会了80%。
从正方形到三角形:一个关键变化
先看最简单的情况——打印一个4×4的正方形:
rows = 4
for i in range(rows): # 外层:4行
for j in range(rows): # 内层:每行4个星号
print('*', end='')
print() # 换行
这没什么好说的。真正有意思的是,当你把内层循环的 range(rows) 改成 range(i),图形就变了:
rows = 5
for i in range(1, rows + 1):
for j in range(i): # 第i行打印i个星号
print('*', end='')
print()
输出:
*
**
***
****
*****
这就是从正方形到三角形的全部秘密:内层循环的次数依赖外层变量。
你可能会问:为什么 range(i) 就能让每行星号递增?因为当外层 i=1 时,内层循环执行1次;当 i=2 时,内层执行2次……以此类推。外层每走一步,内层就跟着调整自己的"步数"。
用 rows - i 画倒三角
理解了"内层依赖外层"这个核心思想,画倒三角形就顺理成章了:
rows = 5
for i in range(rows): # i从0到4
for j in range(rows - i): # 第i行打印 rows-i 个星号
print('*', end='')
print()
输出:
*****
****
***
**
*
这里的关键是:当 i=0 时,rows - i = 5,打印5个星号;当 i=4 时,rows - i = 1,打印1个星号。用外层变量的变化来"反向"控制内层循环的规模,这就是倒三角的秘诀。
实战:打印字母塔
来看一道经典的题目——打印字母塔:
输入 3,输出:
A
BAB
CBABC
这道题考察什么?三点:
- 空格的控制:每行前面有空格,让字母居中
- 字母的顺序:前半部分升序,后半部分降序
- 嵌套循环的配合:一个内层循环打空格,另一个打字母
解题思路:
- 第
i行(从0开始)有N - 1 - i个前导空格 - 字母从
A + i开始递减打印到A,再递增打印到A + i
核心代码:
for i in range(N):
# 打印前导空格
for j in range(N - 1 - i):
print(' ', end='')
# 打印降序字母(从当前行最大字母到A)
for j in range(i, -1, -1):
print(chr(65 + j), end='')
# 打印升序字母(从B到当前行最大字母)
for j in range(1, i + 1):
print(chr(65 + j), end='')
print()
这个例子告诉我们:一个图形可以拆分成多个"层次"——空格层、字母层、符号层——每一层用一个独立的循环来控制。当你学会拆解,再复杂的图形也能画出来。
常见坑:为什么你的代码总是变形?
我见过太多初学者在循环嵌套上栽跟头,总结下来就四个坑:
- 忘记换行——内层循环结束后没有
print(),所有星号连成一条直线。记住:内层循环负责一行,外层循环负责换行。 - 内层循环写成固定值——打印三角形时写成
range(5),结果变成正方形。内层循环的次数要依赖外层变量。 - 变量搞混——外层变量管行,内层变量管列。用反了图形就会"竖着长"。
- 缩进错误——Python中缩进决定代码归属。内层循环必须比外层多缩进一层,否则逻辑全乱。
进阶:菱形与更多可能
掌握了基础,我们来点进阶的——打印菱形:
rows = 7
mid = rows // 2
# 上半部分(含中间行)
for i in range(mid + 1):
for j in range(mid - i):
print(' ', end='')
for j in range(2 * i + 1):
print('*', end='')
print()
# 下半部分(不含中间行)
for i in range(mid - 1, -1, -1):
for j in range(mid - i):
print(' ', end='')
for j in range(2 * i + 1):
print('*', end='')
print()
输出:
*
***
*****
*******
*****
***
*
菱形 = 上半部分三角形 + 下半部分倒三角形。当你把一个复杂图形拆解成多个简单图形的组合,问题就迎刃而解了。
最后想说的
循环嵌套的本质,就是用外层循环控制"重复的次数",用内层循环控制"每次重复的内容"。这个思想不仅能画图形,还能处理二维数组、遍历表格、生成九九乘法表——几乎所有"重复中的重复"的问题,都能用循环嵌套解决。
给你一个练习建议:不要只满足于打印星号。试试打印九九乘法表、数字三角形、字母菱形。每画出一个新图形,你对循环嵌套的理解就会深一层。
当你真正掌握了循环嵌套,你会发现——代码就是你手中的画笔,而循环就是那支可以无限重复的魔法笔。
关于作者
我是赵老师,持有 NOI 信息学奥赛教练证书,拥有 15 年以上的软件开发经验,从事信息学少儿编程教学已有 8 年时间。
这些年累计帮助 多名 学生通过编程特长升入自己心仪的目标学校。
如果你在编程学习上有任何疑问,欢迎联系我:18620372957(微信同号)