⌨️ 第四章 流程图与算法
📄 一句话概括

循环就是流程图里【箭头转回去】:while 问【还要继续吗】、for 说【把这个名单走一遍】——写循环只要盯住三件套:初值、条件、更新,缺一个就是死循环。

📝 本节和前面几节的关系

4-1 的【箭头转回去】落到代码。回收 3-8 的数组(for 遍历名单是数组的主战场)与树莓派课 6-4(语法已见过,这里补【为什么】)。

一、while:先问再干

count = 1                     # 初值
while count <= 5:             # 条件
    print(count)
    count = count + 1         # 更新

三件套齐全:count 从 1 涨到 5,每轮打印一次,到 6 时条件不成立、出循环。缺更新(忘写 count 加一)条件永远成立——死循环,程序卡死。遇到卡死先查三件套,九成是更新丢了。

二、for:遍历名单

for name in ["红", "黄", "蓝"]:
    print(name)

for i in range(5):        # 0 1 2 3 4(含头不含尾,回收树莓派课 6-4)
    print(i)

for 与 while 的分工:已知【走多少遍/遍历什么】用 for(名单、range、字符串、字典都行);只知道【什么时候停】用 while(猜数字、读文件直到末尾)。for 是 while 的特例——for i in range(5) 翻译成 while 就是三件套标准形态。

三、break 与 continue:两个紧急出口

for n in range(1, 10):
    if n == 3:
        continue     # 跳过本轮(3 不打印),下一轮继续
    if n == 6:
        break        # 整个循环到此为止
    print(n)         # 输出 1 2 4 5

嵌套循环里 break 只退出本层——两层 for 想全退要用标志位或把内层包成函数 return。

四、动手 Demo:两种循环跑同一件事

total = 0                     # 1 到 100 求和
for i in range(1, 101):
    total += i
print(total)                  # 5050

求和这种【次数已知】的活儿 for 最顺手;while 的主场是【次数未知】:

import random
rolls = 0
while True:                     # 死循环配合 break 是标准姿势
    rolls += 1
    if random.randint(1, 6) == 6:
        break                   # 掷出 6 就停——事先不知道要掷几次
print("掷了", rolls, "次才出 6")
import random
rolls = 0
while True:                     # 死循环配合 break 是标准姿势
    rolls += 1
    if random.randint(1, 6) == 6:
        break                   # 掷出 6 就停——事先不知道要掷几次
print("掷了", rolls, "次才出 6")

看到什么算成功:5050 和一行【掷了 N 次才出 6】(N 每次运行不同,平均约 6 次)。

读结果:5050 正是高斯小时候算的那道题;掷骰子版演示 while True 加 break——【无限循环+内部判断退出】不是 bug,是【不知道次数】场景的标准解。

五、30 秒实验

跑 for i in range(1, 11): print(i, i * i)——1 到 10 的平方表一次出列。循环十次等于手写十行 print——这就是【机器擅长重复】的 30 秒体验。

六、常见误区

  1. 【死循环是错误写法】——错。while True 加 break 是【次数未知】的标准解(服务器主循环、游戏主循环都是它,回收树莓派课第九章 MicroPython 的 while True);真正的错误是【想退退不出】。
  2. 【range(1, 100) 会数到 100】——错。含头不含尾,只到 99;要 100 就写 range(1, 101)——3-8 下标从 0 的姊妹坑。
  3. 【循环里能改的东西随便改】——危险。在 for 遍历列表时往列表里增删元素,遍历会跳来跳去(索引错位);要改就遍历副本或先收集后处理。
自测三问(点开对答案) 1. **while 循环的三件套是什么?缺一件会怎样?** 答:初值、条件、更新;缺更新条件恒成立即死循环(除非内部有 break)。 2. **for 和 while 各适合什么场景?** 答:次数已知或要遍历具体对象用 for;次数未知、只知停止条件用 while(常配 while True 加 break)。 3. **break 和 continue 的区别?** 答:break 整个循环终止;continue 只跳过本轮剩余语句、下一轮照常。

相关笔记