有人可以解释这里输出的差异吗?

Can some explain the difference in outputs here?

我目前正在 CodingBat 上进行如下练习:

给定 2 个 int 值,return 如果一个为负,一个为正,则为真。除非参数“negative”为 True,否则 return 只有当两者均为负数时才为真。

这是我的初步尝试:

def pos_neg(a, b, negative):
  if negative:
    if (a and b < 0):
      return True
    
    else:
      return False
     
  elif (a < 0 and b > 0) or (a > 0 and b < 0):
    return True
      
  else:
     return False

CodingBat 然后输入值以查看您的代码是否正确执行,出于某种原因,唯一不会 运行 正确的输入是 (1,-1, True)。

第二次尝试:

def pos_neg(a, b, negative):
  if negative:
    if (a < 0) and (b < 0):
      return True
    
    else:
      return False
     
  elif (a < 0 and b > 0) or (a > 0 and b < 0):
    return True
      
  else:
     return False

这次尝试没有问题所以它必须是第3行的变化。有人可以解释if (a and b <0)if (a < 0) and (b <0)的区别吗?为什么 (1,-1, true) 的输入会破坏它?

if a and b < 0 在功能上等同于写作

if a:
    if b < 0:
        # do something

相对于if a < 0 and b < 0,后者在功能上等同于写作

if a < 0:
    if b < 0:
        # do something

原因是表达式 a and b 正在做布尔逻辑测试 ab return 真值

当给定整数时,它会将 0 视为假,将任何其他值视为真。

表达式实际上 return 最后计算的值所以

1 and 0
> 0
1 and 1
> 1
1 and -1 
> -1
-1 and 1
> 1
if a and b < 0:

上面检查 a 的真实值并且 b 小于 0。a 被设置为任何不是 Falsy 的值 (None, ‘’, [])将使它成为Truthy。也就是说,上面相当于if bool(a) == True and b < 0:

您修改后的行解决了需要对两个变量都进行负数检查的问题。

if a < 0 and b < 0: