条件表达式(三元运算符)
当需要根据条件选择两个值中的一个时,可以使用条件表达式。它是 if-else 的紧凑写法,适合简单的二选一场景。
基本语法
x = 10
result = "positive" if x > 0 else "not positive"
print result # positive
语法结构是:value_if_true if condition else value_if_false。先计算 condition,如果为真返回 value_if_true,否则返回 value_if_false。
与普通 if-else 的对比
x = 10
# 普通写法
if x > 0:
result = "positive"
else:
result = "not positive"
# 条件表达式
result = "positive" if x > 0 else "not positive"
条件表达式更紧凑,但只能用于赋值场景。如果分支中需要执行多条语句,必须用普通的 if-else。
实际应用
# 找最大值
a, b = 10, 20
max_val = a if a > b else b
print max_val # 20
# 设置默认值
name = ""
display_name = name if name else "Anonymous"
print display_name # Anonymous
# 根据条件选择函数
import math
x = -5
result = math.sqrt(x) if x >= 0 else "Invalid"
print result # Invalid
# 嵌套条件表达式(不推荐,可读性差)
score = 85
grade = "A" if score >= 90 else "B" if score >= 80 else "C" if score >= 70 else "D" if score >= 60 else "F"
print grade # B
嵌套条件表达式虽然合法,但超过一层就会严重损害可读性。上面的嵌套例子不如 if-elif-else 清晰。
优先级注意
条件表达式的优先级很低,与赋值运算符相近。在复杂表达式中建议加括号:
# 可能让人困惑
result = 1 + 2 if True else 3 + 4
print result # 3,等价于 (1 + 2) if True else (3 + 4)
# 更清晰的写法
result = (1 + 2) if True else (3 + 4)
与逻辑运算符的对比
Python 2 中有时用 and-or 技巧模拟条件表达式:
# 旧技巧(有 bug)
result = x > 0 and "positive" or "not positive"
这个技巧在 value_if_true 为假值时会出错:
x = 1
result = x > 0 and 0 or 100 # 期望 0,实际得到 100!
因为 x > 0 and 0 返回 0(假值),然后 0 or 100 返回 100。Python 2.5 引入正式的条件表达式后,应该始终使用 a if cond else b,避免 and-or 陷阱。