前言
大家好!我是项目一部的一名Python初学者。
本周我终于跨过了if判断的门槛,本以为for循环就是重复执行的简单工具,直到我遇到了“循环嵌套”

刚开始看代码时,我的内心OS是:“外层转一圈,内层转十圈?那要是再套一层,我的脑子岂不是要烧了?” 🤯

但经过这几天的“死磕”和无数次的print调试,我发现循环嵌套其实就是“行与列”的艺术。


一、什么是循环嵌套?

简单来说,循环嵌套就是在一个循环里面,再放一个循环。

  • 外层循环:负责控制“大节奏”(比如:一共有几行)。
  • 内层循环:负责处理“小细节”(比如:这一行里有几个星星)。

核心逻辑只有一句话:

外层循环每执行一次(走一步),内层循环就要完整地跑完一整圈(跑一圈)。

想象一下你在操场跑步:

  • 外层循环是你打算跑3圈
  • 内层循环是每一圈里你要跑400米
  • 结果就是:你总共跑了 3×400=12003×400=1200 米。内层的“400米”重复了3次。

二、经典案例实战:从懵逼到通透

光说理论太枯燥,我们直接上代码!这是我最开始觉得最难,但后来觉得最有趣的三个场景。

案例 1:打印矩形(理解“行”与“列”)

需求:打印一个4行4列的星号矩形。

python

# 定义行数和列数
rows = 3
cols = 4

# 外层循环控制行
for i in range(rows):
    # 内层循环控制列
    for j in range(cols):
        print('*', end=' ')
    # 每行结束后换行
    print()
 

执行流程图解:

  1. i=0 (第1行) -> 内层 j 跑完0,1,2,3->打印 * * * *->换行
  2. i=1 (第2行) -> 内层 j 跑完0,1,2,3->打印 * * * *->换行
  3. i=2 (第3行) -> 内层 j 跑完0,1,2,3 >打印 * * * *->换行
    结束。

注意:print()要和内层j语句同级,这样才能达到打印完每行星星后换行的效果

最后会显示出如下图形

* * * * 
* * * * 
* * * * 
 


案例 2:打印直角三角形

需求

* 
* * 
* * * 
* * * * 
* * * * * 
 

思考

  • 第1行有1个星,且位置的坐标为(0,0)
  • 第2行有2个星,且位置的坐标从左往右分别为(0,1)、(1,1)
  • 第3行有3个星,且位置的坐标从左往右分别为(0,2)、(1,2)、(2,2)
  • ...
  • i行有j个星

代码实现:

python

# 外层循环控制行数,范围0到4(共5行)
for i in range(5):
    
    # 内层循环控制每行的列数,范围0到4(共5列)
    for j in range(5):
        
        # 判断当前行号i是否大于等于列号j
        if i >= j:
            # 满足条件时打印星号,end=" "确保不换行且用空格分隔
            print("*", end=" ")
    
    # 每行结束后换行
    print()
 

🧠 顿悟时刻:
这里最妙的地方在于内层循环的范围不是固定的,而是随着外层变量 i 的变化而变化。

  • 当 i=0,内层 range(1),打1个星。
  • 当 i=3,内层 range(4),打4个星。
    这种“内外联动”的感觉,一旦理解了,你就掌握了嵌套的精髓。

案例 3:九九乘法表(新手的“毕业考试”)

这是检验你是否真正理解嵌套循环的“试金石”。

需求:打印标准的九九乘法表。

11x1=1 
21x2=2  2x2=4 
31x3=3  2x3=6  3x3=9 
4...

代码实现:

python

循环结构设计

  • 外层循环:变量i从1到9递增,控制乘法表的行数
  • 内层循环:变量j从1到i,决定每行输出的乘法算式数量

输出格式处理

  • 使用f-string动态生成算式,格式为"j × i = i*j"
  • 设置end=" "参数使算式保持横向排列

换行控制

  • 每完成一行输出后执行print()实现换行
  • 确保后续算是从新行开始显示
# 外层循环控制乘法表的行数(1到9)
for i in range(1,10):
    # 内层循环控制每行的列数(1到当前行数i)
    for j in range(1,i+1):
        # 格式化输出乘法表达式(避免换行)
        print(f" {j} * {i} = {i*j}",end=" ")
    # 每行结束后换行
    print()
 

🔍 细节拆解:

  1. 外层 i:代表当前是第几行,也代表乘法算式中的被乘数
  2. 内层 j:代表当前行的第几个算式,也代表乘数。注意 range(1, i+1),保证了每一行只打印到 i x i 为止,形成了三角形的形状。
  3. 对齐技巧:使用Tab键可以让列对齐得更漂亮,比空格更专业。

三、新手常犯的“三大错误”

在练习过程中,我踩过的坑,希望你别再踩了:

  1. 缩进混乱(IndentationError)

    • 现象:代码报错,或者逻辑完全不对。
    • 原因:Python靠缩进来区分代码块。内层循环的代码必须比外层多缩进一级。最后的 print() 换行如果缩进错了,整个图形就塌了。
    • 对策:善用编辑器的自动格式化功能, visually 检查代码层级。
  2. 变量名复用(Variable Shadowing)

    • 错误写法:python
      1for i in range(3):
      2    for i in range(5):  # ❌ 糟糕!内外层都用 i,内层会覆盖外层
      3        print(i)
    • 后果:外层循环的 i 会被内层搞乱,导致逻辑错误。
    • 对策外层用 irow;内层用 jcol见名知意,永远不要偷懒!
  3. 死循环(针对 while 嵌套)

    • 如果用 while 做嵌套,千万记得在内层修改计数变量,否则内层永远停不下来,程序直接卡死。
    • 建议:初学者优先用 for 循环,更安全、更简洁。

四、性能小贴士:嵌套虽好,不可贪多

最后,作为一个刚入门的“准程序员”,我也学到了一点关于效率的知识:

  • 时间复杂度爆炸:如果是两层循环,运算次数大概是 𝑁×𝑁N×N 。如果是三层,就是 𝑁×𝑁×𝑁N×N×N 。
  • 经验法则:尽量将嵌套层数控制在 2-3层 以内。如果你发现自己写了4层、5层嵌套,通常说明代码结构需要优化了。

结语

从最开始看着嵌套代码头晕眼花,到现在能独立写出九九乘法表,我深刻体会到:编程没有捷径,唯一的捷径就是动手敲代码。尽可能多靠自己,AI辅助。自己理解不了的代码可以问AI工具,但目的都是为了自己能够懂代码。自己理解了代码,不仅对自己以后的编程工作提供了资本,也可以让你比别人更好的运用AI的能力。

循环嵌套就像是搭积木,只要理清了“谁管行、谁管列、谁先动、谁后动”的关系,再复杂的图形也能拼出来。

Logo

这里是“一人公司”的成长家园。我们提供从产品曝光、技术变现到法律财税的全栈内容,并连接云服务、办公空间等稀缺资源,助你专注创造,无忧运营。

更多推荐