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

高洛峰
Lepaskan: 2017-03-20 10:16:04
asal
1555 orang telah melayarinya

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

短路逻辑

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

print True and 1
# 1
print True or 1
# True
print False and 1
# False
print False or 1
# 1
Salin selepas log masuk

可以看到, 虽然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, 就是因为Falseor判断不了式子的结果, 整个式子是True还是False, 是由or后面的值来决定的, 所以Python要把整个式子看完, 所以返回1.

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

三目运算符

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

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

A = X and 'table' or False
Salin selepas log masuk

这句代码就是在利用短路逻辑模拟三目运算符, 当XTrue的时候, A会被赋值为'table', 当XFlase的时候, A会被赋值为False;

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

True and 0 or 1
Salin selepas log masuk

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

正确写法

如果想在Python中使用三目运算符, 可以使用if...<a href="http://www.php.cn/wiki/111.html" target="_blank">else</a>写法, 具体看代码

# <为真时的结果> if <判定条件> else <为假时的结果>0 if True else 1
Salin selepas log masuk

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

Atas ialah kandungan terperinci 使用Python三目计算符的用法及短路逻辑方法介绍. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Label berkaitan:
sumber:php.cn
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan