为什么Python没有符号功能?
我不明白为什么Python没有sign
功能。它有一个abs
内置的(我认为sign
是姐姐),但没有sign
。
在python
2.6中甚至有一个copysign
函数(在math中),但是没有符号。copysign(x,y)
当您可以只写一个sign
然后copysign
直接从中获取时,为什么还要写一个abs(x)
* sign(y)
?后者会更清楚:x带有y的符号,而带copysign的则必须记住它是x带有y的符号还是y带有x的符号!
显然sign(x)
,除了cmp(x,0)
,它不提供任何其他功能,但是它也将更具可读性(对于像python这样的高度可读的语言,这将是一个很大的优势)。
如果我是python设计人员,那么我会反过来:没有cmp
内置的,而是一个sign
。在需要时cmp(x,y)
,您可以执行一个操作sign(x-y)
(或者,对于非数值的东西甚至更好,只需x>
y-当然,这应该需要sorted
接受布尔值而不是整数比较器)。这也将更加清晰:正时x>y
(而与cmp
你必须记住公约正值当 第一 是
大
的,但它可能是周围的其他方法)。当然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有用呢?
-
编辑:
确实,数学中包含一个补丁,但未被接受,因为他们在所有极端情况下(+/-
0,+
/-nan等)均未就应返回的内容达成共识。sign()
因此,他们决定仅实施copysign,尽管可以使用它(尽管更为冗长),才能将最终情况下所需的行为委托给最终用户-有时可能需要调用
cmp(x,0)
。
我不知道为什么它不是内置的,但我有一些想法。
copysign(x,y): Return x with the sign of y.
最重要的
copysign
是,是的超集sign
!copysign
x = 1的调用与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
函数,但是copysign
第一个参数为1就可以了。我不同意这样做sign
会比有用copysign
,因为我已经证明它只是相同功能的一部分。