【问题标题】:Looking for guidance on a simple conditional寻找有关简单条件的指导
【发布时间】:2017-07-12 19:39:57
【问题描述】:

我正在寻找一些指导,说明我在回答这个问题时的逻辑出了什么问题:

'给定 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))

【问题讨论】:

  • 在第二个条件中,您作为尝试提供的示例(我假设是第一个代码 sn-p),您在应该使用“和”的地方使用“或”。
  • 有一个没有返回任何东西的分支。
  • @Rawing - 更准确地说,有一个分支隐式返回 None

标签: python


【解决方案1】:

让我们从negative 分支开始:

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

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

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

这也可以简化,因为a &lt; 0 and b &lt; 0 已经是应该返回的结果,因此您也可以使用不太详细的:

if negative:
    return a < 0 and b < 0

那么第二种情况出现逻辑错误:

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

如果(a &lt; 0) (b &gt; 0) 为真,则应该触发,第二个括号也是如此。所以应该是:

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))

【讨论】:

  • 如果以negative的形式传入一个真值,该函数将给出逻辑错误。 OP说; “除非参数negativeTrue”,而不是“如果参数negative 计算结果为True
  • @TomWyllie 鉴于 OP 包含“解决方案”并且它也只包含一个 if negative: 我猜这意味着“真实”而不是“真实”。但是,如果需要,可以很容易地将其更改为 if negative is True:
【解决方案2】:

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

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

【讨论】:

  • 如果negative 是假的怎么办?如空的stringlistset
  • @Tom 那么你有更大的问题......你可以检查if negative is False,但我不会认为Pythonic。所有其他解决方案也假设您可以使用negative 的真实性。
  • 我不同意 - Python 之禅 明确表示“错误不应该默默地过去”。至少,传入negative 应该会抛出一个错误,并且不允许无视OP 提出的逻辑,即“如果参数“负数”是True”,则不允许默默地传递。
  • 另外,使用is 比较单例,例如if negative is False,肯定不是非pythonic。在PEP 8 中特别建议 ​​- “当你真正的意思是如果 x 不是 None 时,请注意写 if x - 例如,当测试默认为 None 的变量或参数是否设置为其他值时。其他值可能有在布尔上下文中可能为假的类型(例如容器)!"
  • @TomWyllie Duck 类型是 python 的基本原则。如果有人传递列表或字符串而不是布尔值,我们不在乎。它们可以解释为布尔值,所以没关系。检查您是否给了我们一个布尔值不是我们的责任;传递具有适当真实性的值是您的责任。
【解决方案3】:

cmets 已经涵盖了您的语义错误(或 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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-04-24
    • 2012-12-25
    • 2023-03-06
    • 1970-01-01
    • 2010-10-09
    • 1970-01-01
    相关资源
    最近更新 更多