今天看书,无意中看到了Python的and和or的一个有趣用法,最后在网上查找这种用法的机制,归根结底还是要仔细理解python中and和or的机制。
Python中if-else有多种写法。假设a=10,b=20,取较大者。
最常规的方法是:
if a > b: c = a else: c = b
稍微高级一点的用法就是用表达式
c = a if a > b else b
我就是经常用这种方法。
再高级一点的用法就是用二维列表
c = [a,b][a<b]
这方法也很好理解,Python的比较运算符返回的是布尔值。
更高级的用法就是用and-or
c = (a > b and [a] or [b])[0]
这种方法如果你第一眼没看懂,那就是和我一样,基础知识不够扎实,如果你了解and和or的机制,瞬间会恍然大悟的,更重要的是这种用法代码不仅更Pythonic,而且效率更高
在Python 中,and 和 or 执行布尔逻辑演算,如你所期待的一样,但是它们并不返回布尔值;而是,返回它们实际进行比较的值之一。
在布尔上下文中从左到右演算表达式的值,使用and的话,如果布尔上下文中的所有值都为真,那么 and 返回最后一个值;如果布尔上下文中的某个值为假,则 and 返回第一个假值
使用or的话, 如果有一个值为真,or 立刻返回该值;如果所有的值都为假,or 返回最后一个假值
注意 :or 在布尔上下文中会一直进行表达式演算直到找到第一个真值,然后就会忽略剩余的比较值,很多语言都支持这种机制。
这一点在学习Python时确实没太注意,一直以为返回的是布尔值。
下面看几个例子吧。
>>> ‘a‘ and ‘b‘ ‘b‘ >>> ‘‘ and ‘b‘ ‘‘ >>> ‘a‘ and ‘b‘ and ‘c‘ ‘c‘ >>> ‘a‘ or ‘b‘ ‘a‘ >>> ‘‘ or ‘b‘‘b‘ >>> ‘‘ or [] or {} {} >>> 0 or ‘a‘ or ‘c‘ ‘a‘ >>> a=‘first‘ >>> b=‘second‘ >>> 1 and a or b ‘first‘ >>> (1 and a) or b ‘first‘ >>> 0 and a or b ‘second‘ >>> (0 and a) or b ‘second‘
按照演算规则进行演算,不难,有兴趣可以试试。
原文地址:http://11026142.blog.51cto.com/11016142/1861679