📄 一句话概括
循环就是流程图里【箭头转回去】: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:整个循环【即刻散会】;
- continue:本轮到此为止、下一轮照常。
嵌套循环里 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 秒体验。
六、常见误区
- 【死循环是错误写法】——错。
while True加 break 是【次数未知】的标准解(服务器主循环、游戏主循环都是它,回收树莓派课第九章 MicroPython 的 while True);真正的错误是【想退退不出】。 - 【range(1, 100) 会数到 100】——错。含头不含尾,只到 99;要 100 就写 range(1, 101)——3-8 下标从 0 的姊妹坑。
- 【循环里能改的东西随便改】——危险。在 for 遍历列表时往列表里增删元素,遍历会跳来跳去(索引错位);要改就遍历副本或先收集后处理。
自测三问(点开对答案)
1. **while 循环的三件套是什么?缺一件会怎样?** 答:初值、条件、更新;缺更新条件恒成立即死循环(除非内部有 break)。 2. **for 和 while 各适合什么场景?** 答:次数已知或要遍历具体对象用 for;次数未知、只知停止条件用 while(常配 while True 加 break)。 3. **break 和 continue 的区别?** 答:break 整个循环终止;continue 只跳过本轮剩余语句、下一轮照常。- ☐ 下一节(4-4 函数、步骤、参数、返回值)
相关笔记
- 流程图 —— 循环的图纸形态
- 树莓派 6-4 · Python 流程控制 —— range 含头不含尾的出处
- C++ 5.2 · for循环语句 —— C 家族 for 的三段式
- ⌨️ 编程原理 · 索引 —— 全课路线图