讀古今文學網 > 父與子的編程之旅:與小卡特一起學Python > 4.1 改變類型 >

4.1 改變類型

很多情況下,我們需要將數據從一種類型轉換成另一種類型。例如,想要打印一個數字時,就需要把它轉換成文本,使它能夠出現在屏幕上。Python 的 print 命令可以為我們實現這點。不過,有時我們只是想轉換而不需要打印出來,或者需要從字符串轉換成數字(這是 print 無法做到的)。這稱為類型轉換(type conversion)。這該如何做到呢?

Python 實際上並沒有把一個東西從一種類型「轉換」成另一種類型。它只是由原來的東西創建一個新東西,而且這個新東西正是你想要的類型。下面給出一些函數,它們可以把數據從一種類型轉換為另一種類型。

  • float 從一個字符串或整數創建一個新的浮點數(小數)。

  • int 從一個字符串或浮點數創建一個新的整數。

  • str 從一個數(可以是任何其他類型)創建一個新的字符串。

floatintstr 後面有小括號,因為它們不是 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 的整數部分。

 

是嗎?怎麼會發生這種事情?卡特,我想肯定是你的計算機發瘋了!

當然這只是開玩笑。實際上,這個問題有一個解釋,你可以看看下面的「到底怎麼回事?」。

到底怎麼回事?

還記得我們說過計算機在內部都使用二進制吧?對,Python 存儲的所有數都是作為二進制存儲的。對於 0.1 和 0.2 之和,Python 會用足夠多的二進制位(比特)創建一個浮點數(小數)來保證 15 個小數位。不過這個二進制數並不完全等於 0.3,它只是相當相當接近。(在這裡,誤差是 0.000000000000004。)這個差稱為捨入誤差(roundoff error)。

在交互模式中鍵入 0.1+0.2 這個表達式時,Python 會顯示它存儲的原始數值,包括所有的小數位。使用 print 時,你會得到期望的結果,因為 print 更聰明一點,它很清楚要四捨五入顯示 0.3。

這就像問一個人時間。他可能會說「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.3 

注意,顯示 a 時,結果兩邊有引號。Python 通過這種方式告訴我們 a 是一個 字符串。顯示 b 時,會得到浮點數值,這裡包括所有小數位(就像卡特之前做的一樣)。