本文的主題是 python 中的數字。會詳細介紹每一種數字類型,它們适用的各種運算符, 以及用于處理數字的内建函數。在文章的末尾, 簡單介紹了幾個标準庫中用于處理數字的子產品。
數字提供了标量貯存和直接通路。它是不可更改類型,也就是說變更數字的值會生成新的對象。當然,這個過程無論對程式員還是對使用者都是透明的,并不會影響軟體的開發方式。 python 支援多種數字類型:整型、長整型、布爾型、雙精度浮點型、十進制浮點型和複數。
建立數值對象并用其指派
(數字對象)
建立數值對象和給變量指派一樣同樣簡單:
更新數字對象
通過給數字對象(重新)指派, 您可以“更新”一個數值對象。我們之是以給更新這兩個字加上引号,是因為實際上你并沒有更新該對象的原始數值。這是因為數值對象是不可改變對象。python
的對象模型與正常對象模型有些不同。你所認為的更新實際上是生成了一個新的數值對象,并得到它的引用。 在學習程式設計的過程中,
我們一直接受這樣的教育,變量就像一個盒子,
裡面裝着變量的值。在python中,變量更像一個指針指向裝變量值的盒子。對不可改變類型來說,你無法改變盒子的内容,但你可以将指針指向一個新盒子。每次将另外的數字賦給變量的時候,實際上建立了一個新的對象并把它賦給變量.(不僅僅是數字,對于所有的不可變類型,都是這麼回事)
通過下面的代碼測試:
如何删除數字對象
按照python的法則,你無法真正删除一個數值對象,你僅僅是不再使用它而已。如果你實際上想删除一個數值對象的引用,使用del語句。删除對象的引用之後,你就不能再使用這個引用(變量名), 除非你給它賦一個新值。如果試圖使用一個已經被删除的對象引用,會引發 nameerror 異常。
python 有幾種整數類型。布爾類型是隻有兩個值的整型。正常整型是絕大多數現代系統都能識别的整型。python
也有長整數類型。然而,它表示的數值大小遠超過c
語言的長整數。下面我們先來了解一下這些類型,然後再來研究那些用于python整數類型的運算符和内建函數。
1.1 布爾型
python 從版本 2.3 開始支援布爾類型。該類型的取值範圍隻有兩個值,也就是布爾值 true和布爾值 false。
1.2 标準整數類型
python
的标準整數類型是最通用的數字類型。在大多數32位機器上,标準整數類型的取值範圍是-231到231-1,也就是-2,147,483,648到
2,147,483,647。如果在64位機器上使用64位編譯器編譯python,那麼在這個系統上的整數将是 64 位。下面是一些 python
标準整數類型對象的例子:
0101 84 -237 0x80 017 -680 -0x92
python标準整數類型等價于c的(有符号)長整型。整數一般以十進制表示,但是 python也支援八進制或十六進制來表示整數。如果八進制整數以數字“0”開始, 十六進制整數則以“0x”或“0x”開始。
1.3 長整型
關于python長整數類型我們必須要提的是,請不要将它和c或其它編譯型語言的長整數類型混淆。那些語言的長整數典型的取值範圍是32位或64位。python的長整數類型能表達的數值僅僅與你的機器支援的(虛拟)記憶體大小有關,換句話說,python 能輕松表達很大很大很大的整數。長整數類型是标準整數類型的超集,當你的程式需要使用比标準整數類型更大的整數時,長整數類型就有用武之地了。在一個整數值後面加個 l(大寫或小寫都可以),表示這個整數是長整數。這個整數可以是十進制,八進制,或十六進制。下面是一些長整數的例子:
16384l -0x4e8l 017l -2147483648l 052144364l
299792458l 0xdecadedeadbeefbadfeeddeal -5432101234l
edit by vheavens
核心風格:用大寫字母 “l”表示長整數,目前整型和長整型正在逐漸緩慢的統一,您隻有在對長整數調用repr()函數時才有機會看到“l”,如果對長整數對象調用 str()函數就看不到 l。舉例如下:
1.4 整型和長整型的統一
這兩種整數類型正在逐漸統一為一種。在 python 2.2 以前,标準整數類型對象超出取值範圍會溢出(比如上面提到的大于 232 的數),但是從 python2.2 以後就再也沒有這樣的錯誤了。
python中的浮點數類似c語言中的double類型,是雙精度浮點數,可以用直接的十進制或科學計數法表示。每個浮點數占8個位元組(64比
特),完全遵守ieee754号規範(52m/11e/1s),其中52個比特用于表示底,11個比特用于表示指數(可表示的範圍大約是正負 10 的
308.25次方),剩下的一個比特表示符号。這看上去相當完美,然而,實際精度依賴于機器架構和建立 python
解釋器的編譯器。浮點數值通常都有一個小數點和一個可選的字尾e(大寫或小寫,表示科學計數法)。在e和指數之間可以用正(+)或負(-)表示指數的正負
(正數的話可以省略符号)。下面是一些典型的浮點數值的例子:
一個實數和一個虛數的組合構成一個複數。一個複數是一對有序浮點數(x, y)。表示為x +
yj,其中x是實數部分,y是虛數部分。漸漸的複數在日常運算,機械,電子等行業獲得了廣泛的應用。由于一些研究人員不斷的重複制造用于複數運算的工具,
在很久以前的python1.4 版本裡,複數終于成為一個真正的python 資料類型。
下面是 python 語言中有關複數的幾個概念:
虛數不能單獨存在,它們總是和一個值為 0.0 的實數部分一起來構成一個複數。
複數由實數部分和虛數部分構成
表示虛數的文法: real+imagj
實數部分和虛數部分都是浮點數
虛數部分必須有字尾j或j。
1.複數的内建屬性
複數對象擁有資料屬性,分别為該複數的實部和虛部。複數還擁有conjugate 方法,調用它可以傳回該複數的共轭複數對象。
複數屬性
屬性 描述
num.real 該複數的實部
num num.imag 該複數的虛部
num.conjugate() 傳回該複數的共轭複數
數值類型可進行多種運算。從标準運算符到數值運算符,甚至還有專門的整數運算符。
5.5.1 混合模式運算符
python支援不同的數字類型相加。當一個整數和一個浮點數相加時, 系統會決定使用整數加法還是浮點數加法(實際上并不存在混合運算)。python使用數字類型強制轉換的方法來解決數字類型不一緻的問題,也就是說它會強制将一個操作數轉換為同另一個操作數相同的資料類型。這種操作不是随意進行的, 它遵循以下基本規則:
首先,如果兩個操作數都是同一種資料類型,沒有必要進行類型轉換。僅當兩個操作數類型不一緻時, python才會去檢查一個操作數是否可以轉換為另一類型的操作數。如果可以,轉換它并傳回轉換結果。
由于某些轉換是不可能的,比如果将一個複數轉換為非複數類型,将一個浮點數轉換為整數等等,是以轉換過程必須遵守幾個規則。要将一個整數轉換為浮點數,隻要在整數後面加個.0就可以了。要将一個非複數轉換為複數,則隻需要要加上一個 “0j”的虛數部分。
這些類型轉換的基本原則是: 整數轉換為浮點數,非複數轉換為複數。在 python 語言參考中這樣描述coerce()方法:
如果有一個操作數是複數, 另一個操作數被轉換為複數。
否則,如果有一個操作數是浮點數, 另一個操作數被轉換為浮點數。
否則, 如果有一個操作數是長整數,則另一個操作數被轉換為長整數;
否則,兩者必然都是普通整數,無須類型轉換。
數字類型之間的轉換是自動進行的,程式員無須自己編碼處理類型轉換。python 提供了 coerce() 内建函數來幫助你實作這種轉換。
參見下面的流程圖闡釋了強制轉換的規則:
算術運算符
python 支援單目運算符正号(+)和負号(-), 雙目運算符, +,-,*,/,%,還有 ** ,分别表示加法,減法,乘法,除法,取餘,和幂運算。從 python2.2 起,還增加了一種新的整除運算符//。
傳統除法
如果是整數除法, 傳統除法會舍去小數部分,傳回一個整數(地闆除)。如果操作數之一是浮點數,則執行真正的除法。包括 python 語言在内的很多語言都是這種行為。看下面的例子:
真正的除法
除法運算總是傳回真實的商,不管操作數是整數還是浮點數。在未來版本的 python中,這将是除法運算的标準行為。現階段通過執行from __future__ import division指令,也可以做到這一點。
地闆除
從python 2.2開始,一個新的運算符//已經被增加進來,以執行地闆除:// 除法不管操作數何種數值類型,總是舍去小數部分,傳回數字序列中比真正的商小的最接近的數字。
幂運算
幂運算操作符和一進制操作符之間的優先級關系比較特别:幂運算操作符比其左側操作數的一進制操作符優先級低,比起右側操作數的一進制操作符的優先級高,由于這個特性你會在算術運算符表中找到兩個** .下面舉幾個例子:
第2種情況下解釋器先計算3**2再取其相反數,我們需要給"-3"加上括号來得到我們希望的結果。最後一個例子,結果是4**(-1),這是按照規定的優先級獲得的結果.
traceback (innermost last):
file "<stdin>", line 1, in ?
valueerror: integer to the negative power
下面是更多 python 數值運算的例子:
*位運算符(隻适用于整數)
python整數支援标準位運算:取反(~),按位 與(&), 或(|) 及 異或(^) 及左移(<<)和右移(>>)。python 這樣處理位運算:
負數會被當成正數的2進制補碼處理。
左移和右移n位等同于無溢出檢查的2的n次幂運算:2**n。
對
長整數來說,
位運算符使用一種經修改的2進制補碼形式,使得符号位可以無限的向左擴充。取反(~)運算的優先級與數字單目運算符相同,是所有位操作符中優先級最高的一
個。左移和右移運算的優先級次之,但低于加減法運算。與,或,異或運算優先級最低。所有位運算符按優先級高低列在表 5.4
标準類型函數
cmp(), str() 和 type()内建函數。這些函數可以用于所有的标準類型。對數字對象來說,這些函數分别比較兩個數的大小,将數字轉換為字元串,以及傳回數字對象的類型。
轉換工廠函數
函數 int(), long(), float() 和 complex()
用來将其它數值類型轉換為相應的數值類型。從python2.3開始,python 的标準資料類型添加了一個新成員:布爾(boolean)類型。從此
true 和 false 現在有了常量值即 true 和 false(不再是1和0)
下面是一些使用内建函數的示例:
功能函數
python 有五個運算内建函數用于數值運算: abs(), coerce(), divmod(), pow(), pow() 和 round()。我們将對這些函數逐一浏覽,并給出一些有用的例子:
abs()傳回給定參數的絕對值。如果參數是一個複數,那麼就傳回 math.sqrt(num.real2 + num.imag2)
coerce()僅回一個包含類型轉換完畢的兩個數值元素的元組
divmod()内建函數把除法和取餘運算結合起來,
傳回一個包含商和餘數的元組。對整數來說,它的傳回值就是地闆除和取餘操作的結果。對浮點數來說,傳回的商部分是
math.floor(num1/num2),對複數來說,商部分是ath.floor((num1/num2).real)。
round()用于對浮點數進行四舍五入運算。它有一個可選的小數位數參數。如果不提供小數位參數,它傳回與第一個參數最接近的整數(但仍然是浮點類型)。第二個參數告訴round 函數将結果精确到小數點後指定位數。
數值運算内建函數:
函數 功能
abs(num) 傳回num 的絕對值
coerce(num1, num2) 将num1和num2轉換為同一類型,然後以一個元組的形式傳回
divmod(num1, num2) 除法-取餘運算的結合。傳回一個元組(num1/num2,num1 % num2)。對浮點數和複數的商進行下舍入
pow(num1, num2, mod=1) 取num1 的num2次方,如果提供mod參數,則計算結果再對mod進行取餘運算
round(flt, ndig=0) 接受一個浮點數 flt 并對其四舍五入,儲存 ndig位小數。若不提供ndig 參數,則預設小數點後0位
round() 僅用于浮點數
僅适用于整數的内建函數:
函數 操作
hex(num) 将數字轉換成十六進制數并以字元串形式傳回
oct(num) 将數字轉換成八進制數并以字元串形式傳回
chr(num) 将ascii值的數字轉換成ascii字元,範圍隻能是0 <= num <= 255
ord(chr) 接受一個 ascii 或 unicode 字元(長度為1的字元串),傳回相應的ascii或unicode值。
unichr(num) 接受unicode碼值,傳回 其對應的unicode字元。所接受的碼值範圍依賴于你的python是建構于ucs‐2還是ucs‐4