Python 条件表达式_运算符

Python 条件表达式_python_02

在 Python 中,有一种特殊的表达式 - ​​条件表达式​​​(也被称为​​条件运算符​​​,或者​​三元运算符​​),其语法规则如下:

<expr1> if <condition> else <expr2>

这与前面分享的 if 语句形式不同,因为它不是指导程序执行流程的控制结构,而更像是定义表达式的运算符。

这种语法看起来很奇怪,条件在表达式的中间!!!它首先会评估 ​​<condition>​​​,如果为 True,则表达式求值为 ​​<expr1>​​​;否则,表达式求值为 ​​<expr2>​​。

在 Python 2.5 之前,关于条件表达式的语法形式有很多讨论(参考:PEP 308),除了像 C++ 中的 ​​<condition> ? <expr1> : <expr2>​​ 形式之外,还有很多其他形式的变体,但 Guido 最终选择了一种令人惊讶的(也就是现在用到的)语法。

事实上,在其他的编程语言中,这种形式的表达式通常被称为三元运算符,这可能就是 Python 的条件表达式有时也被称为三元运算符的原因。

1

常用方式

​条件表达式的常见用途是变量的选择性赋值。​

例如,表示一个人是成年人还是未成年。如果用传统的 if 语句表示,是下面这样:

age = 12
if age < 18:
s = 'minor'
else:
s = 'adult'

但如果用条件表达式的话,将会更加简短,也会更加易读:

s = 'minor' if age < 18 else 'adult'

注意:条件表达式的行为在语法上于其他表达式类似,它可以用作更长的表达式的一部分。

2

优先级

实际上,​​条件表达式的优先级低于所有其他运算符,​​因此需要使用括号对其进行分组。

考虑下面这段代码:

x = 2
y = 5
z = 1 + x if x > y else y + 2
print(z)

运行程序,你会发现结果是 7,而不是 8。这是因为 + 运算符比条件表达式绑定得更紧密,因此首先计算 1 + x 和 y + 2,然后才计算条件表达式,相当于:

z = (1 + x) if x > y else (y + 2)

如果要先计算条件表达式,则需要使用括号将其括起来:

z = 1 + (x if x > y else y) + 2

这样以来,首先会评估 (x if x > y else y),结果是 y,即 5,因此 z 被赋值为 1 + 5 + 2 = 8。

如果要将条件表达式作为复杂表达式的一部分,那么最好用括号括起来(即使不需要),这样会更加可读。

3

短路运算

​和复合逻辑表达式一样,条件表达式也使用的短路运算。​​如果条件表达式的某些部分不需要计算,则不会进行计算。

在表达式 ​​<expr1> if <condition> else <expr2>​​ 中:

  • 如果​​<condition>​​ 为 True,则返回 ​​<expr1>​​,​​<expr2>​​ 不计算。
  • 如果​​<condition>​​ 为 False,则返回 ​​<expr2>​​,​​<expr1>​​ 不计算。

要验证这一点,可以使用一些特殊的手段:

x = 2 if True else 1/0

y = 1/0 if False else 5

我们知道,除数不能为 0,一旦为 0 的话,Python 就会抛出 ZeroDivisionError 异常。

但在这两种情况下,并没有引发任何异常,这说明了 1/0 这一项并没有被评估。

4

替代 if/elif/else

​条件表达式也可以链接在一起,作为一种替代 if/elif/else 的结构。​

例如,有一段这样的代码:

x = 2
if x == 1:
s = 'p'
elif x == 2:
s = 'y'
elif x == 3:
s = 't'
else:
s = 'h'

如果用条件表达式表示,则可以写成这样:

x = 2
s = ('p' if (x == 1) else
'y' if (x == 2) else
't' if (x == 3) else
'h'
)

看到这里,也许你会有一个疑问:执行顺序是从左到右,还是从右到左呢?在一些其他的编程语言中,有一个所谓的右结合性,即:从右到左依次判断再求出最后的 s。

用事实说话,和上面一样,还是用特殊手段来验证这一点:

s = ('p' if (x == 1) else 
'y' if (x == 2) else
't' if (x == 3/0) else
'h'
)

运行程序,你会发现并没有异常产生,这就说明了不会评估 3/0 这一项,因此​​执行顺序是从左到右​​。

·END·
 

高效程序员

谈天 · 说地 · 侃代码 · 开车

Python 条件表达式_运算符_03

长按识别二维码,解锁更多精彩内容