Python: 循环结构
写代码时,你经常会遇到这样的场景:重复做同一件事。比如,打印 1 到 100 的数字、处理列表中的每一个元素、或者不断询问用户输入直到得到正确答案。
如果用手写,100 个数字就要写 100 行 print(),显然不现实。这时候就需要 循环 来帮忙了。Python 提供了两种循环方式:
for循环 —— 用于"遍历"一个序列(列表、字符串、range 等)while循环 —— 用于"条件成立时一直执行"
1. for 循环基础
for 循环是 Python 中最常用的循环形式。它的核心思想是:从序列中逐个取出元素,每次都执行一遍相同的代码块。
基本语法:
for 变量 in 序列:
要重复执行的代码
变量会依次被赋值为序列中的每一个元素,然后执行缩进块中的代码。
▶ 示例:遍历列表和字符串(⭐)
# 遍历列表
fruits = ["苹果", "香蕉", "橙子", "葡萄"]
for fruit in fruits:
print(f"我喜欢吃 {fruit}")
print("---")
# 遍历字符串 —— 每个字符依次输出
for char in "Python":
print(char)
输出:
我喜欢吃 苹果
我喜欢吃 香蕉
我喜欢吃 橙子
我喜欢吃 葡萄
---
P
y
t
h
o
n
fruits,变量就用 fruit;列表是 students,变量就用 student。代码读起来就像自然语言一样顺畅。
2. range() 函数 —— 生成数字序列
当你需要重复执行固定次数时,range() 是最佳搭档。
range() 有三种用法:
| 写法 | 含义 | 示例 | 结果 |
|---|---|---|---|
range(stop) |
0 → stop-1 | range(5) |
0,1,2,3,4 |
range(start, stop) |
start → stop-1 | range(2, 6) |
2,3,4,5 |
range(start, stop, step) |
带步长 | range(1, 10, 2) |
1,3,5,7,9 |
注意:
range()生成的序列不包含 stop 值,和切片规则一致,都是"顾头不顾尾"。
▶ 示例:用 range 控制循环次数(⭐)
# 打印 1 到 5
for i in range(1, 6):
print(f"第 {i} 次循环")
print("---")
# 步长为 2:打印 0 到 10 的偶数
for i in range(0, 11, 2):
print(i, end=" ") # end=" " 让输出不换行
# 输出: 0 2 4 6 8 10
输出:
---
▶ 示例:结合 range 和 len 遍历列表下标(⭐⭐)
students = ["Charlie", "Diana", "Eric", "Grace"]
# 同时获取下标和元素
for i in range(len(students)):
print(f"第 {i + 1} 号同学:{students[i]}")
输出:
第 1 号同学:Charlie
第 2 号同学:Diana
第 3 号同学:Eric
第 4 号同学:Grace
enumerate(),我们会在后面的课程中讲到。
3. while 循环
while 循环和 for 循环的区别在于:for 知道要循环多少次,while 只知道什么时候停止。
基本语法:
while 条件:
要重复执行的代码
每次循环开始前,先判断条件是否为 True,如果是就执行代码块,执行完再回来判断……直到条件变成 False。
▶ 示例:猜数字前的准备工作——倒计时(⭐)
count = 5
while count > 0:
print(f"倒计时:{count}")
count -= 1 # 每次减 1,非常重要!不然会死循环
print("发射!🚀")
输出:
倒计时:5
倒计时:4
倒计时:3
倒计时:2
倒计时:1
发射!🚀
count -= 1,条件 count > 0 永远为 True,程序就会无限循环下去,直到你强制终止。写 while 循环时,一定要确认循环条件能在某个时刻变成 False。
▶ 示例:while 的典型用法——直到遇到特定值(⭐⭐)
# 不断取半,直到小于 1
num = 100
while num >= 1:
print(num, end=" → ")
num /= 2
# 输出: 100 → 50.0 → 25.0 → 12.5 → 6.25 → 3.125 → 1.5625 → 0.78125
输出:
# 执行成功
这个例子很好地展示了 while 的优势:我们事先不知道需要循环多少次,只知道什么时候停下来。
4. break 和 continue —— 循环的"刹车"与"跳过"
(1) break —— 立即结束循环
当某个条件满足时,用 break 可以直接跳出整个循环,不再执行后面的循环。
(2) continue —— 跳过本次循环
当某个条件满足时,用 continue 可以跳过本次循环的剩余代码,直接进入下一次循环。
▶ 示例:break 和 continue 对比(⭐)
print("=== break 示例 ===")
for i in range(1, 10):
if i == 5:
break # 遇到 5 就彻底结束
print(i, end=" ")
# 输出: 1 2 3 4
print("\n=== continue 示例 ===")
for i in range(1, 10):
if i == 5:
continue # 跳过 5,继续后面的
print(i, end=" ")
# 输出: 1 2 3 4 6 7 8 9
输出:
=== break 示例 ===
\n=== continue 示例 ===
▶ 示例:break 的实战——搜索即停止(⭐⭐)
# 在列表中搜索第一个偶数
numbers = [3, 7, 9, 2, 5, 8, 1]
for num in numbers:
if num % 2 == 0:
print(f"找到第一个偶数:{num}")
break # 找到就不找了
else:
print("列表中没有偶数") # 注意:这个 else 属于 for,后面会讲
输出:
列表中没有偶数
▶ 示例:continue 的实战——只处理有效数据(⭐⭐)
# 只处理正数,跳过负数和零
data = [3, -5, 0, 8, -2, 7, 0, 4]
positive_sum = 0
for num in data:
if num <= 0:
continue # 跳过无效数据
positive_sum += num
print(f"正数之和为:{positive_sum}") # 输出: 22 (3+8+7+4)
输出:
# 执行成功
5. for-else 和 while-else —— 循环的"正常结束奖励"
这是 Python 一个特有的语法特性,其他很多语言中没有。
else 块在循环正常结束(没有被 break 中断)时执行。可以理解为:"如果循环没有被中途打断,就执行这个奖励代码"。
▶ 示例:检查数字是否为质数(⭐⭐)
num = 17
for i in range(2, num):
if num % i == 0:
print(f"{num} 不是质数,能被 {i} 整除")
break
else:
print(f"{num} 是质数!") # 没有 break 才会执行
输出:
# 执行成功
在这个例子中:
- 如果找到了一个能整除的
i,break触发,else不执行 - 如果遍历完所有
i都没有整除的,循环正常结束,else执行
for-else 有点反直觉。你可以这样记:else 的意思是 "如果没有 break 的话,就……"。
6. 嵌套循环
循环里面再套循环,就是嵌套循环。外层循环每执行一次,内层循环会完整地执行一轮。
▶ 示例:打印九九乘法表(⭐⭐)
for i in range(1, 10): # 外层循环:行
for j in range(1, i + 1): # 内层循环:列
print(f"{j}×{i}={i*j}", end="\t")
print() # 每行结束后换行
输出:
1×1=1
1×2=2 2×2=4
1×3=3 2×3=6 3×3=9
1×4=4 2×4=8 3×4=12 4×4=16
1×5=5 2×5=10 3×5=15 4×5=20 5×5=25
1×6=6 2×6=12 3×6=18 4×6=24 5×6=30 6×6=36
1×7=7 2×7=14 3×7=21 4×7=28 5×7=35 6×7=42 7×7=49
1×8=8 2×8=16 3×8=24 4×8=32 5×8=40 6×8=48 7×8=56 8×8=64
1×9=9 2×9=18 3×9=27 4×9=36 5×9=45 6×9=54 7×9=63 8×9=72 9×9=81
▶ 示例:嵌套循环的 break 只作用于当前层(⭐⭐)
for i in range(1, 4):
for j in range(1, 10):
if j > i:
break # 只跳出内层循环
print(f"({i},{j})", end=" ")
print()
输出:
(1,1)
(2,1) (2,2)
(3,1) (3,2) (3,3)
7. 综合示例
▶ 示例 1:猜数字游戏(⭐⭐)
系统随机生成一个 1~100 之间的数字,玩家猜测,系统提示"大了"或"小了",直到猜中为止。
import random
# 生成随机目标数字
target = random.randint(1, 100)
attempts = 0
print("🎯 猜数字游戏!我心中有一个 1~100 之间的数字。")
while True: # 无限循环,靠 break 退出
try:
guess = int(input("请输入你的猜测:"))
except ValueError:
print("请输入有效的数字!")
continue
attempts += 1
if guess < target:
print("小了,再大一点!")
elif guess > target:
print("大了,再小一点!")
else:
print(f"🎉 恭喜你猜对了!就是 {target}!")
print(f"你一共猜了 {attempts} 次。")
break # 猜中后退出循环
关键点分析:
while True配合break是 Python 中非常常见的模式try-except捕获非数字输入,用continue让用户重新输入- 猜中后
break退出循环,程序结束
▶ 示例 2:密码强度检测器(⭐⭐⭐)
根据用户输入的密码,逐项检查并给出强度评分。
password = input("请输入密码:")
score = 0
feedback = []
# 1. 检查长度
if len(password) >= 8:
score += 1
else:
feedback.append("❌ 密码长度不足 8 位")
# 2. 遍历检查字符类型
has_upper = False
has_lower = False
has_digit = False
has_special = False
special_chars = "!@#$%^&*"
for char in password:
if char.isupper():
has_upper = True
elif char.islower():
has_lower = True
elif char.isdigit():
has_digit = True
elif char in special_chars:
has_special = True
# 根据检查结果评分
checks = [has_upper, has_lower, has_digit, has_special]
score += sum(checks)
if not has_upper:
feedback.append("❌ 缺少大写字母")
if not has_lower:
feedback.append("❌ 缺少小写字母")
if not has_digit:
feedback.append("❌ 缺少数字")
if not has_special:
feedback.append("❌ 缺少特殊字符")
# 3. 输出结果
print(f"\n密码强度评分:{score}/5")
if feedback:
print("改进建议:")
for item in feedback:
print(f" {item}")
else:
print("🎉 密码强度优秀!")
运行示例:
请输入密码:Hello123
密码强度评分:3/5
改进建议:
❌ 缺少特殊字符
请输入密码:P@ssw0rd!
密码强度评分:5/5
🎉 密码强度优秀!
这个示例综合运用了 for 循环遍历字符串、sum() 统计布尔值、以及循环中的条件判断。每个字符依次过检,体现了"遍历处理"的编程思维。
8. 常见应用场景
| 场景 | 推荐循环 | 说明 |
|---|---|---|
| 遍历列表/元组/集合 | for |
元素逐个处理 |
| 遍历字典的键值对 | for |
配合 .items() |
| 重复 N 次操作 | for + range() |
次数明确 |
| 直到条件满足才停止 | while |
次数不确定 |
| 读取文件直到末尾 | for / while |
文件对象可迭代 |
| 用户输入验证 | while + break |
直到输入合法 |
| 无限循环(服务器、游戏主循环) | while True |
靠 break 退出 |
❓ 常见问题
for 和 while 到底怎么选?for;知道什么时候停(等待输入/逼近值)用 while。两者往往可以互换,但选对的那一方代码更清晰。for i in range(len(list)) 是 Python 风格吗?for item in list。只有确实需要下标时才用 range(len(...)),这种情况用 enumerate() 更优雅。itertools 简化组合、或重新思考是否有更优的算法。📖 小节
for循环用于遍历序列(列表、字符串、range 等),每次取一个元素执行代码块range(start, stop, step)生成数字序列,不包含 stop 值,步长可正可负while循环用于条件驱动,每次循环前判断条件,注意避免死循环break立即结束整个循环,continue跳过本次循环的剩余部分for-else/while-else是 Python 特有语法,else在循环未被break中断时执行- 嵌套循环中外层每执行一次,内层执行完整一轮,总次数为各层次数乘积
📝 作业
⭐ 第一题:偶数求和
使用 for 循环和 range(),计算 1 到 100 之间所有偶数的和。
提示:range(2, 101, 2) 一步到位。
⭐⭐ 第二题:斐波那契数列
斐波那契数列的定义:前两个数都是 1,从第三个数开始,每个数等于前两个数之和。 即:1, 1, 2, 3, 5, 8, 13, 21, ...
请用 while 循环,输出斐波那契数列中不超过 1000 的所有项。
提示:用三个变量 a, b 表示当前两个数,每次计算 a + b 得到下一个数,然后向前滚动。
⭐⭐⭐ 第三题:简易计算器
编写一个程序,让用户反复输入两个数字和一个运算符(+、-、*、/),输出计算结果。
输入 q 退出程序。
要求:
- 使用
while True和break - 处理除零错误(除数不能为 0)
- 处理无效运算符(打印提示,不退出)
- 使用
continue让程序在输入无效时重新询问,而不是崩溃
示例运行:
输入第一个数字:10
输入运算符(+ - * /):/
输入第二个数字:3
= 3.333...
输入第一个数字:8
输入运算符(+ - * /):%
无效的运算符,请使用 + - * /
输入第一个数字:8
输入运算符(+ - * /):/
输入第二个数字:0
错误:除数不能为 0
输入第一个数字:q
再见!