Python 循环:从"重复劳动"到"自动化流水线"
引言:为什么需要循环?
想象你是一个工厂质检员,要检查 10000 个产品。如果每个产品都要手动记录:"检查产品1,检查产品2,检查产品3...",你会写到手软。
更好的办法是:制定一个检查流程,然后重复执行 10000 次。
在编程世界里,循环就是这条"自动化流水线"。它让计算机不知疲倦地重复执行任务,从计算 1+2+3+...+10000 到处理百万条数据,都离不开循环。
Python 提供了两种循环:
- for 循环:像点名——"张三、李四、王五...每个人都叫一遍"
- while 循环:像守门——"只要有人排队,就继续放行"
一、for 循环:逐个处理的"点名器"
1.1 最基本的 for 循环
names = ['Michael', 'Bob', 'Tracy']
for name in names:
print(name)输出:
Michael
Bob
Tracy生活化理解:就像老师点名——"Michael 到!Bob 到!Tracy 到!"。for name in names 就是"对 names 里的每个人,执行以下操作"。
执行流程:
第1次循环:name = 'Michael' → print('Michael')
第2次循环:name = 'Bob' → print('Bob')
第3次循环:name = 'Tracy' → print('Tracy')
(没有更多元素,循环结束)1.2 用 for 循环累加
sum = 0
for x in [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]:
sum = sum + x
print(sum) # 55逐步解析:
| 循环次数 | x | sum(旧) | sum(新) |
|---|---|---|---|
| 1 | 1 | 0 | 1 |
| 2 | 2 | 1 | 3 |
| 3 | 3 | 3 | 6 |
| ... | ... | ... | ... |
| 10 | 10 | 45 | 55 |
1.3 range():生成数字序列
如果要计算 1 到 100 的和,手写 [1, 2, 3, ..., 100] 太麻烦。Python 提供了 range() 函数:
# range(5) 生成 0,1,2,3,4(注意:不包含5!)
print(list(range(5))) # [0, 1, 2, 3, 4]
# range(1, 5) 生成 1,2,3,4
print(list(range(1, 5))) # [1, 2, 3, 4]
# range(1, 10, 2) 生成 1,3,5,7,9(步长为2)
print(list(range(1, 10, 2))) # [1, 3, 5, 7, 9]计算 1-100 的和:
sum = 0
for x in range(101): # 0 到 100
sum = sum + x
print(sum) # 5050生活化理解:range(101) 像自动生成号码牌——0号、1号、2号...100号,不用手写。
1.4 for 循环遍历字符串
for char in 'Hello':
print(char)输出:
H
e
l
l
o1.5 for 循环遍历字典
d = {'name': '张三', 'age': 25, 'city': '北京'}
# 遍历 key
for key in d:
print(key)
# 遍历 key-value
for key, value in d.items():
print(f'{key}: {value}')二、while 循环:条件驱动的"守门员"
2.1 最基本的 while 循环
n = 1
while n <= 5:
print(n)
n = n + 1输出:1 2 3 4 5
生活化理解:就像健身房跑步——"只要还没跑满30分钟,就继续跑"。while n <= 5 是"只要 n 不超过 5,就继续"。
执行流程:
n=1:1<=5 为真 → print(1) → n=2
n=2:2<=5 为真 → print(2) → n=3
...
n=5:5<=5 为真 → print(5) → n=6
n=6:6<=5 为假 → 循环结束2.2 计算 100 以内奇数和
sum = 0
n = 99
while n > 0:
sum = sum + n
n = n - 2
print(sum) # 2500逐步解析:
| 循环次数 | n | sum(旧) | sum(新) |
|---|---|---|---|
| 1 | 99 | 0 | 99 |
| 2 | 97 | 99 | 196 |
| 3 | 95 | 196 | 291 |
| ... | ... | ... | ... |
| 50 | 1 | 2499 | 2500 |
| 51 | -1 | 2500 | 循环结束 |
2.3 while 循环的注意事项
# ❌ 危险:忘记更新条件变量,导致死循环
n = 1
while n <= 5:
print(n)
# 忘记写 n = n + 1,n 永远是 1,死循环!
# ✅ 正确:确保条件最终会变为 False
n = 1
while n <= 5:
print(n)
n = n + 1 # 关键:更新 n三、break:紧急出口的"逃生门"
3.1 break 的作用
break 语句会立即退出整个循环,不管循环条件是否满足。
n = 1
while n <= 100:
if n > 10:
break # n=11 时,跳出循环
print(n)
n = n + 1
print('END')输出:1 2 3 4 5 6 7 8 9 10 END
生活化理解:就像你在排队买票,突然有急事要离开——break 就是"不排了,直接走人"。
3.2 在 for 循环中使用 break
names = ['Michael', 'Bob', 'Tracy', 'Adam']
for name in names:
if name == 'Tracy':
print('找到了!')
break
print(f'检查:{name}')输出:
检查:Michael
检查:Bob
找到了!3.3 用 break 替代复杂的循环条件
# 不用 break(条件复杂)
n = 1
found = False
while n <= 100 and not found:
if n == 50:
found = True
else:
print(n)
n = n + 1
# 用 break(更清晰)
n = 1
while n <= 100:
if n == 50:
break
print(n)
n = n + 1四、continue:跳过的"快进键"
4.1 continue 的作用
continue 语句会跳过本次循环的剩余代码,直接进入下一次循环。
n = 0
while n < 10:
n = n + 1
if n % 2 == 0: # 如果是偶数
continue # 跳过 print,直接进入下一次循环
print(n)输出:1 3 5 7 9
生活化理解:就像看视频时按快进——"这段广告跳过,继续看下一段"。continue 就是"本次循环的剩余部分跳过,直接开始下一轮"。
4.2 在 for 循环中使用 continue
# 打印所有非空字符串
words = ['apple', '', 'banana', '', 'cherry']
for word in words:
if not word: # 如果是空字符串
continue # 跳过
print(word)输出:apple banana cherry
4.3 break vs continue 对比
| 对比维度 | break | continue |
|---|---|---|
| 作用 | 退出整个循环 | 跳过本次循环 |
| 循环是否继续 | 终止 | 继续下一轮 |
| 生活类比 | 紧急出口,直接离开 | 快进键,跳过当前 |
五、常见误区与陷阱
5.1 误区一:死循环
# ❌ 经典死循环:条件永远为真
n = 1
while n > 0:
print(n)
n = n + 1 # n 越来越大,永远 > 0
# ❌ 忘记更新变量
n = 1
while n <= 10:
print(n)
# 忘记 n = n + 1
# ✅ 正确
n = 1
while n <= 10:
print(n)
n = n + 1如何退出死循环:按 Ctrl + C(Windows/Linux)或 Cmd + C(Mac)。
5.2 误区二:range() 的边界
# ❌ 错误:以为 range(5) 包含 5
for i in range(5):
print(i) # 输出 0,1,2,3,4(没有5!)
# ✅ 正确:要包含 5 就写 range(6)
for i in range(6):
print(i) # 输出 0,1,2,3,4,5记忆口诀:range(n) 生成 0 到 n-1,左闭右开。
5.3 误区三:在循环中修改列表
# ❌ 危险:在遍历列表时修改列表
numbers = [1, 2, 3, 4, 5]
for num in numbers:
if num % 2 == 0:
numbers.remove(num) # 可能导致跳过元素或错误
# ✅ 正确:创建新列表
numbers = [1, 2, 3, 4, 5]
odd_numbers = []
for num in numbers:
if num % 2 != 0:
odd_numbers.append(num)
print(odd_numbers) # [1, 3, 5]5.4 误区四:滥用 break 和 continue
# ❌ 过度使用 break 和 continue,逻辑混乱
n = 0
while True:
n = n + 1
if n % 2 == 0:
continue
if n > 10:
break
print(n)
# ✅ 更清晰:用循环条件控制
n = 0
while n < 10:
n = n + 1
if n % 2 != 0:
print(n)原则:能用循环条件表达的,就不要用 break/continue。
六、实战案例
案例 1:斐波那契数列
# 打印前 20 个斐波那契数
a, b = 0, 1
count = 0
while count < 20:
print(a, end=' ')
a, b = b, a + b # 关键:同时更新两个变量
count = count + 1输出:0 1 1 2 3 5 8 13 21 34 55 89 144 233 377 610 987 1597 2584 4181
案例 2:猜数字游戏
import random
answer = random.randint(1, 100)
attempts = 0
max_attempts = 10
print('我想了一个 1-100 的数字,你来猜!')
while attempts < max_attempts:
guess = int(input(f'第 {attempts + 1} 次猜测:'))
attempts = attempts + 1
if guess == answer:
print(f'恭喜!你用了 {attempts} 次就猜对了!')
break
elif guess < answer:
print('猜小了,再试试')
else:
print('猜大了,再试试')
else:
print(f'很遗憾,答案是 {answer}')案例 3:简易购物车
cart = []
total = 0
print('欢迎购物!输入商品名称,输入 "结账" 结束。')
while True:
item = input('请输入商品:')
if item == '结账':
break
if not item:
print('商品名不能为空,请重新输入')
continue
price = float(input(f'请输入 "{item}" 的价格:'))
cart.append({'name': item, 'price': price})
total = total + price
print(f'已添加:{item},当前总价:{total:.2f} 元')
print('\n===== 购物清单 =====')
for item in cart:
print(f'{item["name"]}: {item["price"]:.2f} 元')
print(f'总计:{total:.2f} 元')案例 4:打印九九乘法表
for i in range(1, 10):
for j in range(1, i + 1):
print(f'{j}x{i}={i*j}', end='\t')
print() # 换行输出:
1x1=1
1x2=2 2x2=4
1x3=3 2x3=6 3x3=9
...七、动手练习
练习 1:用 for 循环打印 Hello, xxx!
L = ['Bart', 'Lisa', 'Adam']
for name in L:
print(f'Hello, {name}!')练习 2:用 while 循环计算 1-100 的偶数和
sum = 0
n = 2
while n <= 100:
sum = sum + n
n = n + 2
print(sum) # 2550练习 3:写一个死循环,然后用 Ctrl+C 退出
# 这就是一个死循环
while True:
print('按 Ctrl+C 退出')总结
| 概念 | 核心要点 |
|---|---|
| for 循环 | 遍历序列(list, tuple, str, dict),逐个处理 |
| while 循环 | 条件为真时重复执行 |
| range() | 生成数字序列,左闭右开 |
| break | 立即退出整个循环 |
| continue | 跳过本次循环,进入下一轮 |
| 死循环 | 条件永远为真,用 Ctrl+C 退出 |
| 选择原则 | 已知次数用 for,未知次数用 while |
记住:for 是点名器——逐个处理已知元素;while 是守门员——条件满足就继续。break 是逃生门——立即离开;continue 是快进键——跳过当前。
本文基于廖雪峰 Python 教程重新撰写,补充了大量背景知识、生活化类比和实战场景。推荐继续阅读:函数