循环
这是什么:循环 = 让同一段代码反复执行的语法,for 按次数跑、while 按条件跑,是程序里的「重复劳动机关」。
为什么用:会判断了,还差一样:重复。要打印 100 遍"加油",总不能复制 100 行代码;手写重复的活儿,交给循环才靠谱。
如何用:本章先用 for 加 range() 数圈数,再用 while 做「猜到对为止」这种次数不定的重复。
for + range():按次数重复
for i in range(1, 4):
print(f"第 {i} 圈")
你会看到:
第 1 圈
第 2 圈
第 3 圈
range(1, 4) 生成 1、2、3——和切片一样含头不含尾。变量 i 每一轮接管一个数,缩进块就跟着执行几轮。只想重复 N 次、不关心具体数字,写 range(3),它会从 0 开始数。
while:按条件重复
不知道要重复几次、只知道什么时候该停?用 while:
count = 3
while count > 0:
print("倒计时", count)
count -= 1 # 等价于 count = count - 1
print("发射!")
你会看到:
倒计时 3
倒计时 2
倒计时 1
发射!
只要 count > 0 成立就一直执行;count -= 1 每轮减 1,减到 0 条件不成立,循环自然结束。
break 与 continue
for num in range(1, 6):
if num == 4:
break # 撞见 4:整个循环收工
if num % 2 == 0:
continue # 偶数:跳过本轮,直接下一轮
print("奇数:", num)
你会看到:
奇数: 1
奇数: 3
break 是"不干了",跳出整个循环;continue 是"这个跳过",只放弃本轮剩下的部分。
小心死循环
如果 while 的条件永远成立,程序就永远停不下来——这叫死循环:
# 反面教材,千万别原样运行!
# while True:
# print("停不下来……")
保命两条:循环体里必须有让条件趋向不成立的改动(比如上面的 count -= 1);程序卡死了按 Ctrl + C 强行中断。
逐概念解读
| 写法 | 作用 |
|---|---|
for i in range(1, 4): |
i 依次取 1、2、3,每取一个执行一轮缩进块 |
while 条件: |
条件成立就反复执行缩进块 |
count -= 1 |
自减 1,等价于 count = count - 1 |
break |
立刻跳出整个循环 |
continue |
跳过本轮剩余部分,进入下一轮 |
记忆口诀
for 数圈,while 看条件;循环体内必须能走到头。
⚠️ 新手翻车现场
翻车一:while 忘了让条件趋于不成立
count = 3
while count > 0:
print("倒计时", count)
# 忘了写 count -= 1
程序会一直刷"倒计时 3"停不下来——这就是死循环。
逐行分析:第 1、2 行都合法,真正的病灶是"少了那一行"——循环体里只有 print,没有任何让 count 变小的语句,于是每一轮检查条件时 count 都还是 3,count > 0 永远成立。Python 为什么不报错?这段代码完全合法:条件成立就执行、执行完回来再查条件,天经地义地转下去——它是逻辑 bug,不是语法错误,而逻辑 bug 恰恰最阴险:程序不喊疼,只是停不下来。现场症状:屏幕疯狂刷同一句话、光标停不住。
救场:按 Ctrl + C 强行中断。修复:把 count -= 1 写回循环体,让条件每一轮都更接近不成立。
翻车二:以为 range(1, 5) 会数到 5
for i in range(1, 5):
print(i)
你会看到:
1
2
3
4
逐行分析:代码一行没错、也不会报错——range(1, 5) 就是规矩的"含头不含尾":从 1 开始,到 5 之前停。跑出 1~4 是 Python 忠实执行了你的指令,错的是你以为它含尾。这类"不报错但结果少一个"的 bug 比报错更阴险:报错会喊你来看,它不会。
心法:凡写 range,多看一眼终点是不是"想要的最大值 + 1"——要 1~5 就写 range(1, 6)。
📦 完整小示例
找出 1~100 里所有的 7 的倍数,并数一数有几个,存成 seven.py:
count = 0
for num in range(1, 101):
if num % 7 == 0:
count += 1
print(num, end=" ") # end=" " 表示先别换行,用空格隔开
print()
print("1~100 里 7 的倍数有", count, "个")
你会看到:
7 14 21 28 35 42 49 56 63 70 77 84 91 98
1~100 里 7 的倍数有 14 个
逐段中文精讲
- 第 1 行(计数器清零):
count = 0放在循环外面——计数器只需要初始化一次;要是写进循环里,每轮都被清零,最后永远只数出 1。 - 第 2 行(循环框架):
range(1, 101)生成 1~100——想要"到 100",终点就得写 101,还是含头不含尾。变量num每轮接管一个数。 - 第 3 行(筛选条件):
num % 7 == 0用取余判断倍数:除以 7 余数为 0,就是 7 的倍数。%在这里第一次当"筛子"用,以后天天见。 - 第 4~5 行(命中后两连招):先
count += 1记一笔,再print(num, end=" ")打印——end=" "是说"这行打完别换行,用空格接着打",所以 14 个倍数挤成一行。这两行都在 if 的缩进块里,只有命中才执行。 - 第 6 行(空行)与第 7 行(补换行):循环和总结之间空一行,读起来不挤;循环结束后一个光杆
print(),什么都不打、只换一行,把总结句和倍数行隔开。 - 第 8 行(总结陈词):缩进回到最外层,说明循环已结束,此时 count 里攒着总数 14,交给 print 汇报。
整个程序是"计数器 + 遍历 + 筛选"三件套的第一次合体——以后统计工资过万的人数、找列表里的偶数,套路一模一样。
🎯 什么时候用它
- 批量处理:给 500 个文件改名、给 100 位会员群发通知、把一万行数据逐条清洗——凡"对每个东西做同一件事",第一个念头就该是循环。
- 求和与统计:账单总计、全班平均分、一周步数汇总——拿一个变量当"存钱罐",循环里一个个往里加,走完一圈就出总数。
- 反复尝试直到成功:没连上网就等两秒重试、下载卡住就轮询进度——"不知道几次能成,条件到了就停"的活,while + break 是标配。
动手改
- 把
range(1, 4)改成range(1, 101)跑一遍,再改成range(100),看看输出从第几圈开始、一共跑几圈 - 用 for 循环打印 1~20 中所有的偶数(提示:
num % 2 == 0) - 用 while 计算 1 + 2 + …… + 100 的和并打印(验证一下:答案是 5050)
下一章:列表与字典,一个变量装下一整个购物车 🐸