说实话看了一些回答,嗯....不做评价了。
Python里and和or的规则分为四类。一是逻辑判断,二是短路运算,三是优先级,and大于or(可以去Python官方文档搜Operator precedence),四是求值顺序。逻辑判断不解释。
2. 短路运算打字累,上代码。
>>> class A:
a = 0
b = 1
c = 2
# 下面三个都是@classmethod
def aAddOne(): return a += 1
def bAddOne(): return b += 1
def cAddOne(): return c += 1
短路运算举两个例子
例子1:不触发异常,因为短路运算,or前面是True,A.x不会执行。
>>> A.b or A.x
1
例子2:不触发异常,短路运算
>>> A.a and A.x
0
3. 优先级和结合次序
表达式的结合次序取决于表达式中各种运算符的优先级。优先级高的运算符先结合,优先级低的运算符后结合。优先级只决定这一点,和其它的都无关。
结合性提一下,属于and,or运算符的性质,双目运算符,从左到右结合。
那么condition1 or condition2 and condition3或者condition1 and condition2 or condition3 and condition4的结果根本不是优先级自己能决定的,在这里不要想这么复杂的表达式的东西。就和加法和乘法一样,or和and也是二目运算符,and优先于or。单靠优先级并不能告诉你上面两种表达式的结果。就和a+b * c的结果等于a + (b * c)一样,优先级告诉你的就是condition1 or condition2 and condition3等于condition1 or (condition2 and condition3)而不是(condition1 or condition2) and condition3。优先级就做这么简单的事情,并不能单独决定表达式的结果,给优先级举那么多例子总结那么多规律都没用,(有些回答总结的规律也不是仅仅靠优先级完成的)有些回答说不存在的也不要信。
4. 求值顺序(从左到右求值)
求值顺序是非常容易被忽略的,忽略以后就会进入误区,千万不要觉得and运算符的优先级高,condition1 or condition2 and condition3就会先算condition2的结果再算condition3的结果再算他们and的结果等等,优先级只能决定结合次序并不决定求值顺序。不要被前面有些评论误导。
例子3:A.a是0没有短路,继续算or后面的A.b and A.c,返回的结果就是A.b and A.c的结果,是A.c = 2。
>>> A.a or A.b and A.c
2
例子4:A.b短路了or运算符,A.a还是等于0,并且不会抛出异常。千万别被误导以为a会加一然后抛出异常。
>>> A.b or A.aAddOne() and A.x
例子5:抛出没有y的异常,A.x被短路了不会被执行
>>> A.a and A.x or A.aAddOne() and A.y
no attribute 'y'的异常
有些地方后面改了前面可能忘记改了,会有错误,感谢指正。
我的理解可能也有错误的地方,欢迎指正。