Python基礎(chǔ)手冊(cè)9——數(shù)字類型

Number(數(shù)字)

Python的數(shù)字由字面值生成或者由算術(shù)操作符和內(nèi)建的算術(shù)函數(shù)作為結(jié)果返回。數(shù)字提供了標(biāo)量貯存和直接訪問(wèn),它是不可更改類型,也就是說(shuō)變更數(shù)字的值會(huì)生成新的對(duì)象。Python數(shù)字分為整型、布爾類型、浮點(diǎn)型、復(fù)數(shù)等。

如何更新數(shù)字對(duì)象:

通過(guò)給數(shù)字對(duì)象(重新)賦值, 您可以“更新”一個(gè)數(shù)值對(duì)象。實(shí)際上你并沒(méi)有更新該對(duì)象的原始數(shù)值,因?yàn)閿?shù)值對(duì)象是不可改變對(duì)象,所以更新實(shí)際上是生成了一個(gè)新的數(shù)值對(duì)象,并得到它的引用。

在學(xué)習(xí)其他編程語(yǔ)言時(shí)我們通常認(rèn)為,變量就像一個(gè)盒子,里面裝著變量的值。在 Python 中,變量更像是一個(gè)指針指向了裝變量值的盒子(可以結(jié)合上一章Python對(duì)象,動(dòng)態(tài)類型一節(jié)中的圖示和例子來(lái)幫助理解)。對(duì)不可改變類型來(lái)說(shuō),你無(wú)法改變盒子的內(nèi)容,但你可以將指針指向一個(gè)新盒子。每次將另外的數(shù)字賦給變量的時(shí)候,實(shí)際上創(chuàng)建了一個(gè)新的對(duì)象并把它賦給變量(不僅僅是數(shù)字,對(duì)于所有的不可變類型,都是這么回事)。



如何刪除數(shù)字對(duì)象:

按照 Python 的法則,你無(wú)法主動(dòng)刪除一個(gè)數(shù)字對(duì)象, 你只能是不再引用它(引用計(jì)數(shù)為0的對(duì)象會(huì)被Python解釋器自動(dòng)回收)。如果你想刪除一個(gè)對(duì)數(shù)字對(duì)象的引用(變量名),使用 del 語(yǔ)句。 刪除對(duì)象的引用之后, 你就不能再使用這個(gè)引用(變量名), 除非你給它賦一個(gè)新值(新的對(duì)象)。如果試圖使用一個(gè)已經(jīng)被刪除的對(duì)象引用, 會(huì)引發(fā) NameError 異常。




一、整數(shù)

表示來(lái)自整數(shù)的數(shù)學(xué)集合(正和負(fù))的元素。有兩種類型的整數(shù):整型和布爾類型。

1、 整型(int)

Python 的標(biāo)準(zhǔn)整數(shù)類型,也是最通用的數(shù)字類型。它們表示的數(shù)值范圍沒(méi)有限制,只受限于可用的(虛擬內(nèi)存)內(nèi)存大小。

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

十六進(jìn)制數(shù)以 0x0X 開(kāi)頭,后面接十六進(jìn)制的數(shù)字0~9和A~F,八進(jìn)制數(shù)常量以數(shù)字 0o0O 開(kāi)頭,后面接八進(jìn)制數(shù)字0~7,二進(jìn)制常量以 0b0B 開(kāi)頭,后面跟二進(jìn)制數(shù)字0~1。


2、 布爾類型(bool)

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

所有標(biāo)準(zhǔn)對(duì)象均可用于布爾測(cè)試,同類型的對(duì)象之間可以比較大小。每個(gè)對(duì)象天生具有布爾 True 或 False 值??諏?duì)象、值為零的任何數(shù)字或者 Null 對(duì)象 None 的布爾值都是 False。使用內(nèi)置語(yǔ)句 bool() 可以判斷一個(gè)對(duì)象的bool值。

下列對(duì)象的布爾值是 False:

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




二、浮點(diǎn)型(float)

Python 中的浮點(diǎn)數(shù)類似 C 語(yǔ)言中的 double 類型, 是雙精度浮點(diǎn)數(shù),可以用直接的十進(jìn)制或科學(xué)計(jì)數(shù)法表示,用來(lái)表示數(shù)學(xué)概念中的有理數(shù)小數(shù)。

