目录
[1.while 循环的基本概念](#1.while 循环的基本概念)
[1.1 语法格式](#1.1 语法格式)
[1.2 最简单的示例](#1.2 最简单的示例)
[1.3 while 与 for 的对比](#1.3 while 与 for 的对比)
[2. 代码执行顺序详解](#2. 代码执行顺序详解)
[3. 无限循环及其控制](#3. 无限循环及其控制)
[3.1 无限循环的基本写法](#3.1 无限循环的基本写法)
[3.2 避免无限循环的常见错误](#3.2 避免无限循环的常见错误)
[4. break、continue 与 else](#4. break、continue 与 else)
[4.1 break:提前终止整个循环](#4.1 break:提前终止整个循环)
[4.2 continue:跳过本次循环剩余部分,进入下一次迭代](#4.2 continue:跳过本次循环剩余部分,进入下一次迭代)
[4.3 else 子句:循环正常结束时执行](#4.3 else 子句:循环正常结束时执行)
[5. 常见用法与实战模式](#5. 常见用法与实战模式)
[5.1 用户输入验证(直到输入合法)](#5.1 用户输入验证(直到输入合法))
[5.2 模拟 do-while 循环](#5.2 模拟 do-while 循环)
[5.3 迭代收敛(数值计算,如牛顿迭代)](#5.3 迭代收敛(数值计算,如牛顿迭代))
[5.4 遍历自定义迭代器(手动模拟 for)](#5.4 遍历自定义迭代器(手动模拟 for))
[5.5 倒计时与延迟](#5.5 倒计时与延迟)
[6. 高级扩展与性能优化](#6. 高级扩展与性能优化)
[6.1 使用 while 与 else 实现查找算法](#6.1 使用 while 与 else 实现查找算法)
[6.2 while 与生成器配合处理大文件](#6.2 while 与生成器配合处理大文件)
[6.3 性能注意事项](#6.3 性能注意事项)
[6.4 while 与递归](#6.4 while 与递归)
[6.5 while 循环中的指针技巧(模拟 C 语言风格)](#6.5 while 循环中的指针技巧(模拟 C 语言风格))
[7. 常见陷阱与避坑指南](#7. 常见陷阱与避坑指南)
1.while 循环的基本概念
1.1 语法格式
while 条件表达式:
循环体代码块
else:
循环正常结束(没有被 break 终止)时执行的代码块
-
条件表达式 :任何能计算出布尔值的表达式。只要结果为
True,循环体就会重复执行;一旦结果为False,循环终止。 -
循环体 :缩进的代码块,至少要有一条语句(可以使用
pass占位)。 -
else 子句 (可选):仅当循环没有被
break终止时执行。常用于"查找失败"或"正常完成"的场景。
1.2 最简单的示例
count = 0
while count < 5:
print(count)
count += 1

执行流程:
初始化
count = 0。判断
count < 5为True,进入循环体。打印
0,然后count变为1。回到条件判断,
1 < 5仍为True,重复。当
count变为5时,5 < 5为False,循环结束。
1.3 while 与 for 的对比
| 特性 | for 循环 |
while 循环 |
|---|---|---|
| 适用场景 | 遍历已知序列或固定次数 | 条件控制,次数未知 |
| 循环变量 | 自动从可迭代对象中获取 | 需要手动初始化并更新 |
| 无限循环风险 | 极少(除非可迭代对象无限大) | 容易忘记更新条件导致无限循环 |
| 典型用途 | 遍历列表、字符串、range 等 | 用户输入验证、游戏主循环、迭代收敛算法 |
2. 代码执行顺序详解
理解 while 的执行顺序是避免逻辑错误的基础
a = 1
while a < 3:
print(f"开始循环,a = {a}")
a += 1
print(f"结束本次循环,a = {a}")
print("循环结束")
开始循环,a = 1
结束本次循环,a = 2
开始循环,a = 2
结束本次循环,a = 3
循环结束
详细步骤:
检查条件
a < 3(此时a=1,True)→ 进入循环体。执行
a += 1使a变为2。再次回到条件检查,
2 < 3为True,继续第二次循环。第二次循环中
a从2变为3。条件检查
3 < 3为False,循环终止,执行循环外的
关键点 :循环条件在每次循环开始前计算,而不是在循环体中间动态判断。
3. 无限循环及其控制
当条件永远为 True 时,循环永远不会终止,称为无限循环 。有时我们需要无限循环(例如游戏引擎、服务器主循环),但通常我们会设置一个退出条件(如 break)。
3.1 无限循环的基本写法
while True:
user_input = input("输入 'exit' 退出: ")
if user_input == 'exit':
break
print(f"你输入了: {user_input}")
注意事项:
使用
while True必须配合break退出,否则程序会永远运行。可以在循环体内的任何位置根据条件
break。
3.2 避免无限循环的常见错误
# 错误:忘记更新循环变量
i = 0
while i < 10:
print(i) # 无限循环,因为 i 永远为 0
修正:确保循环条件中的变量在循环体内被修改。
4. break、continue 与 else
4.1 break:提前终止整个循环
num = 0
while num < 10:
if num == 5:
break
print(num)
num += 1
# 输出 0,1,2,3,4
break 会立即退出循环,即使条件仍为 True。
4.2 continue:跳过本次循环剩余部分,进入下一次迭代
num = 0
while num < 5:
num += 1
if num == 3:
continue
print(num)
# 输出 1,2,4,5 (跳过了 3)
注意 :在 while 循环中使用 continue 时,务必确保循环变量更新在 continue 之前,否则可能导致无限循环。
# 错误示范
i = 0
while i < 5:
if i == 3:
continue # 跳过 i += 1,i 永远为 3,无限循环
print(i)
i += 1
4.3 else 子句:循环正常结束时执行
else 块仅在循环没有被 break 终止时运行。
# 查找列表中是否包含偶数
numbers = [1, 3, 5, 7]
i = 0
while i < len(numbers):
if numbers[i] % 2 == 0:
print(f"找到偶数 {numbers[i]}")
break
i += 1
else:
print("没有找到偶数")
因为列表全是奇数,break 未触发,else 会执行。
5. 常见用法与实战模式
5.1 用户输入验证(直到输入合法)
while True:
age_str = input("请输入年龄(1-120):")
if age_str.isdigit():
age = int(age_str)
if 1 <= age <= 120:
break
print("输入无效,请重新输入")
print(f"您的年龄是 {age}")
5.2 模拟 do-while 循环
Python 没有内置的 do-while(先执行一次再判断条件)。可以用 while True + break 模拟:
while True:
# 循环体至少执行一次
response = input("继续吗?(y/n): ")
if response == 'n':
break
5.3 迭代收敛(数值计算,如牛顿迭代)
def sqrt_newton(n, tolerance=1e-6):
guess = n / 2
while abs(guess * guess - n) > tolerance:
guess = (guess + n / guess) / 2
return guess
print(sqrt_newton(2)) # 约 1.414213562
5.4 遍历自定义迭代器(手动模拟 for)
it = iter([1, 2, 3])
while True:
try:
x = next(it)
print(x)
except StopIteration:
break
5.5 倒计时与延迟
import time
countdown = 5
while countdown > 0:
print(countdown)
time.sleep(1)
countdown -= 1
print("发射!")
6. 高级扩展与性能优化
6.1 使用 while 与 else 实现查找算法
在数据流中查找满足条件的元素,若找到则处理,若未找到则执行备选操作。
def find_first(predicate, iterable):
it = iter(iterable)
while True:
try:
item = next(it)
except StopIteration:
break
if predicate(item):
return item
else: # 这里 while-else 中的 else 表示"从未 break"
return None
print(find_first(lambda x: x > 10, [1,5,3])) # None
print(find_first(lambda x: x > 10, [1,15,3])) # 15
6.2 while 与生成器配合处理大文件
逐行读取大文件,避免一次性加载到内存:
with open('large_file.txt') as f:
while True:
line = f.readline()
if not line:
break
process(line)
更 Pythonic 的方式是 for line in f:,但 while 方式能让你在读取过程中灵活控制(例如跳过、回溯等)。
6.3 性能注意事项
避免在循环内重复计算不变的值:将常量提到循环外。
# 不推荐
while i < len(data):
do_something(i, len(data))
i += 1
# 推荐
n = len(data)
while i < n:
do_something(i, n)
i += 1
-
尽量使用局部变量:在循环内频繁访问全局变量或属性会比局部变量慢。
-
对于大量数值计算,考虑使用 NumPy 向量化,避免 Python 级别的循环。
6.4 while 与递归
任何 while 循环都可以改写为递归,但递归受限于调用栈深度。一般情况下 while 更高效且无栈溢出风险。
# 递归版本(不推荐用于大数据量)
def countdown(n):
if n <= 0:
print("发射")
else:
print(n)
countdown(n-1)
# while 版本
def countdown_while(n):
while n > 0:
print(n)
n -= 1
print("发射")
6.5 while 循环中的指针技巧(模拟 C 语言风格)
虽然 Python 不提倡,但有时需要手动控制索引:
# 删除列表中所有特定值(原地修改)
lst = [1, 2, 3, 2, 4, 2]
i = 0
while i < len(lst):
if lst[i] == 2:
lst.pop(i)
else:
i += 1
print(lst) # [1, 3, 4]
注意:pop 会改变列表长度,索引管理需要小心。更简单的做法是列表推导式。
7. 常见陷阱与避坑指南
| 陷阱 | 错误示例 | 解决方案 |
|---|---|---|
| 无限循环 | while i < 10: 但未更新 i |
确保循环条件中的变量在循环体内改变 |
continue 跳过更新 |
while i < 5: if cond: continue; i+=1 |
将 i+=1 放在 continue 之前 |
| 忘记处理迭代器耗尽 | while True: x = next(it) 无 StopIteration 捕获 |
使用 try-except 或改用 for |
使用 = 而不是 == 作为条件 |
while x = 5:(语法错误) |
使用 == 比较 |
在 while 内修改正在遍历的列表 |
导致索引错乱 | 遍历副本或使用其他结构 |
| 整数溢出(Python 中不存在) | - | Python 整数无限精度,但其他语言需注意 |
感谢你的观看,期待我们下次再见!