关于Python混合数字数据类型的结果转换到最复杂的操作数
一点背景:我正在通过O'Reilly的《学习Python》这本书学习Python,之前有一些Java的经验。
无论如何,在阅读第五章时(其实我还在中间),我遇到了一个关于Python如何处理混合数字表达式结果的问题。书中用一个例子来说明,混合一个整数和一个浮点数(比如40 + 3.14),结果会是一个浮点数,因为Python会把操作数“提升”到最复杂的那种类型。
我的问题是:难道程序员不应该记住哪个数字类型是最高的吗?记住结果会被“提升”到那个格式,这样不是太复杂了吗?如果能为结果类型创建一个特殊的数字字面量,不是更简单吗?
我的想法是:如果你的表达式中有小数点,你就知道结果会是浮点数;如果有像3+4j这样的表达式,你就知道结果会是复数。为什么还要记住数字字面量的层级,才能知道你的结果会被当作什么类型呢?在我看来,给结果分配一个单一的、不需要了解的字面量,这样无论表达式中有没有混合数字,都能知道它会被当作特定的数据类型,这样会简单很多。
后续问题:有没有其他语言是这样处理的?
再说一次,我对Python的了解有限,所以这个问题可能有点傻,但我想知道为什么程序员要经历这个过程。我能想到的唯一原因是,结果的具体数字类型在某些语言(比如Java)中可能没有那么重要。
3 个回答
我觉得我没完全理解这个问题:
你的意思是操作的结果应该明确指定吗?
你可以通过明确转换来做到这一点。
比如:float(1+0.5)
或者:int(1+0.5)
再比如:complex(1+0.5)
你的意思是运算符应该只接受相同类型的操作数吗?
比如:1+2
如果是1+0.5,就会报错。
但是如果写成1+int(0.5),就没问题了。
还有,float(1)+0.5也是可以的。
虽然这样做有道理,但会让代码变得太啰嗦,而且int转float总是成功的,不会导致精度损失(除了非常大的数字)。
为不同返回类型分开操作数:
比如:1 + 0.5 的结果是 int。
而 1 `float_plus` 2 的结果是 float。
这样做重复了明确转换的功能,实在是太复杂了。
假设你有一个统一的数字类型,然后你写了以下代码:
a = 42
b = 42.24
c = 4 + 2j
这和你现在得到的有什么不同呢?
其实这已经是有效的Python代码了。唯一的区别在于,type(a)
、type(b)
和type(c)
会分别返回int
、float
和complex
,而你可能希望它们都返回类似number
的东西。但实际上,你并不需要一直处理这些,除非你想要或者必须这样做。
有一些理由让我们需要像Scheme那样的数字塔。如果你知道自己只在处理整数,那么可以利用硬件来进行整数计算。或者,当你想限制某种用户输入为整数时,可以从int
类型派生出新的类型。
我相信你可以找到一种语言,它的类型系统有某种统一的数字类型。但我不太确定我是否理解了你的论点。也许我在你的问题中漏掉了什么?
“如果你的表达式里有小数点,那你就知道它会是一个浮点数。如果你看到像3+4j这样的东西,那你就知道它会是一个复数。”
这就是“数字字面量的层级关系”。我不太确定你还想要什么。此外,结果总是数字类型的一个子类,所以你实际上可以保证结果对象的类型是什么。