为什么Python没有符号功能?

发布于 2021-01-29 18:36:44

我不明白为什么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
被浏览
188
1 个回答
  • 面试哥
    面试哥 2021-01-29
    为面试而生,有面试问题,就找面试哥。

    编辑:

    确实,数学中包含一个补丁,但未被接受,因为他们在所有极端情况下(+/-
    0,+
    /-nan等)均未就应返回的内容达成共识。sign()

    因此,他们决定仅实施copysign,尽管可以使用它(尽管更为冗长),才能将最终情况下所需的行为委托给最终用户-有时可能需要调用cmp(x,0)


    我不知道为什么它不是内置的,但我有一些想法。

    copysign(x,y):
    Return x with the sign of y.
    

    最重要的copysign是,是的超集signcopysignx = 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,因为我已经证明它只是相同功能的一部分。



知识点
面圈网VIP题库

面圈网VIP题库全新上线,海量真题题库资源。 90大类考试,超10万份考试真题开放下载啦

去下载看看