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

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

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

条件表达式(三元运算符)

条件表达式提供了一种紧凑的语法,在一行内完成"如果条件为真则取值 A,否则取值 B"的操作。因其形式涉及三个操作数,常被称作三元运算符。它并非独立的语句,而是可以嵌入到任何需要表达式的地方。

基本语法

条件表达式的形式为:

x if C else y

其中 C 是判断条件,x 是条件为真时的结果,y 是条件为假时的结果。中间的 if 和 else 是固定关键字,不能省略:

age = 20
status = "成年" if age >= 18 else "未成年"
print(status)  # 成年

程序先判断 age >= 18,由于条件成立,整个表达式的值为 "成年",并赋给 status。如果 age 为 15,则表达式值为 "未成年"。

与普通 if-else 的区别

条件表达式和 if-else 语句的核心差异在于语法位置:

  • if-else 是语句,独占一行或多行,用于控制程序流程
  • 条件表达式是表达式,可以出现在赋值右侧、函数参数、列表元素、返回值等任何需要值的地方
# 条件表达式嵌入到 print 的参数中
score = 75
print("及格" if score >= 60 else "不及格")

# 条件表达式作为函数返回值
def sign(x):
    return 1 if x > 0 else (-1 if x < 0 else 0)

# 条件表达式作为列表元素
values = [10, 20, 30]
threshold = 25
result = [v if v > threshold else 0 for v in values]
print(result)  # [0, 0, 30]

上面的 sign 函数展示了条件表达式作为 return 的值,这是 if 语句无法直接做到的——if 语句本身不产生值,必须借助变量中转。

嵌套三元表达式

条件表达式可以嵌套使用,实现多分支效果,但嵌套层数一旦超过两层,可读性会急剧下降:

score = 88

# 单层嵌套:尚可接受
grade = "A" if score >= 90 else ("B" if score >= 80 else "C")
print(grade)  # B

# 多层嵌套:极难阅读
grade = "A" if score >= 90 else "B" if score >= 80 else "C" if score >= 60 else "D"

Python 的条件表达式采用右结合的解析方式,即 a if C1 else b if C2 else c 等价于 a if C1 else (b if C2 else c)。尽管如此,超过两层的嵌套强烈建议改用 if-elif-else 语句,以维护代码的可读性。

使用场景

条件表达式最适合简单的变量赋值和返回值,尤其是二选一且逻辑直白的情况:

# 选择默认值
user_name = input_name if input_name else "匿名用户"

# 数值边界处理
capped = value if value <= 100 else 100

# 格式化输出前缀
prefix = "+" if profit > 0 else ""
print(f"{prefix}{profit}")

在需要执行多条语句、复杂计算或副作用操作时,应使用普通的 if-else 语句而非条件表达式:

# 错误:试图在条件表达式中执行多条语句
# result = (do_a(), do_b()) if cond else (do_c(), do_d())  # 不直观

# 正确:使用 if-else 语句
if cond:
    do_a()
    do_b()
else:
    do_c()
    do_d()

惰性求值特性

条件表达式具有短路求值(惰性求值)特性:根据条件的真假,只计算 x 或 y 中的一个,另一个不会被求值。这在处理可能引发错误的表达式时非常有用:

divisor = 0
dividend = 100

# 避免除零错误
result = dividend / divisor if divisor != 0 else float('inf')
print(result)  # inf,不会抛出 ZeroDivisionError

如果 divisor 为 0 时仍然计算 dividend / divisor,程序会崩溃;条件表达式的短路特性保证了安全分支的代码不会执行。

与逻辑运算符的替代写法

在某些场景下,可以用 and/or 模拟条件表达式,但不推荐:

# 模拟:cond and x or y
# 问题:当 x 本身为假值时结果错误
value = False
result = value and "A" or "B"
print(result)  # B(预期是 A,因为 value 为 False 应取 else 分支)

and/or 模拟法在 Python 2 时代较为流行,但由于上述缺陷,现代 Python 代码应始终使用 x if C else y 语法,它语义明确且没有边界 bug。

常见错误

忘记括号导致优先级问题:

# 错误理解优先级
result = "big" if x > 10 else "small" + " number"
# 实际等价于:("big" if x > 10 else "small") + " number"
# 而非:"big" if x > 10 else ("small" + " number")

条件表达式的优先级低于大多数运算符,复杂场景建议用括号明确意图:

result = ("big number" if x > 10 else "small number")

条件表达式不是语句,不能单独成行:

# 错误:单独的条件表达式不产生效果
x > 0 and print("正数") or print("非正数")  # 能运行但风格极差

# 正确:作为赋值或参数使用
message = "正数" if x > 0 else "非正数"
print(message)

条件表达式是 Python 中唯一的三元运算符形式,它在保持代码紧凑的同时,通过显式的 if...else... 关键字保留了良好的可读性。合理使用它能让简单赋值和返回值更加简洁,但应避免过度嵌套。

上一页
match-case 语句
下一页
while 循环