news 2026/5/20 0:24:41

Python(while循环)

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Python(while循环)

目录

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

执行流程

  1. 初始化count = 0

  2. 判断count < 5True,进入循环体。

  3. 打印0,然后count变为1

  4. 回到条件判断,1 < 5仍为True,重复。

  5. count变为5时,5 < 5False,循环结束。

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
循环结束

详细步骤

  1. 检查条件a < 3(此时a=1True)→ 进入循环体。

  2. 执行print,然后a += 1使a变为2

  3. 再次回到条件检查,2 < 3True,继续第二次循环。

  4. 第二次循环中a2变为3

  5. 条件检查3 < 3False,循环终止,执行循环外的print

关键点:循环条件在每次循环开始前计算,而不是在循环体中间动态判断。

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,4

break会立即退出循环,即使条件仍为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 += 1

4.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': 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 使用whileelse实现查找算法

在数据流中查找满足条件的元素,若找到则处理,若未找到则执行备选操作。

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.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+=1i+=1放在continue之前
忘记处理迭代器耗尽while True: x = next(it)StopIteration捕获使用try-except或改用for
使用=而不是==作为条件while x = 5:(语法错误)使用==比较
while内修改正在遍历的列表导致索引错乱遍历副本或使用其他结构
整数溢出(Python 中不存在)-Python 整数无限精度,但其他语言需注意

感谢你的观看,期待我们下次再见!

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/5/20 0:22:34

前端工程化18:前端单元测试Jest实战,保障项目代码稳定性

前端工程化18:前端单元测试Jest实战,保障项目代码稳定性 文章目录 前端工程化18:前端单元测试Jest实战,保障项目代码稳定性 前言 一、单元测试核心概念 1. 什么是单元测试 2. 单元测试优势 3. 适用测试场景 二、Jest环境快速搭建 1. 安装依赖 2. 新增测试运行脚本 3. 目录规…

作者头像 李华
网站建设 2026/5/20 0:17:48

深度拆解Pulse算法三大剪枝策略:如何让你的路径搜索快10倍?

深度拆解Pulse算法三大剪枝策略&#xff1a;如何让你的路径搜索快10倍&#xff1f; 在解决复杂的组合优化问题时&#xff0c;如车辆路径规划&#xff08;VRP&#xff09;或旅行商问题&#xff08;TSP&#xff09;&#xff0c;算法的效率往往决定了实际应用的可行性。Pulse算法作…

作者头像 李华
网站建设 2026/5/20 0:14:34

实测Taotoken多模型路由在高峰期的响应延迟与稳定性表现

&#x1f680; 告别海外账号与网络限制&#xff01;稳定直连全球优质大模型&#xff0c;限时半价接入中。 &#x1f449; 点击领取海量免费额度 实测Taotoken多模型路由在高峰期的响应延迟与稳定性表现 1. 测试背景与目的 对于依赖大模型API进行开发的团队而言&#xff0c;服…

作者头像 李华