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通过,即使它们都是偶数。
答案 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 % 2
为0
。 bool(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打破表达式的方式:
特别是你可以看到... if ... else ...
部分的优先级最低,并且最后评估,而你可能期望它的行为如下:
if (...) and (item >= 0 if ... else ...):
或者
if (...) and item >= (0 if ... else ...):
这也意味着在第一次迭代后左侧被忽略,因为r
是1
所以它始终是真的。
您可以使用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()