目录
1.while 循环的基本概念
1.1 语法格式
1.2 最简单的示例
1.3 while 与 for 的对比
2. 代码执行顺序详解
3. 无限循环及其控制
3.1 无限循环的基本写法
3.2 避免无限循环的常见错误
4. break、continue 与 else
4.1 break:提前终止整个循环
4.2 continue:跳过本次循环剩余部分,进入下一次迭代
4.3 else 子句:循环正常结束时执行
5. 常见用法与实战模式
5.1 用户输入验证(直到输入合法)
5.2 模拟 do-while 循环
5.3 迭代收敛(数值计算,如牛顿迭代)
5.4 遍历自定义迭代器(手动模拟 for)
5.5 倒计时与延迟
6. 高级扩展与性能优化
6.1 使用 while 与 else 实现查找算法
6.2 while 与生成器配合处理大文件
6.3 性能注意事项
6.4 while 与递归
6.5 while 循环中的指针技巧(模拟 C 语言风格)
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.1break:提前终止整个循环
num = 0 while num < 10: if num == 5: break print(num) num += 1 # 输出 0,1,2,3,4break会立即退出循环,即使条件仍为True。
4.2continue:跳过本次循环剩余部分,进入下一次迭代
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 += 14.3else子句:循环正常结束时执行
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': break5.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.4142135625.4 遍历自定义迭代器(手动模拟 for)
it = iter([1, 2, 3]) while True: try: x = next(it) print(x) except StopIteration: break5.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])) # 156.2while与生成器配合处理大文件
逐行读取大文件,避免一次性加载到内存:
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.4while与递归
任何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.5while循环中的指针技巧(模拟 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 整数无限精度,但其他语言需注意 |
感谢你的观看,期待我们下次再见!