數(shù)字類型
數(shù)字提供了標(biāo)量貯存和直接訪問。它是不可更改類型,也就是說變更數(shù)字的值會生成新的對象。當(dāng)然,這個過程無論對程序員還是對用戶都是透明的,并不會影響軟件的開發(fā)方式。 Python 支持多種數(shù)字類型:整型、長整型、布爾型、雙精度浮點型、十進制浮點型和復(fù)數(shù)。
創(chuàng)建數(shù)值對象并用其賦值
(數(shù)字對象)
創(chuàng)建數(shù)值對象和給變量賦值一樣同樣簡單:
更新數(shù)字對象
通過給數(shù)字對象(重新)賦值, 您可以“更新”一個數(shù)值對象。我們之所以給更新這兩個字加上引號,是因為實際上你并沒有更新該對象的原始數(shù)值。這是因為數(shù)值對象是不可改變對象。Python 的對象模型與常規(guī)對象模型有些不同。你所認(rèn)為的更新實際上是生成了一個新的數(shù)值對象,并得到它的引用。 在學(xué)習(xí)編程的過程中, 我們一直接受這樣的教育,變量就像一個盒子, 里面裝著變量的值。在Python中,變量更像一個指針指向裝變量值的盒子。對不可改變類型來說,你無法改變盒子的內(nèi)容,但你可以將指針指向一個新盒子。每次將另外的數(shù)字賦給變量的時候,實際上創(chuàng)建了一個新的對象并把它賦給變量.(不僅僅是數(shù)字,對于所有的不可變類型,都是這么回事)
通過下面的代碼測試:
如何刪除數(shù)字對象
按照Python的法則,你無法真正刪除一個數(shù)值對象,你僅僅是不再使用它而已。如果你實際上想刪除一個數(shù)值對象的引用,使用del語句。刪除對象的引用之后,你就不能再使用這個引用(變量名), 除非你給它賦一個新值。如果試圖使用一個已經(jīng)被刪除的對象引用,會引發(fā) NameError 異常。
Python的四種主要數(shù)字類型
1.整型
Python 有幾種整數(shù)類型。布爾類型是只有兩個值的整型。常規(guī)整型是絕大多數(shù)現(xiàn)代系統(tǒng)都能識別的整型。Python 也有長整數(shù)類型。然而,它表示的數(shù)值大小遠超過C 語言的長整數(shù)。下面我們先來了解一下這些類型,然后再來研究那些用于Python整數(shù)類型的運算符和內(nèi)建函數(shù)。
1.1 布爾型
Python 從版本 2.3 開始支持布爾類型。該類型的取值范圍只有兩個值,也就是布爾值 True和布爾值 False。
1.2 標(biāo)準(zhǔn)整數(shù)類型
Python 的標(biāo)準(zhǔn)整數(shù)類型是最通用的數(shù)字類型。在大多數(shù)32位機器上,標(biāo)準(zhǔn)整數(shù)類型的取值范圍是-231到231-1,也就是-2,147,483,648到2,147,483,647。如果在64位機器上使用64位編譯器編譯Python,那么在這個系統(tǒng)上的整數(shù)將是 64 位。下面是一些 Python 標(biāo)準(zhǔn)整數(shù)類型對象的例子:
0101 84 -237 0x80 017 -680 -0X92
Python標(biāo)準(zhǔn)整數(shù)類型等價于C的(有符號)長整型。整數(shù)一般以十進制表示,但是 Python也支持八進制或十六進制來表示整數(shù)。如果八進制整數(shù)以數(shù)字“0”開始, 十六進制整數(shù)則以“0x”或“0X”開始。
1.3 長整型
關(guān)于Python長整數(shù)類型我們必須要提的是,請不要將它和C或其它編譯型語言的長整數(shù)類型混淆。那些語言的長整數(shù)典型的取值范圍是32位或64位。Python的長整數(shù)類型能表達的數(shù)值僅僅與你的機器支持的(虛擬)內(nèi)存大小有關(guān),換句話說,Python 能輕松表達很大很大很大的整數(shù)。長整數(shù)類型是標(biāo)準(zhǔn)整數(shù)類型的超集,當(dāng)你的程序需要使用比標(biāo)準(zhǔn)整數(shù)類型更大的整數(shù)時,長整數(shù)類型就有用武之地了。在一個整數(shù)值后面加個 L(大寫或小寫都可以),表示這個整數(shù)是長整數(shù)。這個整數(shù)可以是十進制,八進制,或十六進制。下面是一些長整數(shù)的例子:
核心風(fēng)格:用大寫字母 “L”表示長整數(shù),目前整型和長整型正在逐漸緩慢的統(tǒng)一,您只有在對長整數(shù)調(diào)用repr()函數(shù)時才有機會看到“L”,如果對長整數(shù)對象調(diào)用 str()函數(shù)就看不到 L。舉例如下:
1.4 整型和長整型的統(tǒng)一
這兩種整數(shù)類型正在逐漸統(tǒng)一為一種。在 Python 2.2 以前,標(biāo)準(zhǔn)整數(shù)類型對象超出取值范圍會溢出(比如上面提到的大于 232 的數(shù)),但是從 Python2.2 以后就再也沒有這樣的錯誤了。
雙精度浮點數(shù)
Python中的浮點數(shù)類似C語言中的double類型,是雙精度浮點數(shù),可以用直接的十進制或科學(xué)計數(shù)法表示。每個浮點數(shù)占8個字節(jié)(64比特),完全遵守IEEE754號規(guī)范(52M/11E/1S),其中52個比特用于表示底,11個比特用于表示指數(shù)(可表示的范圍大約是正負(fù) 10 的 308.25次方),剩下的一個比特表示符號。這看上去相當(dāng)完美,然而,實際精度依賴于機器架構(gòu)和創(chuàng)建 Python 解釋器的編譯器。浮點數(shù)值通常都有一個小數(shù)點和一個可選的后綴e(大寫或小寫,表示科學(xué)計數(shù)法)。在e和指數(shù)之間可以用正(+)或負(fù)(-)表示指數(shù)的正負(fù)(正數(shù)的話可以省略符號)。下面是一些典型的浮點數(shù)值的例子:
復(fù)數(shù)
一個實數(shù)和一個虛數(shù)的組合構(gòu)成一個復(fù)數(shù)。一個復(fù)數(shù)是一對有序浮點數(shù)(x, y)。表示為x + yj,其中x是實數(shù)部分,y是虛數(shù)部分。漸漸的復(fù)數(shù)在日常運算,機械,電子等行業(yè)獲得了廣泛的應(yīng)用。由于一些研究人員不斷的重復(fù)制造用于復(fù)數(shù)運算的工具,在很久以前的Python1.4 版本里,復(fù)數(shù)終于成為一個真正的Python 數(shù)據(jù)類型。
下面是 Python 語言中有關(guān)復(fù)數(shù)的幾個概念:
虛數(shù)不能單獨存在,它們總是和一個值為 0.0 的實數(shù)部分一起來構(gòu)成一個復(fù)數(shù)。
復(fù)數(shù)由實數(shù)部分和虛數(shù)部分構(gòu)成
表示虛數(shù)的語法: real+imagj
實數(shù)部分和虛數(shù)部分都是浮點數(shù)
虛數(shù)部分必須有后綴j或J。
1.復(fù)數(shù)的內(nèi)建屬性
復(fù)數(shù)對象擁有數(shù)據(jù)屬性,分別為該復(fù)數(shù)的實部和虛部。復(fù)數(shù)還擁有conjugate 方法,調(diào)用它可以返回該復(fù)數(shù)的共軛復(fù)數(shù)對象。
復(fù)數(shù)屬性
屬性 描述
num.real 該復(fù)數(shù)的實部
num num.imag 該復(fù)數(shù)的虛部
num.conjugate() 返回該復(fù)數(shù)的共軛復(fù)數(shù)
運算符
數(shù)值類型可進行多種運算。從標(biāo)準(zhǔn)運算符到數(shù)值運算符,甚至還有專門的整數(shù)運算符。
5.5.1 混合模式運算符
Python支持不同的數(shù)字類型相加。當(dāng)一個整數(shù)和一個浮點數(shù)相加時, 系統(tǒng)會決定使用整數(shù)加法還是浮點數(shù)加法(實際上并不存在混合運算)。Python使用數(shù)字類型強制轉(zhuǎn)換的方法來解決數(shù)字類型不一致的問題,也就是說它會強制將一個操作數(shù)轉(zhuǎn)換為同另一個操作數(shù)相同的數(shù)據(jù)類型。這種操作不是隨意進行的, 它遵循以下基本規(guī)則:
首先,如果兩個操作數(shù)都是同一種數(shù)據(jù)類型,沒有必要進行類型轉(zhuǎn)換。僅當(dāng)兩個操作數(shù)類型不一致時, Python才會去檢查一個操作數(shù)是否可以轉(zhuǎn)換為另一類型的操作數(shù)。如果可以,轉(zhuǎn)換它并返回轉(zhuǎn)換結(jié)果。
由于某些轉(zhuǎn)換是不可能的,比如果將一個復(fù)數(shù)轉(zhuǎn)換為非復(fù)數(shù)類型,將一個浮點數(shù)轉(zhuǎn)換為整數(shù)等等,因此轉(zhuǎn)換過程必須遵守幾個規(guī)則。要將一個整數(shù)轉(zhuǎn)換為浮點數(shù),只要在整數(shù)后面加個.0就可以了。要將一個非復(fù)數(shù)轉(zhuǎn)換為復(fù)數(shù),則只需要要加上一個 “0j”的虛數(shù)部分。
這些類型轉(zhuǎn)換的基本原則是: 整數(shù)轉(zhuǎn)換為浮點數(shù),非復(fù)數(shù)轉(zhuǎn)換為復(fù)數(shù)。在 Python 語言參考中這樣描述coerce()方法:
如果有一個操作數(shù)是復(fù)數(shù), 另一個操作數(shù)被轉(zhuǎn)換為復(fù)數(shù)。
否則,如果有一個操作數(shù)是浮點數(shù), 另一個操作數(shù)被轉(zhuǎn)換為浮點數(shù)。
否則, 如果有一個操作數(shù)是長整數(shù),則另一個操作數(shù)被轉(zhuǎn)換為長整數(shù);
否則,兩者必然都是普通整數(shù),無須類型轉(zhuǎn)換。
數(shù)字類型之間的轉(zhuǎn)換是自動進行的,程序員無須自己編碼處理類型轉(zhuǎn)換。Python 提供了 coerce() 內(nèi)建函數(shù)來幫助你實現(xiàn)這種轉(zhuǎn)換。
參見下面的流程圖闡釋了強制轉(zhuǎn)換的規(guī)則:

算術(shù)運算符
Python 支持單目運算符正號(+)和負(fù)號(-), 雙目運算符, +,-,*,/,%,還有 ** ,分別表示加法,減法,乘法,除法,取余,和冪運算。從 Python2.2 起,還增加了一種新的整除運算符//。
傳統(tǒng)除法
如果是整數(shù)除法, 傳統(tǒng)除法會舍去小數(shù)部分,返回一個整數(shù)(地板除)。如果操作數(shù)之一是浮點數(shù),則執(zhí)行真正的除法。包括 Python 語言在內(nèi)的很多語言都是這種行為。看下面的例子:
真正的除法
除法運算總是返回真實的商,不管操作數(shù)是整數(shù)還是浮點數(shù)。在未來版本的 Python中,這將是除法運算的標(biāo)準(zhǔn)行為。現(xiàn)階段通過執(zhí)行from __future__ import division指令,也可以做到這一點。
地板除
從Python 2.2開始,一個新的運算符//已經(jīng)被增加進來,以執(zhí)行地板除:// 除法不管操作數(shù)何種數(shù)值類型,總是舍去小數(shù)部分,返回數(shù)字序列中比真正的商小的最接近的數(shù)字。