关于Python混合数字数据类型的结果转换到最复杂的操作数

0 投票
3 回答
592 浏览
提问于 2025-04-15 13:34

一点背景:我正在通过O'Reilly的《学习Python》这本书学习Python,之前有一些Java的经验。

无论如何,在阅读第五章时(其实我还在中间),我遇到了一个关于Python如何处理混合数字表达式结果的问题。书中用一个例子来说明,混合一个整数和一个浮点数(比如40 + 3.14),结果会是一个浮点数,因为Python会把操作数“提升”到最复杂的那种类型。

我的问题是:难道程序员不应该记住哪个数字类型是最高的吗?记住结果会被“提升”到那个格式,这样不是太复杂了吗?如果能为结果类型创建一个特殊的数字字面量,不是更简单吗?

我的想法是:如果你的表达式中有小数点,你就知道结果会是浮点数;如果有像3+4j这样的表达式,你就知道结果会是复数。为什么还要记住数字字面量的层级,才能知道你的结果会被当作什么类型呢?在我看来,给结果分配一个单一的、不需要了解的字面量,这样无论表达式中有没有混合数字,都能知道它会被当作特定的数据类型,这样会简单很多。

后续问题:有没有其他语言是这样处理的?

再说一次,我对Python的了解有限,所以这个问题可能有点傻,但我想知道为什么程序员要经历这个过程。我能想到的唯一原因是,结果的具体数字类型在某些语言(比如Java)中可能没有那么重要。

3 个回答

0

我觉得我没完全理解这个问题:

  1. 你的意思是操作的结果应该明确指定吗?

    你可以通过明确转换来做到这一点。

    比如:float(1+0.5)

    或者:int(1+0.5)

    再比如:complex(1+0.5)

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

    比如:1+2

    如果是1+0.5,就会报错。

    但是如果写成1+int(0.5),就没问题了。

    还有,float(1)+0.5也是可以的。

    虽然这样做有道理,但会让代码变得太啰嗦,而且int转float总是成功的,不会导致精度损失(除了非常大的数字)。

  3. 为不同返回类型分开操作数:

    比如:1 + 0.5 的结果是 int。

    而 1 `float_plus` 2 的结果是 float。

    这样做重复了明确转换的功能,实在是太复杂了。

2

假设你有一个统一的数字类型,然后你写了以下代码:

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

这和你现在得到的有什么不同呢?

其实这已经是有效的Python代码了。唯一的区别在于,type(a)type(b)type(c)会分别返回intfloatcomplex,而你可能希望它们都返回类似number的东西。但实际上,你并不需要一直处理这些,除非你想要或者必须这样做。

有一些理由让我们需要像Scheme那样的数字塔。如果你知道自己只在处理整数,那么可以利用硬件来进行整数计算。或者,当你想限制某种用户输入为整数时,可以从int类型派生出新的类型。

我相信你可以找到一种语言,它的类型系统有某种统一的数字类型。但我不太确定我是否理解了你的论点。也许我在你的问题中漏掉了什么?

5

“如果你的表达式里有小数点,那你就知道它会是一个浮点数。如果你看到像3+4j这样的东西,那你就知道它会是一个复数。”

这就是“数字字面量的层级关系”。我不太确定你还想要什么。此外,结果总是数字类型的一个子类,所以你实际上可以保证结果对象的类型是什么。

撰写回答