python - 为什么 Python 没有符号函数?

标签 python language-design

我不明白为什么 Python 没有 sign 函数。它有一个 abs 内置函数(我认为它是 sign 的姐妹),但没有 sign

在 python 2.6 中甚至还有一个 copysign 函数(在 math 中),但没有符号。当您可以编写 sign 然后直接从 abs 获取 copysign 时,为什么还要编写 copysign(x,y) (x) * 符号(y)?后者会更清楚:带有 y 符号的 x,而对于 copysign,您必须记住它是带有 y 符号的 x 还是带有 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.

最重要的是,copysignsign 的超集!使用 x=1 调用 copysignsign 函数相同。所以你可以只使用 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 可以正常工作。我不同意 signcopysign 更有用,因为我已经证明它只是相同功能的一个子集。

关于python - 为什么 Python 没有符号函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1986152/

相关文章:

compiler-construction - 你什么时候可以声称你的程序是 "compiler"?

javascript - 从javascript中的原型(prototype)模型中可以吸取哪些教训?

c# - 几个 C# 语言问题

python - 使用 python 查找具有特定配置的 Cisco IOS 接口(interface)

python - 将元组数组转换为二维数组

python - 确保 python 脚本不以 root 身份运行

javascript - 无法将消息包字节读入js中的Uint8Array缓冲区

python - 如何根据另外两个数据帧的值填充 Pandas 数据帧

language-design - 扩展Backus–Naur形式的操作顺序

C++ 为什么箭头 (->) 运算符的自动重新应用不适用于指针到指针类型?