0

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

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

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

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

后续问题:目前是否有一种语言正在执行这种事情?

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

4

3 回答 3

5

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

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

于 2009-08-13T07:08:18.077 回答
2

假设您有一个统一的数字类型,并且您输入了以下语句:

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

这与你今天得到的有什么不同?

这已经是有效的 Python。唯一的区别是type(a), type(b), type(c)return和int,我猜你希望他们都返回类似的东西。但是除非您愿意/必须这样做,否则您永远不会真正处理这个问题。 floatcomplexnumber

有类似方案的数字塔之类的东西是有原因的。如果你知道你只是在处理 itnegers,你可以利用硬件进行整数计算。int或者,当您知道要将某种用户输入限制为整数时, 您可以从类型派生。

我相信您可以找到一种具有某种统一编号的类型系统的语言。但我不确定我是否理解你的论点。也许我在你的问题中遗漏了一些东西?

于 2009-08-13T07:17:27.090 回答
0

不要以为我真的理解问题:

  1. 您的意思是应该明确指定操作结果吗?你可以用明确的演员来做

    浮动(1+0.5)

    整数(1+0.5)

    复数(1+0.5)

  2. 您的意思是运算符应该只接受相同类型的操作数吗?

    1+2

    1+0.5 -> 引发异常

    1+int(0.5)

    浮动(1)+0.5

    while having sense, it would introduce too much verbosity and int->float casts are always successful and don't lead to precision loss (except really large numbers)

  3. Separate operands for different return types:

    1 + 0.5 -> int

    1 `float_plus` 2 -> float

    Duplicates explict cast functionality and is plain sick

于 2009-08-13T08:09:22.463 回答