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

    • 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章 工程实践

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

if-elif-else 多分支

当需要处理多个互斥条件时,if-elif-else 结构比嵌套 if-else 更清晰。程序从上到下依次检查每个条件,一旦某个条件为真,就执行对应的代码块,然后跳过剩余的所有分支。

基本语法

score = 85

if score >= 90:
    grade = "A"
elif score >= 80:
    grade = "B"
elif score >= 70:
    grade = "C"
elif score >= 60:
    grade = "D"
else:
    grade = "F"

print grade    # B

elif 是 "else if" 的缩写。每个 elif 都有自己的条件,但只有在前面的所有 if 和 elif 都为假时才会被检查。

执行顺序的重要性

分支的顺序直接影响结果。上面的例子中,如果调换顺序:

score = 85

if score >= 60:       # 85 >= 60 为真,进入这个分支
    grade = "D"
elif score >= 70:      # 不会检查!
    grade = "C"
elif score >= 80:      # 不会检查!
    grade = "B"
else:
    grade = "F"

print grade    # D —— 错误!

因为 85 >= 60 为真,程序立即执行 grade = "D",跳过后面的所有 elif。所以必须把范围小的条件放在前面,或者使用互斥的精确范围:

# 方法 1:从大到小
if score >= 90:
    grade = "A"
elif score >= 80:
    grade = "B"
# ...

# 方法 2:精确范围(顺序无关,但冗长)
if 90 <= score <= 100:
    grade = "A"
elif 80 <= score < 90:
    grade = "B"
# ...

实际应用

# 根据月份判断季节
month = 4

if 3 <= month <= 5:
    season = "Spring"
elif 6 <= month <= 8:
    season = "Summer"
elif 9 <= month <= 11:
    season = "Autumn"
else:
    season = "Winter"

print season    # Spring

# 根据 HTTP 状态码返回描述
status = 404

if status == 200:
    msg = "OK"
elif status == 301:
    msg = "Moved Permanently"
elif status == 404:
    msg = "Not Found"
elif status == 500:
    msg = "Internal Server Error"
else:
    msg = "Unknown Status"

print msg    # Not Found

没有 else 的情况

else 是可选的。如果所有条件都不满足,且没有 else,程序直接跳过整个结构:

age = 15

if age < 13:
    group = "Child"
elif age < 20:
    group = "Teenager"    # 匹配这个分支

print group    # Teenager

age = 25
if age < 13:
    group = "Child"
elif age < 20:
    group = "Teenager"

# 没有 else,age = 25 时 group 未定义
# print group    # NameError: name 'group' is not defined

如果变量可能不被赋值,建议加上 else 作为兜底:

if age < 13:
    group = "Child"
elif age < 20:
    group = "Teenager"
else:
    group = "Adult"

与字典的对比

当分支很多且条件简单时,字典查找有时比 if-elif 更清晰:

# if-elif 写法
if day == "Mon":
    print "Monday"
elif day == "Tue":
    print "Tuesday"
# ... 冗长

# 字典写法
days = {
    "Mon": "Monday",
    "Tue": "Tuesday",
    "Wed": "Wednesday",
    "Thu": "Thursday",
    "Fri": "Friday",
}
print days.get(day, "Unknown")

字典查找的时间复杂度是 O(1),而 if-elif 是 O(n)(最坏情况)。但对于少量分支,性能差异可以忽略,选择可读性更好的写法即可。

上一页
if-else 条件语句
下一页
条件表达式(三元运算符)