我不明白为什么 Python 没有 sign
函数。它有一个 abs
内置函数(我认为它是 sign
的姐妹),但没有 sign
。
在 python 2.6 中甚至还有一个 copysign
函数(在 math 中),但没有符号。当您可以编写 sign
然后直接从 abs 获取
?后者会更清楚:带有 y 符号的 x,而对于 copysign,您必须记住它是带有 y 符号的 x 还是带有 x 符号的 y!copysign
时,为什么还要编写 copysign(x,y)
(x) * 符号(y)
显然 sign(x)
只提供 cmp(x,0)
之外的任何东西,但它也将更具可读性(并且对于像python这样的可读语言,这将是一个很大的优势)。
如果我是一个 python 设计师,我会是另外一种方式:没有内置的 cmp
,而是一个 sign
。当你需要 cmp(x,y)
时,你可以只做一个 sign(x-y)
(或者,对于非数字的东西更好,只是一个 x>y - of当然,这应该需要 sorted
接受 bool 值而不是整数比较器)。这也会更清楚:当 x>y
时为正(而对于 cmp
你必须记住约定正时 first 是 更大,但也可以反过来)。当然,出于其他原因,cmp
本身是有意义的(例如,在对非数字事物进行排序时,或者如果您希望排序稳定,而仅使用 bool 值是不可能的)
那么,问题是:为什么 Python 设计者决定将 sign
函数排除在语言之外?为什么要麻烦 copysign
而不是它的父 sign
?
我错过了什么吗?
编辑 - 在彼得汉森评论之后。 很公平,你没有使用它,但你没有说你用 python 做什么。在我使用python的7年里,我无数次需要它,最后是压垮 Camel 的最后一根稻草!
是的,你可以传递 cmp,但 90% 的时间我需要传递它是在一个习语中
lambda x,y: cmp(score(x),score(y))
可以很好地处理符号。
最后,我希望你同意 sign
会比 copysign
更有用,所以即使我买了你的观点,为什么还要费心在数学中定义它,而不是符号?复制签名怎么能比签名有用?
最佳答案
编辑:
确实有一个 patch其中在 math 中包含 sign()
,但没有被接受,因为他们不同意 what it should return in all the edge cases (+/-0、+/-nan 等)
所以他们决定只实现copysign,它(虽然更详细)可以是used to delegate to the end user the desired behavior for edge cases - 其中sometimes might require the call to cmp(x,0)
.
我不知道为什么它不是内置的,但我有一些想法。
copysign(x,y):
Return x with the sign of y.
最重要的是,copysign
是 sign
的超集!使用 x=1 调用 copysign
与 sign
函数相同。所以你可以只使用 copysign
而忘记它。
>>> math.copysign(1, -4)
-1.0
>>> math.copysign(1, 3)
1.0
如果你厌倦了传递两个完整的参数,你可以通过这种方式实现 sign
,它仍然可以与其他人提到的 IEEE 的东西兼容:
>>> sign = functools.partial(math.copysign, 1) # either of these
>>> sign = lambda x: math.copysign(1, x) # two will work
>>> sign(-4)
-1.0
>>> sign(3)
1.0
>>> sign(0)
1.0
>>> sign(-0.0)
-1.0
>>> sign(float('nan'))
-1.0
其次,通常当您想要某物的符号时,您只需将它与另一个值相乘即可。当然,这基本上就是 copysign
所做的。
所以,而不是:
s = sign(a)
b = b * s
你可以这样做:
b = copysign(b, a)
是的,我很惊讶你已经使用 Python 7 年了,并且认为 cmp
可以很容易地被 sign
删除和替换!你从来没有用 __cmp__
方法实现过一个类吗?您是否从未调用过 cmp
并指定了自定义比较器函数?
总之,我发现自己也想要一个 sign
函数,但是第一个参数为 1 的 copysign
可以正常工作。我不同意 sign
比 copysign
更有用,因为我已经证明它只是相同功能的一个子集。
关于python - 为什么 Python 没有符号函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1986152/