关于Python的混合数值数据类型将结果转换为最复杂的操作数

时间:2009-08-13 06:48:45

标签: python numeric

一点背景:我正在通过O'Reilly的“学习Python”一书学习Python,我有一些Java经验。

无论如何,在阅读第5章(实际上我还在其中)时,我遇到了一个问题,即Python处理混合数字表达式的结果。在本书中,他们使用混合整数和浮点数(40 + 3.14)的示例,并继续解释该表达式的结果将是一个浮点数,因为Python转换操作数 up 到最复杂操作数的类型。

我的问题是:代替程序员必须记住哪个数字操作数是最高的,并记住结果将“上传”到该格式,为结果创建一个特殊的数字文字不是更简单类型?

我的逻辑是这样的:如果你的表达式中有一个小数位,你知道它将是一个浮点数,如果你有3 + 4j之类的东西,你知道它将是一个复数。为什么你必须记住数字文字的层次结构只是为了知道你的结果将被视为什么?在我看来,将结果分配给单个不知情的Literal似乎是一个更简单的过程,要知道无论表达式是否具有Mixed Numerics,它都将被视为特定的数据类型。

跟进问题:是否存在目前正在进行此类事情的语言?

同样,我对Python的了解有限,所以这可能是一个愚蠢的问题,但我想知道为什么程序员必须完成这个过程。我可以想象没有某种类型的系统已经存在的唯一原因是,结果的特定数字类型可能不像其他语言(Java)那样重要。

3 个答案:

答案 0 :(得分:5)

  

“如果你的表达式中有一个小数位,你知道它将是一个浮点数,如果你有3 + 4j这样的东西,你知道它将是一个复数。”

“数字文字的层次结构”。我不确定你想要什么。此外,结果将始终是numbers.Number的子类,因此您实际上对结果对象的类型有所保证。

答案 1 :(得分:2)

假设您有统一的数字类型,并键入以下语句:

a = 42
b = 42.24
c = 4 + 2j

这与今天的情况有什么不同?

这已经是有效的Python了。唯一的区别是type(a)type(b)type(c)返回intfloatcomplex,我猜你希望他们都返回像number这样的东西。但除非你想要/必须,否则你永远不会真正处理它。

有一些类似于numerical tower之类的计划的原因。如果您知道只处理itnegers,则可以利用硬件进行整数计算。或者,当您知道要将某种用户输入限制为整数时,可以从int类型派生。

我确信您可以找到一种类型系统具有某种统一编号的语言。但我不确定我是否理解你的论点。也许我错过了你的问题?

答案 2 :(得分:0)

不要以为我真的明白了问题:

  1. 您的意思是应该明确指定操作结果吗? 你可以用explict cast

    来做

    浮子(1 + 0.5)

    INT(1 + 0.5)

    络合物(1 + 0.5)

  2. 你的意思是运营商应该只接受相同类型的操作数吗?

    1 + 2

    1 + 0.5 - >引发异常

    1 + INT(0.5)

    浮子(1)0.5

    虽然有道理,但它会引入过多的冗长,并且int->浮动演员总是成功的,不会导致精确损失(除了非常大的数字)

  3. 针对不同返回类型的单独操作数:

    1 + 0.5 - > INT

    1`flora_plus` 2 - >浮

    重复显示强制转换功能并且生病了