第一次看到python的and和or的运行结果的时候觉得很诧异,惊呼:“怎么会这样?”,再一想想觉得也还挺不错的
and
python中的and运算将返回第一个为假的值,如果全为真则返回最后一个值。下面看例子:
>>> a = 1
>>> b = []
>>> c = '123'
>>> d = {'name':'an'}
>>> a and c and d# 全为真返回最后一个值
{'name': 'an'}
>>>
>>> a and b and c and d# 返回第一个为假的值
[]
>>>
or
python中的ro运算返回第一个为真的值,全为假则返回最后一个值。下面看例子:
>>> a = 1
>>> b = []
>>> c = '123'
>>> d = {'name':'an'}
>>> e = None
>>> b or e or a or c# 返回第一个为真的值
1
>>>
>>> e or b# 返回最后一个值
[]
>>>
问号表达式
之前一直用的C/C++,刚开始使用python的时候很不习惯,比如:python没有switch...case语句,python没有问号表达式。python的问号表达式是可以通过and、or和[]/()配合实现的,如下:
>>> a = 1
>>> (a > 0) and '+' or '-'
'+'
>>>
先是(a > 0)返回True,再与’+’进行and运算,两个都为真,返回最后一个值(‘+’),再与’-’进行or运算,返回第一个为真的值(‘+’)。再看返回第二个的情况:
>>> a = -1
>>> (a > 0) and '+' or '-'
'-'
>>>
你可能已经注意到了,当and与or中间的元素为逻辑假的时候就始终返回or后面的表达式了,这个地方还需要用到[False]或者(False,)均为真的特性将上述问号表达式改写成(expression and [ValueWhileTrue] or [ValueWhileFalse])[0]或者(expression and (ValueWhileTrue,) or (ValueWhileFalse,))[0]注意:表达式中的逗号不能少,如下:
>>> a = 0
>>> (a == 0) and '' or 'not zero'
'not zero'# 返回第二个值,与期望的不一致
>>>
按照上面的方法进行改写,工作正确
>>> a = 0
>>> ((a == 0) and [''] or ['not zero'])[0]
''
>>> a = 0
>>> ((a == 0) and ('',) or ('not zero',))[0]
''
>>>
当然,代码最重要的是可读性,所以还是不推荐这样做,哪怕这样“很酷”!