当前位置: 首页 > 面试题库 >

为什么Python没有符号功能?

伍溪叠
2023-03-14
问题内容

我不明白为什么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是,是的超集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,因为我已经证明它只是相同功能的一部分。



 类似资料:
  • 问题内容: 为什么在Python中没有and运算符? 问题答案: 不是因为它没有道理;而是因为它没有意义。最好将“ x ++”定义为“ x + = 1,求出x的先前绑定”。 如果您想知道最初的原因,则必须浏览旧的Python邮件列表,或者询问那里的某个人(例如Guido),但是在事实成立之后就很容易找到理由了: 与其他语言一样,不需要简单的增量和减量。您不会经常用Python编写东西。相反,你做类

  • 问题内容: 我来自C语言,正在学习Python。缺乏显式的类型安全性令人不安,但是我已经习惯了。面对动态语言的所有优点,缺少内置的基于契约的编程(纯抽象类,接口)的不足是必须习惯的。 但是,无法请求const- cortectness使我疯狂!为什么Python中没有常量?为什么不鼓励使用类级常量? 问题答案: C和Python属于两种不同的语言类别。 前一个是 静态 类型的。后者是 动态的 。

  • 问题内容: 我正在看一些使用该符号的Python代码,但我不知道它的作用。我也不清楚要搜索的内容,因为搜索Python文档时会发现该符号,否则Google不会返回相关结果。 问题答案: 行首的符号用于类,函数和方法修饰符。 在这里阅读更多: PEP 318: Decorators Python Decorators 你会遇到的最常见的Python装饰器是: @property @classmeth

  • 问题内容: 另外,在网上可以找到许多创建静态变量的解决方案。(尽管我还没有看到我喜欢的一个。) 为什么Python不支持方法中的静态变量?这被认为是非Python的,还是与Python的语法有关? 编辑: 我专门询问了 为什么 进行设计决策,但我没有提供任何代码示例,因为我想避免解释来模拟静态变量。 问题答案: 忽略这一点的想法是,静态变量仅在以下两种情况下才有用:何时真正应该使用类以及何时真正应

  • 问题内容: 好的,我知道三引号字符串可以用作多行注释。例如, 和 但是从技术上讲,这些是字符串,对吗? 我已经在Google上搜索并阅读了Python样式指南,但无法找到关于为什么没有正式实现多行,/ * * /注释类型的技术答案。我使用三重引号没有问题,但是对于导致这个设计决定的原因我有点好奇。 问题答案: 我怀疑您会得到比“ Guido不需要多行注释”更好的答案。 Guido在推特上发布了以下

  • 问题内容: 我(彻底)目前正在学习SQL,并遇到了该子句。 根据您提供的参数对结果集进行汇总或分组。如果在查询中使用此子句,则可以在结果集上执行聚合函数以查找结果集的统计信息,例如查找平均值或频率。 我的问题是:没有随附的聚合函数,GROUP BY语句是否有任何用处? 更新 使用的同义词是(可能)是一个坏主意,因为我怀疑它是慢。 问题答案: 没有随附的汇总功能,GROUP BY语句有什么用吗? 在