- 核心思想:它们各自的设计初衷是什么?
- 语法结构:如何书写这两种循环?
- 工作原理:它们是如何执行的?
- 使用场景:在什么情况下应该用哪个?
- 关键区别总结:一张图看懂所有不同。
- 进阶用法:
break,continue,else子句。 - 综合示例
核心思想
-
while循环: “当...时,就...”
(图片来源网络,侵删)- 它是一个条件控制的循环,只要给定的条件为
True,循环体内的代码就会一直重复执行,一旦条件变为False,循环立即终止。 - 你在开始循环时,可能不知道具体要执行多少次。
- 它是一个条件控制的循环,只要给定的条件为
-
for循环: “对于...中的每一个...,就...”- 它是一个迭代(Iteration)循环,它专门用于遍历任何可迭代对象(如列表、元组、字符串、字典等)中的每一个元素。
- 你在开始循环时,确切地知道要遍历的元素数量,循环的次数是确定的。
语法结构
while 循环语法
while 条件:
# 循环体
# 当条件为 True 时,会执行这里的代码
# 注意:循环体内必须有能让条件最终变为 False 的逻辑,否则会无限循环
for 循环语法
for 变量 in 可迭代对象:
# 循环体
# 对于可迭代对象中的每一个元素,都会将其赋值给变量,并执行这里的代码
工作原理
while 循环工作原理
- 判断条件:程序会检查
while后面的条件表达式。 - 条件为 True:如果条件为
True,则执行while循环体内的代码块。 - 循环与重判:执行完代码块后,程序会回到第1步,再次判断条件,只要条件一直为
True,这个过程就会重复。 - 条件为 False:当某次判断条件结果为
False时,循环终止,程序会跳过循环体,执行while循环之后的代码。
⚠️ 重要警告:无限循环
while 循环的条件永远无法变为 False,就会形成无限循环,程序将无法正常结束,在编写 while 循环时,必须确保循环体内有能够改变条件、使其最终变为 False 的代码。
for 循环工作原理
- 获取可迭代对象:
for循环会获取它后面的可迭代对象(比如一个列表my_list = [1, 2, 3])。 - 取出第一个元素:从该对象中取出第一个元素(
1),并将其赋值给循环变量(item)。 - 执行循环体:执行一次循环体内的代码。
- 取出下一个元素:执行完毕后,再从可迭代对象中取出下一个元素(
2),赋值给循环变量。 - 重复执行:重复第3、4步,直到可迭代对象中的所有元素都被遍历过一次。
- 循环结束:当所有元素都遍历完后,
for循环自动结束,程序继续执行循环之后的代码。
使用场景
| 场景描述 | 推荐循环 | 原因 |
|---|---|---|
| 遍历一个序列(如列表、字符串、元组等) | for 循环 |
for 循环为此而生,代码更简洁、更 Pythonic。 |
| 执行固定次数 | for 循环 |
配合 range() 函数使用,非常方便。 |
| 当某个条件满足时才执行,且不确定次数 | while 循环 |
等待用户输入正确密码、游戏中的主循环、读取数据直到文件末尾。 |
| 需要手动控制循环变量 | while 循环 |
你可以在循环体内自由地修改循环变量,以实现复杂的控制逻辑。 |
关键区别总结
| 特性 | while 循环 |
for 循环 |
|---|---|---|
| 控制方式 | 基于条件(布尔值) | 基于迭代(遍历序列) |
| 执行次数 | 不确定(可能为0次、1次或无数次) | 确定(等于可迭代对象的元素个数) |
| 循环变量 | 需要手动初始化和更新 | 自动从可迭代对象中获取和赋值 |
| 典型用途 | 事件驱动、等待条件、无限循环 | 遍历数据、固定次数操作 |
| 风险 | 容易造成无限循环 | 不易造成无限循环 |
进阶用法
break 语句
用于立即终止当前所在的循环,无论条件是否满足或是否还有元素未遍历。
# while break
count = 0
while True:
print(f"Count is {count}")
count += 1
if count == 5:
break # 当 count 等于 5 时,跳出循环
# for break
fruits = ["apple", "banana", "cherry", "orange"]
for fruit in fruits:
if fruit == "cherry":
break # 遇到 "cherry" 时,停止遍历
print(fruit)
# 输出:
# apple
# banana
continue 语句
用于跳过当前循环的剩余部分,直接进入下一次循环的判断或迭代。

