使用python三目计算符的用法及短路逻辑方法介绍

今天在看别人代码时看到这样一种写法, 感觉是个挺容易踩到的坑, 搞清楚后写出来备忘.

短路逻辑

python中进行逻辑运算的时候, 默认采用的是一种叫做短路逻辑的运算规则. 名字是很形象的, 下面直接看代码

print true and 1
# 1
print true or 1
# true
print false and 1
# false
print false or 1
# 1

可以看到, 虽然1会被当做布尔值计算, 但整个表达式的计算结果却不一定是布尔值, 而是根据表达式的不同而不同. 上面几个表达式不同的结果, 就是短路逻辑. 用大白话讲, 就是一旦python能判断整个表达式是true还是false, 就不会进行后续的计算了, 就是逻辑被短路了, 后续的表达式被忽略了.

比如true or 1的结果为true就是因为不管or后面是任何值, 整个式子的结果都必定是true, 所以python看到true, 看到or, 后面的1就不看了, 1被短路了, 返回了true; 同样的false and 1也是一样, 看到false然后是and不管后面是什么, 整个式子的结果必定是false, 所以1被短路了, 返回false.

相应的, 为什么false or 1会返回1, 就是因为false和or判断不了式子的结果, 整个式子是true还是false, 是由or后面的值来决定的, 所以python要把整个式子看完, 所以返回1.

明白了什么是短路逻辑之后, 我们看一看三目运算符

三目运算符

三目运算符, 又叫三元运算符. 熟悉java的同学可能会知道, 它的形式是这样的b?x:y, 对于这个表达式来说, 如果条件b为true, 那表达式的结果就是x, 如果b为false, 那表达式的结果就是y. 这是一种很方便的写法, 比if语句简洁很多.

但python中早期没有类似写法的三目运算符, 所以就出现了一种利用短路逻辑, 用and和or来模拟三目运算符的写法, 下面我们看代码

a = x and ‘table’ or false

这句代码就是在利用短路逻辑模拟三目运算符, 当x为true的时候, a会被赋值为’table’, 当x为flase的时候, a会被赋值为false;

乍一看好像很不错, 但这种写法却有个坑, 我们看这句代码

true and 0 or 1

如果我们把刚才的写法当三目运算符来使用, 那么条件语句是true, 表达式应该返回0才是我们期望的结果, 但实际上这个表达式会返回1; 因为true and 0的值为true, 整个表达式的值是由or之后的值来决定的, 所以python会对后面的值做判断, 导致返回了1, 这就是为什么and…or这个写法有坑的原因

正确写法

如果想在python中使用三目运算符, 可以使用if…else写法, 具体看代码

# if else 0 if true else 1

用if…else的写法, 结果就会跟我们期望的相同, 当条件为true时, 返回前面的值, 条件为false时, 返回后面的值. 不会有坑, 只是写的时候要注意, 条件和返回值的顺序跟java中的三目运算符不同, 不要搞错即可

以上就是使用python三目计算符的用法及短路逻辑方法介绍的详细内容,更多请关注 第一php社区 其它相关文章!

Posted in 未分类

发表评论