寻找简单条件的指导

时间:2017-07-12 19:39:57

标签: python

我正在寻找关于我对这个问题的答案我的逻辑出错的指导:

'给定2个int值,如果一个为负数且一个为正数,则返回True。除非参数“negative”为True,否则仅当两者都为负时才返回True。'

这是我的尝试。我以为我走在正确的轨道上,我哪里出错?

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

这是解决方案:

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

3 个答案:

答案 0 :(得分:4)

让我们从negative分支开始:

if negative:
    if a < 0 and b < 0:
        return True

如果if a < 0 and b < 0不是True,您不会返回任何内容,但是您应该返回False

if negative:
    if a < 0 and b < 0:
        return True
    else:
        return False

这也可以简化,因为a < 0 and b < 0已经是应该返回的结果,所以你也可以使用较少的详细信息:

if negative:
    return a < 0 and b < 0

然后在第二种情况下出现逻辑错误:

elif ((a < 0 or b > 0) or (a > 0 or b < 0)):

如果(a < 0) (b > 0)为True,则会触发,对于第二个parens也是如此。所以它应该是:

elif ((a < 0 and b > 0) or (a > 0 and b < 0)):
  return True
else:
  return False

同样,你可以在这里使用较少的详细信息:

else:
    return ((a < 0 and b > 0) or (a > 0 and b < 0))

答案 1 :(得分:1)

由于@MSeifert解释了您的错误,这里的版本更简洁:

def pos_neg(a, b, negative):
    return a * b < 0 if not negative else a < 0 and b < 0

答案 2 :(得分:1)

评论涵盖了您的语义错误(或vs和)。

从风格上来说,使用代码表示:

是一种不好的形式
if condition:
    return True
else:
    return False

你应该这样做:

return condition

请注意,绝对不需要在括号中写入返回值,即这样更好:

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

为了便于阅读,可以将参数括在括号中最后一行的or中,但由于这是Python,我们也可以这样做:

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

最后一行比一组嵌套和/或子句要好得多。

现在,如果你想要最短的解决方案(假设我们正在处理整数),那么可能:

def pos_neg(a, b, negative):
    return (a & b if negative else a ^ b) < 0

依赖于负整数的二进制表示: - )