接受的范圍受底層的機(jī)器體系結(jié)構(gòu)(和C或者Java的實(shí)現(xiàn))控制,你需要做溢出處理。Python不支持單精度浮點(diǎn)數(shù),使用單精度浮點(diǎn)數(shù)的原因通常是節(jié)省處理器和內(nèi)存的使用,但是相比Python中對(duì)象使用的開(kāi)銷是微不足道的,因此沒(méi)有必要支持兩種浮點(diǎn)數(shù)使語(yǔ)言變的復(fù)雜。




三、復(fù)數(shù)(complex)

Python的復(fù)數(shù)常量寫成實(shí)部+虛部的寫法,這里虛部是以 j 或 J 結(jié)尾。實(shí)部從技術(shù)上講可有可無(wú),所以可能會(huì)單獨(dú)表示虛部。從內(nèi)部來(lái)看,復(fù)數(shù)都是通過(guò)一堆浮點(diǎn)數(shù)來(lái)表示的,但是對(duì)復(fù)數(shù)的所有數(shù)字操作都會(huì)按照復(fù)數(shù)的運(yùn)算法則進(jìn)行。也可以通過(guò)內(nèi)置函數(shù)complex(real, imag)來(lái)創(chuàng)建復(fù)數(shù)。

這表示作為一對(duì)機(jī)器級(jí)雙精度浮點(diǎn)數(shù)的復(fù)數(shù)。復(fù)數(shù) z 的實(shí)部和虛部可以通過(guò)只讀屬性 z.real 和 z.imag 獲得。

下面是 Python 語(yǔ)言中有關(guān)復(fù)數(shù)的幾個(gè)概念:

  • 虛數(shù)不能單獨(dú)存在,它們總是和一個(gè)值為 0.0 的實(shí)數(shù)部分一起來(lái)構(gòu)成一個(gè)復(fù)數(shù)。
  • 復(fù)數(shù)由實(shí)數(shù)部分和虛數(shù)部分構(gòu)成
  • 表示虛數(shù)的語(yǔ)法: real+imagj
  • 實(shí)數(shù)部分和虛數(shù)部分都是浮點(diǎn)數(shù)
  • 虛數(shù)部分必須有后綴 j 或 J。



四、混合模式運(yùn)算問(wèn)題

當(dāng)兩個(gè)整數(shù)相加時(shí), + 號(hào)表示整數(shù)加法, 當(dāng)兩個(gè)浮點(diǎn)數(shù)相加時(shí), + 表示浮點(diǎn)數(shù)加法, 依此類推。在 Python 中, 甚至非數(shù)字類型也可以使用 + 運(yùn)算符。舉例來(lái)說(shuō), 字符串 A + 字符串 B 并不表示加法操作, 它表示的是把這兩個(gè)字符串連接起來(lái), 生成一個(gè)新的字符串。關(guān)鍵之處在于支持 + 運(yùn)算符的每種數(shù)據(jù)類型, 必須告訴 Python, + 運(yùn)算符應(yīng)該如何去工作。 這也體現(xiàn)了重載概念的具體應(yīng)用(我們會(huì)在Python進(jìn)階手冊(cè)的運(yùn)算符重載一章具體介紹Python中運(yùn)算符重載的概念)。

雖然我們不能讓一個(gè)數(shù)字和一個(gè)字符串相加, 但 Python 確實(shí)支持不同的數(shù)字類型相加。當(dāng)一個(gè)整數(shù)和一個(gè)浮點(diǎn)數(shù)相加時(shí),系統(tǒng)會(huì)決定使用整數(shù)加法還是浮點(diǎn)數(shù)加法(實(shí)際上并不存在混合運(yùn)算)。Python 使用數(shù)字類型強(qiáng)制轉(zhuǎn)換的方法來(lái)解決數(shù)字類型不一致的問(wèn)題, 也就是說(shuō)它會(huì)強(qiáng)制將一個(gè)操作數(shù)轉(zhuǎn)換為同另一個(gè)操作數(shù)相同的數(shù)據(jù)類型。

