循环就是让程序重复执行同一段代码,避免我们把相同的代码写几十上百遍。比如打印 1 到 100、遍历列表里的所有元素、批量处理数据,都要用到循环。
Python 里有两种核心循环:
while 循环:满足条件就一直循环,适合「不知道具体循环多少次」的场景for 循环:按顺序遍历序列里的每一个元素,适合「知道循环次数 / 遍历容器」的场景,日常开发最常用
前置必记铁则
- 循环内部的代码必须缩进 4 个空格,同一层级缩进一致
- 循环会重复执行缩进内的所有代码,直到条件不成立 / 被强制跳出
一、while 循环
1. 基本语法
while 循环条件: 重复执行的代码1 重复执行的代码2
执行逻辑:
- 成立 → 执行缩进内的所有代码,执行完回到第 1 步再次判断
2. 基础示例:打印 1~5
# 1. 初始化计数器:从1开始i = 1# 2. 循环条件:i小于等于5就继续循环while i <= 5: # 3. 循环体:要重复做的事 print(i) # 4. 计数器自增:非常重要!否则会无限死循环 i = i + 1 # 也可以简写为 i += 1
运行结果:
逐行解释执行过程
- 初始
i=1,判断 1<=5 成立 → 打印 1,i 变成 2 i=2,判断 2<=5 成立 → 打印 2,i 变成 3- 重复直到
i=6,判断 6<=5 不成立 → 循环结束
⚠️ 新手头号大坑:忘记写计数器自增 如果漏掉 i += 1,i 永远是 1,条件永远成立,程序会无限循环卡死。遇到死循环按 Ctrl+C 强制终止。
3. 死循环(特殊场景使用)
条件永远为 True,循环永远不会自己结束,需要配合break手动跳出。
# 死循环,需要手动break才能退出while True: content = input("请输入内容(输入q退出):") if content == "q": break # 输入q就跳出循环 print("你输入的是:", content)
适用场景:持续接收用户输入、程序后台持续运行等。
4. while 循环适用场景
二、for 循环(日常开发最常用)
for 循环用来遍历序列中的每一个元素,比如字符串、列表、元组、字典、range 生成的数字序列等,循环次数由序列的元素个数决定。
1. 基本语法
执行逻辑:依次把序列里的每个元素赋值给变量,每赋值一次,执行一次循环体。
2. 基础示例:遍历字符串
word = "Python"for char in word: print("当前字符:", char)
运行结果:
当前字符: P当前字符: y当前字符: t当前字符: h当前字符: o当前字符: n
3. 核心工具:range () 生成数字序列
range() 用来生成连续的整数序列,是 for 循环最常用的搭档,专门用来控制循环次数。
三种写法
① range (结束值):生成 0 ~ 结束值 - 1 的整数
左闭右开规则:包含起始值,不包含结束值。
# 生成 0,1,2,3,4 (0到5-1)for i in range(5): print(i)
输出:
② range (起始值,结束值):生成 起始值~结束值 - 1 的整数
# 生成 1,2,3,...,10for i in range(1, 11): print(i)
想打印 1 到 10,结束值必须写 11,因为不包含结束值本身。
③ range (起始值,结束值,步长):间隔指定步长取值
# 生成 1,3,5,7,9 (步长为2)for i in range(1, 10, 2): print(i)
步长为负数还能倒序生成:
# 倒序打印 5,4,3,2,1for i in range(5, 0, -1): print(i)
4. for 遍历常见容器
① 遍历列表
fruits = ["苹果", "香蕉", "橙子", "西瓜"]for fruit in fruits: print(f"我喜欢吃{fruit}")
② 遍历字典
遍历字典默认遍历的是键(key),想同时取键和值用 items()。
student = {"name": "小明", "age": 18, "score": 95}# 方式1:遍历键for key in student: print(key, "→", student[key])# 方式2:同时遍历键和值(最常用)for key, value in student.items(): print(key, "→", value)
③ 带下标遍历:enumerate ()
同时拿到元素的索引和值:
fruits = ["苹果", "香蕉", "橙子"]for index, fruit in enumerate(fruits): print(f"第{index+1}个水果:{fruit}")
输出:
三、循环控制关键字:break 和 continue
用来在循环内部手动控制循环的执行,两种循环都通用。
1. break:彻底跳出整个循环
一旦执行break,当前整个循环直接结束,后面的循环都不再执行。
示例:找到第一个符合条件的元素就停止
# 在列表里找数字3,找到就停止nums = [1, 2, 3, 4, 5]for num in nums: if num == 3: print("找到3了,停止循环") break print("当前数字:", num)
运行结果:
到数字 3 的时候触发 break,整个循环直接结束,4 和 5 都不会再遍历。
2. continue:跳过本次循环,进入下一次
执行continue后,本次循环剩下的代码跳过,直接进入下一轮循环。
示例:遇到偶数就跳过,只打印奇数
for i in range(1, 6): if i % 2 == 0: continue # 偶数就跳过,不执行下面的print print(i)
运行结果:
遇到 2、4 的时候,触发 continue,直接跳过打印,进入下一轮。
3. break 和 continue 核心区别
💡 注意:在嵌套循环中,break/continue 只作用于当前所在的那一层循环,不会跳出外层循环。
四、循环的 else 子句(新手容易忽略)
Python 的循环可以搭配 else 使用,规则是:
- 循环正常结束(没有被 break 打断),就执行 else 里的代码
- 循环被
break强制跳出,else 里的代码不会执行
示例:找元素,没找到就提示
nums = [1, 2, 3, 4, 5]target = 6 # 要找的数字for num in nums: if num == target: print("找到目标了") breakelse: # 循环正常走完,没触发break,说明没找到 print("列表里没有这个数字")
运行结果:列表里没有这个数字
如果把 target 改成 3,循环会被 break 打断,else 里的内容就不会执行。
五、嵌套循环
循环里面再套循环,就是嵌套循环。外层循环执行一次,内层循环执行完整的一轮。
1. 基础语法
for i in 外层序列: 外层代码 for j in 内层序列: 内层代码
2. 经典案例:打印九九乘法表
# 外层循环控制行数:1到9行for i in range(1, 10): # 内层循环控制每行的式子:第i行有i个式子 for j in range(1, i+1): # end="" 表示打印完不换行,用空格隔开 print(f"{j}×{i}={i*j}", end=" ") # 一行打印完,换行 print()
运行结果:
1×1=1 1×2=2 2×2=4 1×3=3 2×3=6 3×3=9 ...1×9=9 2×9=18 ... 9×9=81
执行逻辑说明
- 外层 i=1 时,内层 j 从 1 到 1,打印 1 个式子,换行
- 外层 i=2 时,内层 j 从 1 到 2,打印 2 个式子,换行
- 以此类推,外层一共循环 9 次,内层每次循环 i 次
💡 新手建议:嵌套层数尽量不要超过 3 层,太多层会非常难读,也容易出 bug。
六、综合实战案例
案例 1:计算 1~100 的累加和
total = 0for i in range(1, 101): total += iprint("1到100的和是:", total)
结果:1到100的和是: 5050
案例 2:统计列表里的及格人数
scores = [85, 59, 92, 76, 45, 88, 60]count = 0 # 计数器for score in scores: if score >= 60: count += 1print(f"及格人数:{count} 人")
结果:及格人数:5 人
案例 3:猜数字小游戏
import randomanswer = random.randint(1, 100) # 随机生成1-100的答案count = 0while True: guess = int(input("请猜一个1-100的数字:")) count += 1 if guess > answer: print("猜大了,再小一点") elif guess < answer: print("猜小了,再大一点") else: print(f"恭喜你猜对了!答案就是{answer},一共猜了{count}次") break
七、新手高频易错点总结
- while 循环忘记计数器自增
- 缩进混乱
- range 范围搞错:左闭右开,
range(5)是 0 到 4,不是 0 到 5 - break 和 continue 搞混:break 终止整个循环,continue 只跳本次
- 嵌套循环层级混乱:外层执行一次,内层执行完整一轮,注意变量不要重名
- 循环里修改正在遍历的列表
- 冒号漏掉