Python(while循环)

目录

[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

执行流程

  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.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 使用 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.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 整数无限精度,但其他语言需注意

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

相关推荐
.魚肉2 小时前
Raft 共识算法 · 演示系统(多终端)
算法·go·raft·分布式系统
星座5282 小时前
AI-Python机器学习与深度学习全栈实战:从机器学习、深度学习到自动化Agent在科学研究中的深度应用全揭秘
人工智能·python·机器学习
神奇小汤圆2 小时前
字节面试官:你知道Claude Code的多Agent实现机制吗?
算法
bqq198610262 小时前
Redis持久化
数据结构·数据库·redis·缓存
在坚持一下我可没意见2 小时前
Python 修仙修炼录 08:字典秘境,参悟键值玄机
开发语言·笔记·python·入门·字典
凌波粒2 小时前
深度学习入门(鱼书)第1章笔记——Python 基础
笔记·python·深度学习
运筹vivo@2 小时前
LeetCode 2540. 最小公共值
算法·leetcode·职场和发展
小许同学记录成长2 小时前
轻量正射实现原理技术文档
算法·无人机
阿文的代码库2 小时前
如何在C++中使用标准库的智能指针
开发语言·c++·算法