🐸 青蛙编程网
首页 / Python / Python 基础 / 5. 循环

循环

这是什么:循环 = 让同一段代码反复执行的语法,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 是标配。

动手改

  1. 把 range(1, 4) 改成 range(1, 101) 跑一遍,再改成 range(100),看看输出从第几圈开始、一共跑几圈
  2. 用 for 循环打印 1~20 中所有的偶数(提示:num % 2 == 0)
  3. 用 while 计算 1 + 2 + …… + 100 的和并打印(验证一下:答案是 5050)

下一章:列表与字典,一个变量装下一整个购物车 🐸

📥 下载本章代码

ZIP 内含本章全部代码文件与说明,解压即用,与教程内容同步生成。