前几天对着嵌套循环代码死磕,怎么写都理不清内外层逻辑,越写越烦躁,甚至忍不住暗自怀疑:是不是我脑子不够灵光,记忆力退化,天生就学不会这种双层循环?
身边人轻飘飘说了句:“人笨点开心,这样就不会因为记得自己学不会而不开心。”听完我瞬间醍醐灌顶。
我在想有没有一种可能不是我太笨,而是我把python 想的太聪明了?
静下心来,我把这段打印三角形的嵌套循环逐行拆开,一点点理顺每一步的运行逻辑,分享给同样卡在循环的朋友:
整个代码
这个东西不能逐行解读,只能逐框说一、先吃透【外层 while 循环】(管整体:一共打 5 行)
1. row = 1
row 是外层专属计数器,代表「当前正在打印第几行」,我们从第 1 行开始。
2. while row <= 5:
外层循环的总规则:只要当前行数不超过 5,就完整执行一整行的打印工作。逻辑大白话:我们要打印 5 行三角形,所以行数 1、2、3、4、5 全都要执行一遍;等到 row 变成 6,直接结束整个程序。
3. 外层循环内部包含 3 件事(缩进里全部属于外层管辖)
print()row += 1
4. row += 1
外层收尾关键:打完一行,行数加 1。如果没有这行,row 永远 = 1,外层条件永久成立,程序死循环不停打印。
外层核心总结
外层只管「行」,每执行一次外层,就完整生成一整行图案;外层一共循环 5 次,对应三角形 5 行。(只有外循环得话如下图)
二、再钻进【内层 while 循环】(管单行:这一行打几颗星)
内层代码是被包裹在外层缩进里的,外层每走一轮,内层就要从头到尾完整跑一遍。
1. col = 1
这行写在内层循环上方、外层循环内部,是嵌套循环的灵魂:每新开一行(外层走一轮),都要把 col 重置回 1,保证每行的星星都从第 1 颗开始打印。
2. while col <= row:
内层判断规则:当前是第几行,这一行就打印几颗星
- 外层 row=1(第 1 行):col 只能≤1 → 只打印 1 颗星
- 外层 row=2(第 2 行):col≤2 → 打印 2 颗星
- 外层 row=5(第 5 行):col≤5 → 打印 5 颗星
3. print("*", end="")
打印星号,end="" 取消 print 自带的换行,让星星横向并排,不会打一颗就跳去下一行。
4. col += 1
内层计数器自增,打完一颗星,准备打下一颗;缺少这行会无限打印星星。
内层退出时机
当 col 的数字超过当前行号 row,内层循环直接结束,代表当前这一行所有星星全部打印完毕。
三、内外层衔接关键:print() 换行语句
内层全部跑完后,立刻执行 print():因为内层打印星星时关掉了自动换行,所有星星都挤在同一行;空 print() 单独触发一次换行,让光标跳到下一行最左侧,外层再进入下一轮、打印新一行星星。
如果删掉这行 print(),5 行星星会全部挤成一条长线,三角形直接消失。
四、完整一轮内外层联动演示(row=1,第一行)
- 外层启动:
row=1,满足row<=5,进入外层内部 row +=1,row 变成 2,外层开启第二轮,打印第二行