我不明白为什么Python没有sign
函数。它有一个abs
内置(我认为它是sign
的姐妹),但没有sign
。
在python 2.6中,甚至有一个copysign
函数(在数学中),但没有符号。当你可以只写一个sign
,然后直接从abs(x) * sign(y)
得到copysign
时,为什么还要麻烦地写copysign(x,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年里,我需要它无数次,最后一次是压垮骆驼的最后一根稻草!< / p >
是的,你可以传递cmp,但90%的时候,我需要传递它在一个成语
.lambda x,y: cmp(score(x),score(y))
将与sign一起工作
最后,我希望你同意sign
会比copysign
更有用,所以即使我同意你的观点,为什么要在数学中定义它,而不是符号呢?复印签名怎么比签名有用这么多?