很多情况下,我们需要将数据从一种类型转换成另一种类型。例如,想要打印一个数字时,就需要把它转换成文本,使它能够出现在屏幕上。Python 的 print 命令可以为我们实现这点。不过,有时我们只是想转换而不需要打印出来,或者需要从字符串转换成数字(这是 print 无法做到的)。这称为类型转换(type conversion)。这该如何做到呢?
Python 实际上并没有把一个东西从一种类型“转换”成另一种类型。它只是由原来的东西创建一个新东西,而且这个新东西正是你想要的类型。下面给出一些函数,它们可以把数据从一种类型转换为另一种类型。
float 从一个字符串或整数创建一个新的浮点数(小数)。
int 从一个字符串或浮点数创建一个新的整数。
str 从一个数(可以是任何其他类型)创建一个新的字符串。
float、int 和 str 后面有小括号,因为它们不是 Python 关键字(如 print)——它们只是 Python 的内置函数(function)。
后面我们还会学习更多有关函数的内容。现在只需要知道:可以把你想要转换的值放在函数后面的小括号里。要说明这一点,最好的办法就是举一些例子。在 IDLE shell 中,采用交互模式完成下面的例子。
将整数转换为浮点数
下面先从整数开始,由它创建一个新的浮点数(小数),这里要使用 float:
>>> a = 24>>> b = float(a)>>> a24>>> b24.0
注意 b 得到一个小数,末尾有一个 0。这就告诉我们这是一个浮点数而不是整数。变量 a 保持不变,因为 float 不会改变原来的值——它只是创建一个新的值。
要记住,在交互模式中,可以直接键入变量名(而不需要使用 print),Python 会显示这个变量的值(这在第 2 章中曾经见过)。不过这只在交互模式中奏效,在程序中是行不通的。
将浮点数转换为整数
下面再反过来试试,从一个小数用 int 创建一个整数:
>>> c = 38.0>>> d = int(c)>>> c38.0>>> d38
我们创建了一个新的整数 d,这是 c 的整数部分。
是吗?怎么会发生这种事情? Carter,我想肯定是你的计算机发疯了!
当然这只是开玩笑。实际上,这个问题有一个解释,你可以看看下面的“到底怎么回事?”。
到底怎么回事?
还记得我们说过计算机在内部都使用二进制吧?对,Python 存储的所有数都是作为二进制存储的。对于 38.8,Python 会用足够多的二进制位(比特)创建一个浮点数(小数)来保证 15 个小数位。不过这个二进制数并不完全等于 38.8,它只是相当相当接近。(在这里,误差是 0.000000000000003。)这个差称为舍入误差(roundoff error)。
在交互模式中键入变量名 c 时,Python 会显示它存储的原始数值,包括所有的小数位。使用 print 时,你会得到期望的结果,因为 print 更聪明一点,它很清楚要四舍五入显示 38.8。
这就像问一个人时间。他可能会说“12 点 44 分 53 秒”。不过大多数人都只是说“差一刻一点”,因为他们知道你不需要那么精确。所有计算机语 言中浮点数都存在舍入误差。对于不同的计算机或者不同的语言来说,你得到的正确的位数可能有所不同,不过都会使用同样的基本方法来存储浮点数。
通常舍入误差都很小,所以不需要担心这些误差。
下面再试试另一个转换:
>>> e = 54.99>>> f = int(e)>>> print e54.99>>> print f54
尽管 54.99 与 55 很接近,但是得到的整数仍然是 54。int 函数总是下取整。它不会给你最接近的整数,而是会给出下一个最小的整数。实际上 int 函数就是去掉小数部分。
如果想得到最接近的整数,也有一个办法。这个办法到第 21 章再告诉你。
将字符串转换为浮点数
还可以从字符串创建一个数,就像这样:
>>> a = /'76.3/'>>> b = float(a)>>> a/'76.3/'>>> b76.299999999999997
注意,显示 a 时,结果两边有引号。Python 通过这种方式告诉我们 a 是一个字符串。显示 b 时,会得到浮点数值,这里包括所有小数位(就像 Carter 之前做的一样)。