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

    • 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 历史与特点
    • Python 2 与 Python 3 的核心差异
    • 安装与运行 Python 2.7.18
    • 编码规范 PEP 8
  • 第2章 基础语法

    • 变量与对象
    • 数字类型
    • 字符串 str
    • Unicode 字符串
    • 运算符
    • 空值 None
  • 第3章 流程控制

    • if 条件语句
    • if-else 条件语句
    • if-elif-else 多分支
    • 条件表达式(三元运算符)
    • while 循环
    • for 循环
    • range 与 xrange
    • 循环控制:break、continue、pass
    • 循环 else 子句
  • 第4章 数据结构

    • 列表基础
    • 列表方法
    • 列表推导式
    • 元组
    • 字典基础
    • 字典方法
    • 字典循环技巧
    • 集合
    • 序列解包
    • 序列比较
  • 第5章 函数

    • 定义函数
    • 参数传递机制
    • 默认参数
    • 关键字参数
    • 可变参数
    • Lambda 表达式
    • 文档字符串
    • 函数对象
  • 第6章 模块与包

    • import 导入
    • 模块搜索路径
    • name 与主程序
    • 编译文件 .pyc 与 .pyo
    • 包结构
    • dir() 函数
  • 第7章 文件与IO

    • 打开与关闭文件
    • 文件读写方法
    • with 上下文管理器
    • 格式化输出:% 操作符
    • 格式化输出:str.format()
    • JSON 序列化
  • 第8章 面向对象

    • 类定义与实例化
    • init 构造方法
    • 类变量与实例变量
    • 方法调用与 self
    • 继承基础
    • 多重继承
    • 新式类与旧式类
    • 私有变量与名称改写
    • 属性装饰器 property
    • 类方法与静态方法
    • 魔术方法
    • 空类与数据记录
  • 第9章 异常处理

    • 异常类型
    • try-except
    • try-except-else-finally
    • 抛出异常 raise
    • 自定义异常
    • with 语句与上下文管理器
  • 第10章 迭代器与生成器

    • 迭代器协议
    • 生成器函数
    • 生成器表达式
    • itertools模块
  • 第11章 标准库精要

    • os模块
    • sys模块
    • datetime模块
    • re模块
    • json模块
    • collections模块
    • math与random模块
    • urllib2与网络请求
    • subprocess与命令执行
    • threading与并发
    • unittest与测试
    • 虚拟环境与包管理
  • 第12章 工程实践

    • 调试技巧
    • 性能分析
    • 文档与注释
    • 下一步学习

循环 else 子句

Python 的 for 和 while 循环可以带一个 else 子句。这个设计在 C、Java 等语言中不存在,是 Python 独有的特性。它的语义很精确:只有当循环正常结束(没有被 break 打断)时,else 才执行。

基本语法

for i in range(5):
    print i
else:
    print "Loop finished normally"

# 输出:
# 0
# 1
# 2
# 3
# 4
# Loop finished normally
i = 0
while i < 5:
    print i
    i += 1
else:
    print "Loop finished normally"

# 输出同上

与 break 的配合

else 的核心价值在于与 break 配合,区分"正常结束"和"提前退出":

# 搜索列表中的素数
nums = [4, 6, 8, 9, 10]

for n in nums:
    if n % 2 != 0:
        print "Found odd number:", n
        break
else:
    print "No odd number found"    # 执行,因为没有 break

# 输出:No odd number found
nums = [4, 6, 7, 8, 10]

for n in nums:
    if n % 2 != 0:
        print "Found odd number:", n
        break
else:
    print "No odd number found"    # 不执行,因为 break 了

# 输出:Found odd number: 7

实际应用场景

场景 1:验证列表是否满足条件

# 检查是否所有分数都及格
scores = [85, 90, 78, 92]

for score in scores:
    if score < 60:
        print "Someone failed"
        break
else:
    print "All passed"    # 执行

场景 2:查找质数

# 检查 n 是否为质数
n = 17

for i in range(2, n):
    if n % i == 0:
        print n, "is not prime"
        break
else:
    print n, "is prime"     # 执行,因为 17 不能被 2~16 整除

这个算法虽然简单(没有优化到 sqrt(n)),但展示了 else 的清晰语义:如果循环遍历了所有可能的因子都没有找到能整除的,那么 else 执行,确认是质数。

场景 3:用户输入验证

attempts = 3
while attempts > 0:
    password = raw_input("Enter password: ")
    if password == "secret":
        print "Access granted"
        break
    print "Wrong password,", attempts - 1, "attempts left"
    attempts -= 1
else:
    print "Access denied"     # 3 次都错了才执行

常见误解

初学者常把循环 else 理解为"条件不满足时执行",这是错误的。它只与 break 有关:

# 错误理解:以为 i == 3 时执行 else
for i in range(5):
    if i == 3:
        print "Three"
else:
    print "Else"    # 始终执行(除非 for 内部有 break)

# 输出:
# Three
# Else

如果循环内部没有 break,else 总是执行,这时它没有任何特殊作用,反而让代码显得奇怪。

与标志变量的对比

不用 else,可以用标志变量实现相同逻辑:

# 用标志变量
found = False
for n in nums:
    if n % 2 != 0:
        found = True
        print "Found odd number:", n
        break

if not found:
    print "No odd number found"

# 用 else(更简洁)
for n in nums:
    if n % 2 != 0:
        print "Found odd number:", n
        break
else:
    print "No odd number found"

else 版本避免了额外的标志变量,把"搜索失败"的逻辑直接绑定在循环结构上。但这也增加了理解成本——不熟悉 Python 的程序员可能看不懂 else 的含义。

使用建议

  • 循环中有 break 时,else 可以简化代码
  • 循环中没有 break 时,不要用 else,它只会让人困惑
  • 如果团队不熟悉 Python 的 else 语义,用标志变量更稳妥
上一页
循环控制:break、continue、pass