好久没有用Python的,昨天写一个简单的Alred workflow的时候,突然用到了三元运算符,只记得刚学的时候,是用的类似于Lua的那种三元运算的实现方式(Lua没有原生的三元运算符,使用了二个逻辑运算来实现),然后在google上找了一下,这里做一下记录。
Lua的三元运算实现方式,就是巧妙的利用了与或运算的”短路”法则。
1
2
3
4
5
6
7
8
9local tmp = false
local res = not tmp and "and" or "or"
print(res) // 输出"and"
-- 等价于
if not tmp then
res = "and"
else
res = "or"
endLua使用的形式就是 result = condition and true_res or false_res。Lua这里这样使用不会现问题,因为Lua对于false值只有二种,nil和false是false,其余都是true。
Python一般情况下对于类似Lua的那种实现也没有太大问题
1
print(True and "True" or "False") # 输出True
但是Python对于False值的规定却与Lua不同,Python认为一切空值都是False,下面的值都被认为是False,如下:
False (布尔值False)
None (空对象值)
等于0的数 [整型0,浮点0.0,长整型0L,复数0.0 + 0j]
“”(空字符串)
[](空列表)
{}(空字典)
()(空元组)
那这样就会出现问题,如某个条件下想置空个列表为空,或者置为空字符串,可能得到的都是相反的效果
1
print(True and "" or "False") # 输出False
这种情况下空字符串被认为是False,逻辑运算继续,or后为真,得到最终结果是”False”,与预期结果相反。
Python原生的三元运算形式,在Python2.5开始有了这个三元运算操作,形式就是:
true_res if condition else false_res
真值在前,条件在中间,假值在else分支
1
print("True" if True else "False") # 输出True
这时就不存在使用逻辑运算形式的问题了。