(1) variable = a if exper else b
(2)variable = (exper and [b] or [c])[0]
(2) variable = exper and b or c
上面三种用法都可以达到目的,类似C语言中 variable = exper ? b : c;即:如果exper表达式的值为true则variable = b,否则,variable = c
例如:
| 输入 | 布尔求值 |
| 1,-1,[“”] | True |
| 0, “”, None, [], (), {}, (“”) | False |
python 三元表达式
之前学习的Python提到了对于类似C语言的三元条件表达式condition ? true_part : false_part,虽然Python没有三目运算符(?:),但也有类似的替代方案,那就是true_part if condition else false_part。
在编程中我也一直这么用了,直到有一天发现了一个有趣的技巧,那就是and-or技巧,利用条件判断的优先特性来实现三元条件判断,比如P∧Q,在Python中如果P为假,那么Python将不会继续执行Q,而直接判定整个表达式为假(P值),当然如果P为真,那就还要继续执行Q来决定整个表达式值;同样的P∨Q,如果P为真,那么就不会继续执行Q了…
其实很多编程语言在逻辑判断中都应用了这套机制,目前我接触下来的貌似VB/VBScript可能不是这么做的。有了这套机制除了在if判断中提高效率外,我们还可以额外发掘一些有趣的功能,比如下面的PHP代码:
如果mysql_connect成功的话将会返回resource资源句柄,如果失败的话将会返回False,等等,后面还有个or,也就是失败的话还将会继续执行or后面的die语句,于是输出了错误信息并终止后续代码的执行。
再如下面的JavaScript代码:
这段代码获取的是event,假如没有给getEvent传入值(即e为undefined),或者e为NULL(两者在JavaScript条件中均代表False),e = e || window.event表达式将会把window.event赋值给e,否则e为Object对象,原表达式会蜕化为e = e赋值,也就是没有改变什么。
好了,扯了这么多,稍稍有些偏题了,下面继续聊Python的and-or技巧,可以这么说,这个技巧也是利用了逻辑判断的特殊性,貌似在真正的三元表达式if else没有出来的时候其就一直在扮演三元表达式的角色,其原型是condition and true_part or false_part,下面举几个例子:
但是值得注意的是虽然表面看上去能够正常工作,其实还潜藏有不可知的风险,若我们的true_part本身就是个被Python认定为False的值,这个技巧就不可用了,我们知道空字符串就是这种情况。
上面的表达式其实我们期望返回空字串的,如何解决呢,我在Dive Into Python中找到了解决方案:那就是利用列表特性,因为包含空字符串的列表其表达式值仍然为True,所以我们可以用列表先包装一下,然后等表达式判断完毕后在解包:
当然为了避免出错,我们可以将其包装为函数:
</d

