2020年10月16日星期五

004 與小卡特一起學 Python 第 4 章 資料的類型

 申明本站飛宇網 https://feiyetopro.blogspot.com/自網路收集整理之書籍文章影音僅供預覽交流學習研究,其[書籍、文章、影音]情節內容, 評論屬其個人行為, 與本網站無關。版權歸原作者和出版社所有,請在下載 24 小時內刪除,不得用作商業用途;如果您喜歡其作品,請支持訂閱購買[正版]謝謝!


4 章 資料的類型

我們已經看到,至少可以為一個變數賦 3 種不同類型的值(保存在電腦記憶體中):整數、浮點數和字串Python 還有其他一些資料類型,後面將會學到,不過對現在來說,這 3 個類型就足夠了。這一章中,我們將學習怎樣區分一個值究竟是什麼類型。還會瞭解如何由一個類型建立另一個類型。

 

4.1 改變類型

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

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

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

·    int() 從一個字串或浮點數創建一個新的整數

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

float()int()  str() 後面有小括弧,因為它們不是 Python 關鍵字(如 print——它們只是 Python 的內置函數(function)。

後面我們還會學習更多有關函數的內容。現在只需要知道:可以把你想要轉換的值放在函數後面的小括弧裡。要說明這一點,最好的辦法就是舉一些例子。在 IDLE shell 中,採用交互模式完成下面的例子。

將整數轉換為浮點數

下面先從整數開始,由它創建一個新的浮點數(小數),這裡要使用 float()

>>> a = 24

>>> b = float(a)

>>> a

24

>>> b

24.0

 

注意 b 得到一個小數,末尾有一個 0。這就告訴我們這是一個浮點數而不是整數。變數 a 保持不變,因為 float() 不會改變原來的值——它只是創建一個新的值。

要記住,在交互模式中,可以直接鍵入變數名(而不需要使用 print),Python 會顯示這個變數的值(這在第 2 章中曾經見過)。不過這只在交互模式中奏效,在程式中是行不通的。

將浮點數轉換為整數

下面再反過來試試,從一個小數用 int() 創建一個整數:

>>> c = 38.0

>>> d = int(c)

>>> c

38.0

>>> d

38

 

我們創建了一個新的整數 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 e

54.99

>>> print f

54

 

儘管 54.99 55 很接近,但是得到的整數仍然是 54int() 函數總是下取整。它不會給你最接近的整數,而是會給出下一個最小的整數。實際上 int() 函數就是去掉小數部分。

如果想得到最接近的整數,也有一個辦法。這個辦法到第 21 章再告訴你。


將字串轉換為浮點數

還可以從字串創建一個數,就像這樣:

>>> a = '76.3'

>>> b = float(a)

>>> a

'76.3'

>>> b

76.3

 

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

4.2 得到更多資訊:type()

上一節說過,我們通過看引號來確定一個值究竟是數還是字串。要確定它是一個數還是字串還有一種更直接的方法。

Python 還提供了函數 type(),它可以明確地告訴我們變數的類型

下麵試試看:

>>> a = '44.2'

>>> b = 44.2

>>> type(a)

<type 'str'>

>>> type(b)

<type 'float'>

 

type() 函數告訴我們a的類型是 'str',這代表字串(string),b 的類型是 'float',很明白,不用猜也知道這代表浮點數!

 4.3 類型轉換錯誤

當然,如果向 int()  float() 提供的不是一個數,它就會不正常。

下麵來試試看:

>>> print float('fred')

Traceback (most recent call last):

  File "<pyshell#1>", line 1, in <module>

    print float ('fred')

ValueError: could not convert string to float: fred

 

我們得到了一個錯誤消息。這個非法文字(invalid literal)錯誤消息說明 Python 不知道怎麼從 "fred" 創建一個數。如果是你,你知道嗎?

  

4.4 使用類型轉換

再來看第 3 動手試一試中從華氏度到攝氏度的溫度轉換程式,應該記得當時需要修正整除行為才能得到正確的答案,需要把 5 改為 5.0 或者把 9 改成 9.0

cel = 5.0 / 9 * (fahr - 32)

 

float() 函數給出了另一種做法:

cel = float(5) / 9 * (fahr - 32)

 

cel = 5 / float(9) * (fahr - 32)

 

可以試試看。

你學到了什麼

在這一章,你學到了以下內容。

·    完成類型轉換(或者更準確地說,從某些類型創建另外一些類型):str()int()  float()

·    直接顯示值,而不使用 print

·    使用 type() 查看變數的類型。

·    舍入誤差及其出現的原因。

測試題

1. 使用 int() 將小數轉換為整數,結果是上取整還是下取整?

2. 在溫度轉換程式中,可以這樣做嗎?

cel = float(5 / 9 * (fahr - 32))

 

這樣呢?

cel = 5 / 9 * float(fahr - 32)

 

如果不行,為什麼?

3. (挑戰題)除了 int() 不使用任何其他函數,如何對一個數四捨五入而不是下取整?(例如,13.2 會下取整為 13,但是 13.7 會上取整為 14。)

動手試一試

1. 使用 float() 從一個字串(如 '12.34')創建一個數。要保證結果確實是一個數!

2. 試著使用 int() 從一個小數(56.78)創建一個整數。答案是上取整還是下取整?

3. 試著使用 int() 從一個字串創建整數。要保證結果確實是一個整數!

 

0 留言:

發佈留言