Python基礎手冊9——數字類型

Number(數字)

Python的數字由字面值生成或者由算術操作符和內建的算術函數作為結果返回。數字提供了標量貯存和直接訪問,它是不可更改類型,也就是說變更數字的值會生成新的對象。Python數字分為整型、布爾類型、浮點型、復數等。

如何更新數字對象:

通過給數字對象(重新)賦值, 您可以“更新”一個數值對象。實際上你并沒有更新該對象的原始數值,因為數值對象是不可改變對象,所以更新實際上是生成了一個新的數值對象,并得到它的引用。

在學習其他編程語言時我們通常認為,變量就像一個盒子,里面裝著變量的值。在 Python 中,變量更像是一個指針指向了裝變量值的盒子(可以結合上一章Python對象,動態類型一節中的圖示和例子來幫助理解)。對不可改變類型來說,你無法改變盒子的內容,但你可以將指針指向一個新盒子。每次將另外的數字賦給變量的時候,實際上創建了一個新的對象并把它賦給變量(不僅僅是數字,對于所有的不可變類型,都是這么回事)。



如何刪除數字對象:

按照 Python 的法則,你無法主動刪除一個數字對象, 你只能是不再引用它(引用計數為0的對象會被Python解釋器自動回收)。如果你想刪除一個對數字對象的引用(變量名),使用 del 語句。 刪除對象的引用之后, 你就不能再使用這個引用(變量名), 除非你給它賦一個新值(新的對象)。如果試圖使用一個已經被刪除的對象引用, 會引發 NameError 異常。




一、整數

表示來自整數的數學集合(正和負)的元素。有兩種類型的整數:整型和布爾類型。

1、 整型(int)

Python 的標準整數類型,也是最通用的數字類型。它們表示的數值范圍沒有限制,只受限于可用的(虛擬內存)內存大小。

整數常以十進制數字常量表示,但是Python還允許我們使用十六進制、八進制和二進制計數法來編寫整數。所有這些常量在程序代碼中都產生一個整數對象(硬盤上和內存中保存的都是數字對應的二進制格式),他們僅僅是特定值的不同語法表示而已。Python默認的使用十進制來顯示整數,但是也提供了內置函數把整數轉換成其他進制的數字字符串格式。內置函數 hex()oct()bin() 把一個整數轉換為這三種進制表示的字符串,并且 int() 內置函數根據每個給定的進制把字符串轉換為一個整數,并可以通過定義的第二個參數來確定變換后的數字的進制。

十六進制數以 0x0X 開頭,后面接十六進制的數字0~9和A~F,八進制數常量以數字 0o0O 開頭,后面接八進制數字0~7,二進制常量以 0b0B 開頭,后面跟二進制數字0~1。


2、 布爾類型(bool)

布爾值是特殊的整數,它們表示真值 TrueFalse 。True和False是預先定義的內置的變量名,他們是bool的實例,bool 實際上是普通整數的子類型。如果將布爾值放到一個數值上下文環境中(比方將 True 與一個數字相加), True 會被當成整數值 1,而 False則會被當成整數值 0。他們只是有特定的顯示邏輯:他們是作為關鍵字True和False顯示的,而不是數字(實際上,bool為它的兩個對象重新定義了str和repr的字符串格式)。

所有標準對象均可用于布爾測試,同類型的對象之間可以比較大小。每個對象天生具有布爾 True 或 False 值。空對象、值為零的任何數字或者 Null 對象 None 的布爾值都是 False。使用內置語句 bool() 可以判斷一個對象的bool值。

下列對象的布爾值是 False:

  • None
  • False (布爾類型)
  • 所有的值為零的數:
    • 0 (整型)
    • (浮點型)
    • 0.0+0.0j (復數)
    • "" (空字符串)
    • [] (空列表)
    • () (空元組)
    • {} (空字典)




二、浮點型(float)

Python 中的浮點數類似 C 語言中的 double 類型, 是雙精度浮點數,可以用直接的十進制或科學計數法表示,用來表示數學概念中的有理數小數。

接受的范圍受底層的機器體系結構(和C或者Java的實現)控制,你需要做溢出處理。Python不支持單精度浮點數,使用單精度浮點數的原因通常是節省處理器和內存的使用,但是相比Python中對象使用的開銷是微不足道的,因此沒有必要支持兩種浮點數使語言變的復雜。




三、復數(complex)

Python的復數常量寫成實部+虛部的寫法,這里虛部是以 j 或 J 結尾。實部從技術上講可有可無,所以可能會單獨表示虛部。從內部來看,復數都是通過一堆浮點數來表示的,但是對復數的所有數字操作都會按照復數的運算法則進行。也可以通過內置函數complex(real, imag)來創建復數。

這表示作為一對機器級雙精度浮點數的復數。復數 z 的實部和虛部可以通過只讀屬性 z.real 和 z.imag 獲得。

下面是 Python 語言中有關復數的幾個概念:

  • 虛數不能單獨存在,它們總是和一個值為 0.0 的實數部分一起來構成一個復數。
  • 復數由實數部分和虛數部分構成
  • 表示虛數的語法: real+imagj
  • 實數部分和虛數部分都是浮點數
  • 虛數部分必須有后綴 j 或 J。



四、混合模式運算問題

