布尔运算中的if else语句

时间:2018-04-21 20:18:23

标签: python python-3.x boolean

L = [1,2,3,4,5]
r = None
for item in L:
#if item is odd or 0 bind it to r. if r is None then 0
    if (item % 2 or item == 0) and item >= 0 if r == None else r:
        print(r)
        r = item

打印:

None
1
2
3
4

目前尚不清楚为什么布尔运算符会像这样工作,它显然允许2和4通过,即使它们都是偶数。

4 个答案:

答案 0 :(得分:1)

以下测试:

if (item % 2 or item == 0) and item >= 0 if r == None else r:
    # Do something

被翻译为:

if r==None:
    if (item % 2 or item == 0) and item >= 0:
        # Do something
else:
    if r:
        # Do something

你可以看到,r被赋予一个值(在循环的第一次迭代中),它不再测试偶数或奇数。它只是检查r是否为非零。这就是它打印所有这些值的原因。

答案 1 :(得分:0)

如果item为偶数,则item % 20bool(0)(因此if 0)评估为False

您需要明确核对if item % 2 == 0

答案 2 :(得分:0)

在布尔表达式中,非零item是Truthy,不需要显式检查零。它与item % 2类似,但现在您想要交换真实性,因此请使用not

>>> L = [1,2,3,4,5]
>>> r = None
>>> for item in L:
...     r = 0 if r is None else item if item and not item % 2 else r
...     print(r)
... 
0
2
2
4
4

答案 3 :(得分:0)

这就是Python打破表达式的方式:

enter image description here

特别是你可以看到... if ... else ...部分的优先级最低,并且最后评估,而你可能期望它的行为如下:

if (...) and (item >= 0 if ... else ...):

或者

if (...) and item >= (0 if ... else ...):

这也意味着在第一次迭代后左侧被忽略,因为r1所以它始终是真的。

您可以使用birdseye调试自己的代码。我运行的完整代码是:

from birdseye import eye

@eye
def main():
    L = [1, 2, 3, 4, 5]
    r = None
    for item in L:
        # if item is odd or 0 bind it to r. if r is None then 0
        if (item % 2 or item == 0) and item >= 0 if r == None else r:
            print(r)
            r = item

main()