给定 2 个 int 值,如果一个是负数,另一个是正数,则返回 True

Posted

技术标签:

【中文标题】给定 2 个 int 值,如果一个是负数,另一个是正数,则返回 True【英文标题】:Given 2 int values, return True if one is negative and other is positive 【发布时间】:2015-06-29 16:47:17 【问题描述】:
def logical_xor(a, b): # for example, -1 and 1
    print (a < 0) # evaluates to True
    print (b < 0) # evaluates to False
    print (a < 0 != b < 0) # EVALUATES TO FALSE! why??? it's True != False
    return (a < 0 != b < 0) # returns False when it should return True

print ( logical_xor(-1, 1) ) # returns FALSE!

# now for clarification

print ( True != False) # PRINTS TRUE!

有人可以解释发生了什么吗?我正在尝试制作一个衬里:

lambda a, b: (a < 0 != b < 0)

【问题讨论】:

这里有一个教训:使用括号。或者,或者,使用print (a*b &lt; 0) return math.copysign(1, a) != math.copysign(1, b) print ( True != False) # PRINTS TRUE! 你为什么这么惊讶?真不等于假真。 @mikeTheLiar:OP 对此感到惊讶;这是他最初期望的行为。 请不要通过破坏您的帖子为他人增加工作量。通过在 Stack Exchange (SE) 网络上发帖,您已根据 CC BY-SA license 授予 SE 分发内容的不可撤销权利(即无论您未来的选择如何)。根据 SE 政策,分发非破坏版本。因此,任何破坏行为都将被撤销。请参阅:How does deleting work? …。如果允许删除,则帖子下方左侧有一个“删除”按钮,但仅在浏览器中,而不是移动应用程序中。 【参考方案1】:

Python 中的所有比较运算符都有same precedence. 此外,Python 还进行链式比较。因此,

(a < 0 != b < 0)

分解为:

(a < 0) and (0 != b) and (b < 0)

如果其中任何一项为假,则表达式的总结果将为False

您要做的是分别评估每个条件,如下所示:

(a < 0) != (b < 0)

其他变体,来自 cmets:

(a < 0) is not (b < 0) # True and False are singletons so identity-comparison works

(a < 0) ^ (b < 0) # bitwise-xor does too, as long as both sides are boolean

(a ^ b < 0) # or you could directly bitwise-xor the integers; 
            # the sign bit will only be set if your condition holds
            # this one fails when you mix ints and floats though

(a * b < 0) # perhaps most straightforward, just multiply them and check the sign

【讨论】:

请注意,(a &lt; 0) ^ (b &lt; 0) 也可以使用,并且它使用 xor 运算符。 :) 或者,(a &lt; 0) is not (b &lt; 0),因为 TrueFalse 是单例,尽管有些人可能会反对这种语法:请参阅此处进行讨论:***.com/q/9494404/4014959 如果比较布尔值,^ for xor 确实有效,但不适用于 andor 等所有值... OP 专门标记了 Python 3.x,所以我链接到 Python 3 手册。 我个人喜欢 a * b @supercat:不幸的是,python 没有 sign() 方法。有人为数学包提出了一个建议,但没有就边缘情况达成一致,因此没有集成(根据快速谷歌)。一种解决方法是使用 cmp(number, 0),它将返回 +1/0/-1。这确实适用于这个问题【参考方案2】:

您的代码无法按预期工作,因为 != 占用的 precedence 高于 a &lt; 0b &lt; 0。正如 itzmeontv 在他的回答中所建议的那样,您可以通过用括号括起来的逻辑组件来简单地自己决定优先级:

(a < 0) != (b < 0)

您的代码尝试评估 a &lt; (0 != b) &lt; 0

[编辑]

正如 tzaman 正确指出的那样,运算符具有相同的优先级,但您的代码正在尝试评估 (a &lt; 0) and (0 != b) and (b &lt; 0)。用括号括住你的逻辑组件将解决这个问题:

(a < 0) != (b < 0)

运算符优先级:https://docs.python.org/3/reference/expressions.html#operator-precedence

比较(即链接):https://docs.python.org/3/reference/expressions.html#not-in

【讨论】:

它们实际上是相同优先级;失败是因为它被视为链式比较。见docs。 @Xis88:是的,相当于(a &lt; 0) and (0 != b) and (b &lt; 0) Op 专门标记了 Python 3,因此请链接到 Python 3 手册。【参考方案3】:

你可以用这个

return (a < 0) != (b < 0)

比较可以任意链接,例如,x

这样就变成了

(a < 0) and (0 != b) and (b < 0)

见https://docs.python.org/3/reference/expressions.html#not-in

【讨论】:

可能是!=&lt;优先级的一部分 &lt;&gt; 并非“被认为已过时”,它已从 Python 3.0 中完全删除。 (请注意 OP 用 [python-3.x] 标记了问题)【参考方案4】:

在 Python 中,比较运算符具有相同的优先级,并且它们是非关联的。比较运算符的序列有一个单独的规则,即链接规则。 Python documentation 对此表示:

如果a, b, c, ..., y, z 是表达式而op1, op2, ..., opN 是比较运算符,则op1 b op2 c ... y opN z 等效于a op1 b and b op2 c and ... y opN z,除了每个表达式最多计算一次。

此外,a op1 b and b op2 c and ... y opN z 从左到右求值。

 a < 0 and 0 != b and b < 0  

a &lt; 0 将评估为False,并且由于short-circuit evaluation 将停止进一步评估。因此,整个表达式将被评估为False

【讨论】:

这是错误的!您在那里引用的文档指出比较是链接的。 与左结合。

以上是关于给定 2 个 int 值,如果一个是负数,另一个是正数,则返回 True的主要内容,如果未能解决你的问题,请参考以下文章

2021-06-23:给定一个数组arr,代表每个人的能力值。再给定一个非负数k,如果两个人能力差值正好为k,那么可以凑在一起比赛。一局比赛只有两个人,返回最多可以同时有多少场比赛。

在数组中查找三个元素之和最接近给定数字

376. 摆动序列

integer在数据类型中代表啥?

给定一个集合,查找集合中一共多多少种不同的元素

python中如何统计出列表的正负数总数,如s=【1,5,-7】,如何求出的结果是正数有2个,负数