我不明白为什么 Python 没有 sign
函数。它有一个 abs
内置(我认为是 sign
的姐妹),但没有 sign
。
在 python 2.6 中甚至有一个 copysign
函数(在 math 中),但没有符号。 Why bother to write a copysign(x,y)
when you could just write a sign
and then get the copysign
directly from abs(x) * sign(y)
?后者会更清楚:带有 y 符号的 x,而对于 copysign,您必须记住它是带有 y 符号的 x 还是带有 x 符号的 y!
显然 sign(x)
提供 cmp(x,0)
,但它也将更具可读性(对于像 python 这样可读性很强的语言,这将是一个很大的优势) .
如果我是 Python 设计师,我会反过来:没有 cmp
内置,而是 sign
。当你需要 cmp(x,y)
时,你可以做一个 sign(x-y)
(或者,对于非数字的东西更好,只是 ax>y - 当然这应该需要 sorted
接受布尔值而不是整数比较器)。这也会更清楚:当 x>y
时为正(而 cmp
你必须记住约定 positive 当第 一个 更大 时,但它可能是相反的)。当然 cmp
出于其他原因(例如,在对非数字事物进行排序时,或者如果您希望排序稳定,仅使用布尔值是不可能的)
所以,问题是:为什么 Python 设计者决定将 sign
函数从语言中移除?为什么要打扰 copysign
而不是它的父 sign
?
我错过了什么吗?
编辑 - 在 Peter Hansen 评论之后。很公平,你没有使用它,但你没有说你使用 python 的目的。在我使用python的7年时间里,无数次需要它,而最后一次是压死骆驼的最后一根稻草!
是的,您可以传递 cmp,但我需要传递它的 90% 的时间是在像 lambda x,y: cmp(score(x),score(y))
这样的成语中,它可以与 sign 一起工作。
最后,我希望你同意 sign
比 copysign
更有用,所以即使我接受了你的观点,为什么还要费心用数学而不是符号来定义它? copysign 怎么能比 sign 有用这么多呢?
原文由 Davide 发布,翻译遵循 CC BY-SA 4.0 许可协议
编辑:
确实有一个 补丁,其中包括
sign()
在 数学 中,但它没有被接受,因为他们不同意 在所有边缘情况下它应该返回什么(+/-0,+/-nan , ETC)因此,他们决定只实现 copysign,它(虽然更冗长)可 用于将边缘情况所需的行为委托给最终用户—— 有时可能需要调用
cmp(x,0)
。我不知道为什么它不是内置的,但我有一些想法。
最重要的是,
copysign
是sign
的超集!使用 x=1 调用copysign
与sign
函数相同。所以你可以只使用copysign
而 _忘记它_。如果你厌倦了传递两个完整的参数,你可以实现
sign
这样,它仍然与其他人提到的 IEEE 东西兼容:其次,通常当你想要某物的符号时,你最终只是将它与另一个值相乘。当然,这基本上就是
copysign
所做的。所以,而不是:
你可以这样做:
是的,我很惊讶你已经使用 Python 7 年了,并且认为
cmp
可以如此轻松地删除并替换为sign
!您是否从未使用__cmp__
方法实现过类?您是否从未调用过cmp
并指定了自定义比较器函数?总之,我发现自己也想要一个
sign
函数,但是copysign
第一个参数为 1 就可以正常工作。我不同意sign
比copysign
更有用,因为我已经证明它只是相同功能的一个子集。