在java中我们可以通过?:表达式简洁地进行判断和赋值。
例如:
x = ((p != None) ? p.val:0)
y = ((q != None) ? q.val:0)
但是在Python中语法稍有不同,以下代码可以实现相同效果。
但是这种方法必须确定and后的第一个值为TRUE
x = ((p != None) and p.val or 0)
y = ((q != None) and q.val or 0)
用“and”替代“?”并且用 “or” 替代“:”
另一种写法:
x = p.val if (p != None) else 0
y = q.val if (q != None) else 0
这种方法更为保险。
补充:摘自https://www.cnblogs.com/xxiong1031/articles/7099901.html侵删
局限性
不难看出,三元运算在python中事实上可以通过借用布尔求值表达。然后,有时会有点小问题。
举个例子,char *ret = x ? "" or "VAL"
。根据前面的例子,我们很自然想到在python里应该这样写,ret = x and "" or "VAL"
。
错了!不管x
的布尔求值是真还是假,ret
得到的总是"VAL"。因为在python中对空字符串的布尔求值为false,这样x and ""
永远都是false,所以ret
得到的自然总是"VAL"了。
解决这个问题有两种办法,
第一种,ret = not x and "VAL" or ""
第二种,ret = x and [""] or ["VAL"]
,然后每次取ret[0]
作为返回值,这是因为[""]
在布尔求值时值为true。
讨论一:
第一种方法代码明显要简洁,效率也高,那么还有必要使用第二种么?当然,第一种办法有局限性,只有当我们非常明确其中一个值布尔求值时不可能为false时才能使用。在我们的示例中,由于"VAL"肯定返回true所以可以使用。如果是两个变量呢,像这样ret=x and val1 or val2
,你就只能老老实实写成ret=x and [val1] or [val2]
,然后取ret[0]
作为结果了。因为这行语句所表达的不是“当x为真返回val1,否则返回val2”,而是“当x为真并且val1为真返回val2,否则返回val2”。
讨论二:
大家都知道python里有list和tuple,前面这行代码ret=x and [""] or ["VAL"]
我们就是通过list解决,有的人可能偏爱tuple,于是就会这样写ret=x and ("") or ("VAL")
。错了!这里ret[0]永远都是空字符串(在2.5上测试)。这是我比较faint的一点,为啥[""]为真而("")为假呢?