# while continue
count = 0
while count < 5:
count += 1
if count == 3:
continue # 当 count 等于 3 时,跳过下面的 print,直接进入下一次循环
print(f"Count is {count}")
# for continue
fruits = ["apple", "banana", "cherry", "orange"]
for fruit in fruits:
if fruit == "cherry":
continue # 遇到 "cherry" 时,跳过下面的 print,继续遍历下一个
print(fruit)
# 输出:
# Count is 1
# Count is 2
# Count is 4
# Count is 5
# apple
# banana
# orange
else 子句
循环结构可以有一个 else 子句,这个 else 块会在循环正常结束(即没有被 break 语句中断)时执行。
# while-else
count = 0
while count < 3:
print(f"Count is {count}")
count += 1
else:
print("While loop finished normally.") # 循环条件变为 False,正常结束,所以执行 else
# for-else
fruits = ["apple", "banana", "cherry"]
for fruit in fruits:
print(fruit)
if fruit == "durian": # 这个条件永远不会满足
break
else:
print("For loop finished normally.") # 循环遍历完所有元素,正常结束,所以执行 else
# --- break 的情况 ---
print("\n--- With break ---")
for fruit in fruits:
print(fruit)
if fruit == "banana":
break # 遇到 break,循环被中断
else:
# 这里的代码不会被执行,因为循环被 break 打断了
print("This line will not be printed.")
综合示例
示例1:猜数字游戏 (适合 while)
我们不知道用户会猜几次,所以用 while 循环最合适。
import random
# 生成一个 1 到 100 之间的随机数
target_number = random.randint(1, 100)
guess = -1 # 初始化一个不等于 target_number 的值
print("欢迎来到猜数字游戏!我已经想好了一个 1 到 100 之间的数字。")
# 当 guess 不等于目标数字时,一直循环
while guess != target_number:
try:
# 获取用户输入
guess_str = input("请输入你猜的数字: ")
guess = int(guess_str)
# 判断大小
if guess < target_number:
print("太小了!再试一次。")
elif guess > target_number:
print("太大了!再试一次。")
else:
print(f"恭喜你!猜对了!数字就是 {target_number}!")
except ValueError:
print("输入无效,请输入一个整数。")
print("游戏结束。")
示例2:计算列表中所有数字的总和 (适合 for)
我们知道要遍历列表中的每一个元素,所以用 for 循环。
numbers = [10, 20, 30, 40, 50]
total_sum = 0
# 遍历 numbers 列表中的每一个元素
for number in numbers:
total_sum += number # 将每个数字加到总和中
print(f"列表 {numbers} 中所有数字的总和是: {total_sum}")
示例3:使用 range() 的 for 循环
如果需要执行固定次数的循环,for 循环配合 range() 是最佳选择。
# 打印 0 到 4 (不包括 5)
print("打印 0 到 4:")
for i in range(5):
print(i)
# 打印 2 到 8 (不包括 9),步长为 2
print("\n打印 2 到 8,步长为 2:")
for i in range(2, 9, 2):
print(i)
# 从 10 倒数到 1
print("\n从 10 倒数到 1:")
for i in range(10, 0, -1):
print(i)
- 想想你的循环是“基于条件”还是“基于遍历”。
- 如果不确定次数,等待某个条件发生,用
while。 - 如果要遍历一个明确的序列或执行固定次数,用
for。 - 熟练掌握
break、continue和else子句,能让你的循环逻辑更加健壮和灵活。