當兩個整數相加時, + 號表示整數加法, 當兩個浮點數相加時, + 表示浮點數加法, 依此類推。在 Python 中, 甚至非數字類型也可以使用 + 運算符。舉例來說, 字符串 A + 字符串 B 并不表示加法操作, 它表示的是把這兩個字符串連接起來, 生成一個新的字符串。關鍵之處在于支持 + 運算符的每種數據類型, 必須告訴 Python, + 運算符應該如何去工作。 這也體現了重載概念的具體應用(我們會在Python進階手冊的運算符重載一章具體介紹Python中運算符重載的概念)。

雖然我們不能讓一個數字和一個字符串相加, 但 Python 確實支持不同的數字類型相加。當一個整數和一個浮點數相加時,系統會決定使用整數加法還是浮點數加法(實際上并不存在混合運算)。Python 使用數字類型強制轉換的方法來解決數字類型不一致的問題, 也就是說它會強制將一個操作數轉換為同另一個操作數相同的數據類型。

首先,如果兩個操作數都是同一種數據類型,沒有必要進行類型轉換。僅當兩個操作數類型不一致時, Python 才會去檢查一個操作數是否可以轉換為另一類型的操作數。如果可以,轉換它并返回轉換結果。由于某些轉換是不可能的,比如果將一個復數轉換為非復數類型, 將一個浮點數轉換為整數等等,因此轉換過程必須遵守幾個規則。

在 Python 語言參考中這樣描述 coerce() 方法:

  1. 如果有一個操作數是復數, 另一個操作數被轉換為復數。
  2. 否則,如果有一個操作數是浮點數, 另一個操作數被轉換為浮點數。
  3. 否則,兩者必然都是整數,無須類型轉換。

下面的流程圖闡釋了強制轉換的規則。數字類型之間的轉換是自動進行的,程序員無須自己編碼處理類型轉換。不過在確實需要明確指定對某種數據類型進行特殊類型轉換的場合,Python 提供了 coerce() 內建函數來幫助你實現這種轉換。




五、內建函數

1、int()、float() 、complex() 和 bool()

函數 int()float()complex() 用來將其它數值類型轉換為相應的數值類型。這些函數也接受字符串參數, 返回字符串所表示的數值。bool() 用來將數值轉換為標準布爾值 True 和 False。


2、 abs()、divmod()、 pow() 和 round()

abs() 返回給定參數的絕對值。如果參數是一個復數, 那么就返回 math.sqrt(num.real2 +num.imag2)。

divmod() 內建函數把除法和取余運算結合起來,返回一個包含商和余數的元組。對整數來說,它 的 返 回 值 就 是 地 板 除 和 取 余 操 作 的 結 果。對 浮 點 數 來 說,返 回 的 商 部 分 是math.floor(num1/num2),對復數來說,商部分是 ath.floor((num1/num2).real)。

函數 pow() 和雙星號 ** 運算符都可以進行指數運算。不過二者的區別并不僅僅在于一個是內建函數,一個是運算符。

內建函數 round() 用于對浮點數進行四舍五入運算。它有一個可選的小數位數參數。如果不提供小數位參數, 它返回與第一個參數最接近的整數。第二個參數告訴 round() 函數將結果精確到小數點后指定位數。


3、進制轉換函數 hex() 和 oct()

除了十進制標準,Python 整數也支持八進制和 16 進制整數。 除此之外, Python還提供了兩個內建函數來返回字符串表示的 8進制和 16進制整數。它們分別是 oct()hex() 。它們都接受一個整數(任意進制的)對象,并返回一個對應值的字符串對象。


4、ASCII 轉換函數 chr() 和 ord()

Python 也提供了 ASCII(美國標準信息交換碼)碼與其序列值之間的轉換函數。每個字符對應一個唯一的整數(0-255)。對所有使用 ASCII 表的計算機來說, 這個數值是不變的。這保證了不同系統之間程序行為的一致性。 函數 chr() 接受一個單字節整數值, 返回一個字符串,其值為對應的字符。函數 ord() 則相反,它接受一個字符,返回其對應的整數值。


《Python基礎手冊》系列:

Python基礎手冊 1 —— Python語言介紹
Python基礎手冊 2 —— Python 環境搭建(Linux)
Python基礎手冊 3 —— Python解釋器
Python基礎手冊 4 —— 文本結構
Python基礎手冊 5 —— 標識符和關鍵字
Python基礎手冊 6 —— 操作符
Python基礎手冊 7 —— 內建函數
Python基礎手冊 8 —— Python對象
Python基礎手冊 9 —— 數字類型
Python基礎手冊10 —— 序列(字符串)
Python基礎手冊11 —— 序列(元組&列表)
Python基礎手冊12 —— 序列(類型操作)
Python基礎手冊13 —— 映射(字典)
Python基礎手冊14 —— 集合
Python基礎手冊15 —— 解析
Python基礎手冊16 —— 文件
Python基礎手冊17 —— 簡單語句
Python基礎手冊18 —— 復合語句(流程控制語句)
Python基礎手冊19 —— 迭代器
Python基礎手冊20 —— 生成器
Python基礎手冊21 —— 函數的定義
Python基礎手冊22 —— 函數的參數
Python基礎手冊23 —— 函數的調用
Python基礎手冊24 —— 函數中變量的作用域
Python基礎手冊25 —— 裝飾器
Python基礎手冊26 —— 錯誤 & 異常
Python基礎手冊27 —— 模塊
Python基礎手冊28 —— 模塊的高級概念
Python基礎手冊29 —— 包

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。