飞翔飞翔
主页
  • 计算机基础

    • TCP/IP协议
    • Linux命令
  • 数据库

    • SQL教程
  • 编程语言

    • C语言
    • Python2
    • Python3
  • 数据格式

    • JSON教程
  • 工具

    • Markdown指南
  • Git

    • GitFlow
  • Quartz

    • Quartz教程
  • Java

    • Java设计模式
  • 缓存

    • Redis教程
联系
阿里云
主页
  • 计算机基础

    • TCP/IP协议
    • Linux命令
  • 数据库

    • SQL教程
  • 编程语言

    • C语言
    • Python2
    • Python3
  • 数据格式

    • JSON教程
  • 工具

    • Markdown指南
  • Git

    • GitFlow
  • Quartz

    • Quartz教程
  • Java

    • Java设计模式
  • 缓存

    • Redis教程
联系
阿里云
  • 学习路径
  • 第1章 Python简介

    • Python是什么
    • 安装与运行
    • 交互式解释器
    • 注释与编码规范
  • 第2章 变量与数据类型

    • 变量与对象
    • 整数 int
    • 浮点数 float
    • 复数 complex
    • 布尔值 bool
    • 字符串 str
    • 空值 None
    • 类型转换
  • 第3章 运算符与表达式

    • 算术运算符
    • 比较运算符
    • 赋值运算符
    • 逻辑运算符
    • 位运算符
    • 身份与成员运算符
    • 海象运算符
    • 运算符优先级
  • 第4章 流程控制

    • if 语句
    • if-else 语句
    • if-elif-else 语句
    • match-case 语句
    • 条件表达式(三元运算符)
    • while 循环
    • for 循环
    • range 函数
    • break 与 continue
    • 循环的 else 子句
    • pass 语句
  • 第5章 数据结构

    • 列表创建与索引
    • 列表方法
    • 列表推导式
    • 元组
    • 序列解包
    • 集合
    • 字典创建与访问
    • 字典方法
    • 字典推导式
    • range 对象
  • 第6章 函数

    • 定义函数
    • 位置参数与关键字参数
    • 默认参数
    • 可变参数
    • 解包实参
    • 函数返回值
    • lambda 表达式
    • 文档字符串与注解
    • 作用域与命名空间
    • global 与 nonlocal
  • 第7章 模块与包

    • 模块导入
    • 模块搜索路径
    • 包与相对导入
    • 标准库概览
  • 第8章 文件与输入输出

    • 文件读写
    • 上下文管理器
    • 字符串格式化
    • JSON 与 CSV
  • 第9章 面向对象

    • 类与对象
    • 方法
    • 实例变量与类变量
    • 私有变量
    • 继承
    • 多重继承
    • 魔术方法
    • 属性装饰器
    • 数据类 dataclass
  • 第10章 异常处理

    • 语法错误与异常
    • try-except
    • 异常链与 raise
    • 清理操作
    • 自定义异常
  • 第11章 迭代器与生成器

    • 迭代器协议
    • 生成器
    • 生成器表达式
    • 迭代工具
  • 第12章 高级特性

    • 装饰器
    • 函数式编程
  • 第13章 工程实践

    • 测试与调试
    • 代码质量
    • 虚拟环境

while 循环

while 循环让程序能够在条件满足时反复执行一段代码。与 for 循环遍历已知序列不同,while 更适合"事先不知道要循环多少次"的场景——只要某个条件保持为真,循环就持续运转。

基本语法

while 语句以关键字 while 开头,后跟条件表达式和冒号,缩进的代码块构成循环体:

count = 0

while count < 5:
    print(count)
    count += 1

程序先判断 count < 5,初始为真,进入循环体打印 0,然后将 count 增加到 1。每次迭代结束后,Python 回到 while 重新判断条件。当 count 变为 5 时,条件为假,循环终止,程序继续执行循环之后的代码。最终输出 0 到 4。

终止条件

