循环(loop)用于重复执行一段代码。while 循环会先判断条件(condition),只要条件为 True,就执行循环体;循环体执行完后,再回到条件处重新判断。
while 的基本结构
一个稳定的 while 循环通常包含三件事:
- 初值:循环开始前,先准备循环变量。
- 条件:每一轮开始前,判断是否继续循环。
- 更新:每一轮循环中,让循环变量发生变化。
i = 1 # 初始值
while i <= 5: # 条件
print("循环中:i =", i)
i += 1 # 更新
print("循环结束后:i =", i)运行结果:
循环中:i = 1
循环中:i = 2
循环中:i = 3
循环中:i = 4
循环中:i = 5
循环结束后:i = 6while 的特点是先判断、再执行。因此循环体可能执行多次,也可能一次都不执行。
逐行调试 while 循环
像调试器一样逐行执行代码。蓝色行是下一条语句,右侧会同步显示变量和输出。
01i = 10203while i <= 5:04 print("循环中:i =", i)05 i += 10607print("循环结束后:i =", i)
>>>
知识测验
累加与平均值
循环经常和累加变量一起使用。下面的程序读取 5 个人的身高,并计算平均值。
NUM_PEOPLE = 5
total = 0
i = 1
while i <= NUM_PEOPLE:
height = float(input("请输入第 %d 个人的身高:" % i))
total += height
i += 1
average = total / NUM_PEOPLE
print("平均身高:%.2f" % average)一次可能的运行过程:
请输入第 1 个人的身高:160.8
请输入第 2 个人的身高:175.2
请输入第 3 个人的身高:171.2
请输入第 4 个人的身高:181.3
请输入第 5 个人的身高:164
平均身高:170.50total += height 的意思是把本次输入的身高加到累计总和里。循环结束后,total 保存的是所有身高之和。
知识测验
循环直到条件改变
while 适合处理“循环次数不一定一开始就知道”的任务。例如,计算一个整数有多少位。
num = abs(int(input("请输入一个整数:")))
if num == 0:
digits = 1
else:
digits = 0
while num != 0:
num //= 10
digits += 1
print("位数:%d" % digits)一次可能的运行结果:
请输入一个整数:123
位数:3这里额外处理了 0。如果直接写 while num != 0,输入 0 时循环一次也不会执行,位数会被错误地算成 0。
知识测验
猜数字游戏
还有一种常见场景是:程序不知道用户需要尝试多少次。猜数字游戏就是一个典型例子。程序先随机生成答案,然后不断读取用户输入;如果猜大了就提示“太大”,猜小了就提示“太小”,猜中后用 break 结束循环。
random 是随机数模块。这里第一次使用模块:import random 表示导入模块,random.randint(1, 100) 会生成 1 到 100 之间的随机整数。模块会在第 6 章系统介绍。
import random
answer = random.randint(1, 100)
cnt = 0
while True:
num = int(input("请猜一个数字:"))
cnt += 1
if num > answer:
print("太大")
elif num < answer:
print("太小")
else:
break
print("猜对了!你一共猜了 %d 次。" % cnt)一次可能的运行过程:
请猜一个数字:50
太大
请猜一个数字:25
太小
请猜一个数字:37
太小
请猜一个数字:43
太大
请猜一个数字:40
太大
请猜一个数字:38
太小
请猜一个数字:39
猜对了!你一共猜了 7 次。这里的 while True 会制造一个看似“永远为 True”的无限循环(infinite loop)。它不会自动结束,必须依靠循环体内部的 break 在猜中时主动跳出。
猜数字循环实验
答案会在 1–100 之间随机生成。根据“太大/太小”提示缩小蓝色候选区间,猜中时观察 break 如何结束循环。
01answer = random.randint(1, 100)02while True:03 guess = int(input("请输入猜测:"))04 if guess == answer:05 print("猜对了!")06 break07 elif guess > answer:08 print("太大")09 else:10 print("太小")
>>>
用 while 计算倒数和
读取一个正整数 n,用 while 计算 1 + 1/2 + 1/3 + ... + 1/n。
- 读取一个正整数 n。
- 用 while 循环逐项累加 1/i。
- 最后输出保留两位小数的总和。
用 while 计算整数各位之和
逐位取出一个正整数的个位数,并把这些数字累加起来。
- 读取一个正整数 num。
- 在 while 循环中不断取出个位数并加入 sum_digits。
- 循环结束后输出各位数字之和。