在 C 语言中,三目运算符 bool ? a : b 使用起来想当方便,遗憾的是 Python 中并没有这个运算,但是我们可以是用 and-or 实现。

and-or 技巧


in[0]:

a = 'aa'
b = 'bb'
w1 = 1 and a or b
w2 = 0 and a or b

print w1
print w2

out[0]:
aa
bb

由此可见,and-or 可以实现 bool ? a : b.

and-or 陷阱


in[1]:

a = ''
b = 'bb'
w1 = 1 and a or b
w2 = 0 and a or b

print w1
print w2

out[1]:

bb
bb

当 a 空字符串时(False),并没有实现想要的功能,此时 1 and a 用于为 False,所以此时只输出 b。所以,在使用此技巧时,注意 a 的值。

Python cookbook 中提到一个优化方法可以避免 a 为空时的问题:


in[3]:

a = ''
b = 'bb'

w1 = (1 and [a] or [b])[0]

因为[a]为非空列表,永远为 True,即使 a 是 0 或 ‘’。Python cookbook 还推荐将该运算封装成方法:


in[4]:

def choose(bool, a, b):
	return (bool and [a] or [b])[0]