首先,如果兩個(gè)操作數(shù)都是同一種數(shù)據(jù)類型,沒(méi)有必要進(jìn)行類型轉(zhuǎn)換。僅當(dāng)兩個(gè)操作數(shù)類型不一致時(shí), Python 才會(huì)去檢查一個(gè)操作數(shù)是否可以轉(zhuǎn)換為另一類型的操作數(shù)。如果可以,轉(zhuǎn)換它并返回轉(zhuǎn)換結(jié)果。由于某些轉(zhuǎn)換是不可能的,比如果將一個(gè)復(fù)數(shù)轉(zhuǎn)換為非復(fù)數(shù)類型, 將一個(gè)浮點(diǎn)數(shù)轉(zhuǎn)換為整數(shù)等等,因此轉(zhuǎn)換過(guò)程必須遵守幾個(gè)規(guī)則。

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

  1. 如果有一個(gè)操作數(shù)是復(fù)數(shù), 另一個(gè)操作數(shù)被轉(zhuǎn)換為復(fù)數(shù)。
  2. 否則,如果有一個(gè)操作數(shù)是浮點(diǎn)數(shù), 另一個(gè)操作數(shù)被轉(zhuǎn)換為浮點(diǎn)數(shù)。
  3. 否則,兩者必然都是整數(shù),無(wú)須類型轉(zhuǎn)換。

下面的流程圖闡釋了強(qiáng)制轉(zhuǎn)換的規(guī)則。數(shù)字類型之間的轉(zhuǎn)換是自動(dòng)進(jìn)行的,程序員無(wú)須自己編碼處理類型轉(zhuǎn)換。不過(guò)在確實(shí)需要明確指定對(duì)某種數(shù)據(jù)類型進(jìn)行特殊類型轉(zhuǎn)換的場(chǎng)合,Python 提供了 coerce() 內(nèi)建函數(shù)來(lái)幫助你實(shí)現(xiàn)這種轉(zhuǎn)換。




五、內(nèi)建函數(shù)

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

函數(shù) int()float()complex() 用來(lái)將其它數(shù)值類型轉(zhuǎn)換為相應(yīng)的數(shù)值類型。這些函數(shù)也接受字符串參數(shù), 返回字符串所表示的數(shù)值。bool() 用來(lái)將數(shù)值轉(zhuǎn)換為標(biāo)準(zhǔn)布爾值 True 和 False。


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

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

divmod() 內(nèi)建函數(shù)把除法和取余運(yùn)算結(jié)合起來(lái),返回一個(gè)包含商和余數(shù)的元組。對(duì)整數(shù)來(lái)說(shuō),它 的 返 回 值 就 是 地 板 除 和 取 余 操 作 的 結(jié) 果。對(duì) 浮 點(diǎn) 數(shù) 來(lái) 說(shuō),返 回 的 商 部 分 是math.floor(num1/num2),對(duì)復(fù)數(shù)來(lái)說(shuō),商部分是 ath.floor((num1/num2).real)。

函數(shù) pow() 和雙星號(hào) ** 運(yùn)算符都可以進(jìn)行指數(shù)運(yùn)算。不過(guò)二者的區(qū)別并不僅僅在于一個(gè)是內(nèi)建函數(shù),一個(gè)是運(yùn)算符。

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


3、進(jìn)制轉(zhuǎn)換函數(shù) hex() 和 oct()

除了十進(jìn)制標(biāo)準(zhǔn),Python 整數(shù)也支持八進(jìn)制和 16 進(jìn)制整數(shù)。 除此之外, Python還提供了兩個(gè)內(nèi)建函數(shù)來(lái)返回字符串表示的 8進(jìn)制和 16進(jìn)制整數(shù)。它們分別是 oct()hex() 。它們都接受一個(gè)整數(shù)(任意進(jìn)制的)對(duì)象,并返回一個(gè)對(duì)應(yīng)值的字符串對(duì)象。


4、ASCII 轉(zhuǎn)換函數(shù) chr() 和 ord()

Python 也提供了 ASCII(美國(guó)標(biāo)準(zhǔn)信息交換碼)碼與其序列值之間的轉(zhuǎn)換函數(shù)。每個(gè)字符對(duì)應(yīng)一個(gè)唯一的整數(shù)(0-255)。對(duì)所有使用 ASCII 表的計(jì)算機(jī)來(lái)說(shuō), 這個(gè)數(shù)值是不變的。這保證了不同系統(tǒng)之間程序行為的一致性。 函數(shù) chr() 接受一個(gè)單字節(jié)整數(shù)值, 返回一個(gè)字符串,其值為對(duì)應(yīng)的字符。函數(shù) ord() 則相反,它接受一個(gè)字符,返回其對(duì)應(yīng)的整數(shù)值。


《Python基礎(chǔ)手冊(cè)》系列:

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

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

友情鏈接更多精彩內(nèi)容