while 循环必须有明确的终止条件,否则条件永远为真,循环将无限执行下去。终止条件通常依赖循环体内被修改的变量:

# 用户输入验证
password = ""

while password != "secret":
    password = input("请输入密码:")

print("验证通过")

上面的循环持续要求用户输入,直到输入正确密码为止。循环变量 password 在每次迭代中被重新赋值,最终可能满足退出条件。

另一种终止方式是循环体内根据业务逻辑决定是否继续:

balance = 1000
withdrawal_count = 0

while balance > 0:
    amount = int(input(f"余额 {balance},请输入取款金额(0 退出):"))
    if amount == 0:
        break  # 用户主动退出
    if amount > balance:
        print("余额不足")
        continue
    balance -= amount
    withdrawal_count += 1

print(f"共取款 {withdrawal_count} 次,剩余 {balance}")

死循环

如果 while 的条件永远为真,且循环体内没有 break、return 或异常来中断,程序将陷入死循环:

# 死循环示例
while True:
    print("正在运行...")

上面的代码会无限打印,直到用户强制终止程序(如按 Ctrl+C 触发 KeyboardInterrupt)。死循环并非总是错误,某些场景下它是设计意图:

# 服务器事件循环
while True:
    connection = accept_connection()
    if connection is None:
        continue
    handle_request(connection)

长期运行的服务程序、游戏主循环、嵌入式设备的轮询逻辑,都依赖 while True 配合内部的中断机制来持续工作。

while-else 结构

while 循环可以带一个 else 子句,它在循环条件变为假值后执行。关键特性是:如果循环被 break 提前终止,else 不会执行:

count = 3

while count > 0:
    print(f"倒计时:{count}")
    count -= 1
else:
    print("发射!")

正常结束时输出:

倒计时:3
倒计时:2
倒计时:1
发射!

如果加入 break:

count = 3

while count > 0:
    print(f"倒计时:{count}")
    if count == 2:
        print("紧急中止")
        break
    count -= 1
else:
    print("发射!")  # 不会执行

while-else 的语义将在《循环的 else 子句》文档中深入讨论。

循环变量的更新

忘记在循环体内更新条件变量是最常见的 while 循环错误:

# 错误:i 永远为 0,死循环
i = 0
while i < 5:
    print(i)
    # 忘记写 i += 1

更新操作的位置也很重要。如果放在 continue 之后,可能导致某些分支跳过更新:

i = 0
while i < 5:
    if i == 2:
        i += 1  # 必须在 continue 之前更新
        continue
    print(i)
    i += 1

与 for 循环的选择

while 和 for 各有适用场景:

  • for 适合:遍历已知序列、固定次数的重复、迭代字典/字符串等
  • while 适合:等待外部条件(用户输入、网络响应)、不确定次数的尝试、条件驱动的持续处理
# while 更适合:不确定次数
import random
target = random.randint(1, 100)
guess = 0
attempts = 0

while guess != target:
    guess = int(input("猜一个 1-100 的数字:"))
    attempts += 1
    if guess < target:
        print("太小了")
    elif guess > target:
        print("太大了")

print(f"恭喜!用了 {attempts} 次猜中")

边界情况

零次迭代:如果 while 的初始条件即为假,循环体一次都不会执行:

x = 10
while x < 5:
    print("这行不会输出")
    x += 1

浮点数比较陷阱:用浮点数作为循环条件时,精度误差可能导致意外行为:

# 危险:浮点数累加可能永远无法精确等于 1.0
x = 0.0
while x != 1.0:
    x += 0.1
    print(x)
    if x > 2.0:
        break  # 防止死循环

更安全的做法是用整数计数或容差比较:

for i in range(11):  # 0 到 10
    x = i * 0.1
    print(x)

while 循环是处理条件驱动型重复任务的核心工具,正确使用它需要时刻关注终止条件的可达性和循环变量的更新逻辑。

上一页
条件表达式(三元运算符)
下一页
for 循环