Python 条件表达式


在 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·
 

高效程序员

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

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

©️2020 CSDN 皮肤主题: 技术黑板 设计师: CSDN官方博客 返回首页
实付0元
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值