1. 程式人生 > >Python程式設計基礎之四數字

Python程式設計基礎之四數字

一、簡介

       Python主要的數字型別:整型、浮點型和複數,瞭解對數字有效的操作符、內建函式以及工廠函式對合理處理數字有很好的指導作用。

二、詳解

1、數字型別

        數字提供了標量貯存和直接訪問。它是不可更改型別,也就是說變更數字的值會生成新的物件。當然,這個過程無論對程式設計師還是對使用者都是透明的,並不會影響軟體的開發方式。
        Python 支援多種數字型別:整型、長整型、布林型、雙精度浮點型、十進位制浮點型和複數。
        數字物件:建立數值物件即給變數賦值。
        更新數字物件:通過給數字物件(重新)賦值,您可以“更新”一個數值物件。我們之所以給更新這兩個字加上引號, 是因為實際上你並沒有更新該物件的原始數值。這是因為數值物件是不可改變物件。Python 的物件模型與常規物件模型有些不同。你所認為的更新實際上是生成了一個新的數值物件,並得到它的引用。
         刪除數字物件:按照Python的法則,你無法真正刪除一個數值物件,你僅僅是不再使用它而已。如果你實際上想刪除一個數值物件的引用,使用 del語句刪除物件的引用之後,你就不能再使用這個引用(變數名), 除非你給它賦一個新值。如果試圖使用一個已經被刪除的物件引用, 會引發NameError異常。

2、整型

        Python有幾種整數型別。布林型別是隻有兩個值的整型,常規整型是絕大多數現代系統都能識別的整型,Python也有長整數型別。然而,它表示的數值大小遠超過 C 語言的長整數 。
(1)布林型
布林型別的取值範圍只有兩個值,也就是布林值 True和布林值 False。

(2)標準整數型別
        Python的標準整數型別是最通用的數字型別。在大多數 32 位機器上,標準整數型別的取值範圍是-2的31次方到2的31次方減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” 開始。
(3)長整型

        Python長整數型別不能將它和C或其它編譯型語言的長整數型別混淆,C語言的長整數典型的取值範圍是 32 位或 64 位。Python 的長整數型別能表達的數值僅僅與你的機器支援的(虛擬)記憶體大小有關,換句話說,Python 能輕鬆表達很大很大很大的整數。

        長整數型別是標準整數型別的超集,當你的程式需要使用比標準整數型別更大的整數時,長整數型別就有用武之地了。在一個整數值後面加個 L(大寫或小寫都可以),表示這個整數是長整數。這個整數可以是十進位制、八進位制、或十六進位制。一些長整數的例子:16384L -0x4E8L 017L -2147483648l 052144364L 299792458l 0xDECADEDEADBEEFBADFEEDDEAL -5432101234L。
(4)整型和長整型的統一

       這兩種整數型別正在逐漸統一為一種。不遠的將來,至少普通使用者會幾乎感覺不到長整型的存在。必要時整型會悄悄自動轉換為
長整型。當然,那些要呼叫 C 的人仍然可以繼續使用這兩種整數型別,因為C程式碼必須區分不同的整數型別。

3、雙精度浮點數

        Python中的浮點數類似C語言中的double型別,是雙精度浮點數,可以用直接的十進位制或科學計數法表示。每個浮點數佔 8 個位元組(64 位元)完全遵守 IEEE754 號規範,(52M/11E/1S),其中52個位元用於表示底,11個位元用於表示指數(可表示的範圍大約是正負10的308.25次方) 剩下的一個位元表示符號。這看上去相當完美,然而實際精度依賴於機器架構和建立 Python 直譯器的編譯器。
        浮點數值通常都有一個小數點和一個可選的字尾 e(大寫或小寫,表示科學計數法)。在e和指數之間可以用正(+)或負(-)表示指數的正負(正數的話可以省略符號)。一些典型的浮點數值的例子:0.0 4.3e25 3.1416 -777. 1.6 -5.555567119 9.384e-23 -2.172818 float(12) 4.2E-10 -90. 6.022e23 96e3 * 1.0 1.000000001 -1.609E-19。

4、複數

        一個實數和一個虛數的組合構成一個複數。一個複數是一對有序浮點數(x, y)。表示為 x + yj, 其中 x 是實數部分,y 是虛數部分。
        Python語言中有關複數的幾個概念:一、虛數不能單獨存在,它們總是和一個值為0.0的實數部分一起來構成一個複數。二、複數由實數部分和虛數部分構成。三、表示虛數的語法:real+imagj。四、實數部分和虛數部分都是浮點數。五、虛數部分必須有後綴 j或J。一些複數的例子:64.375+1j 4.23-8.5j。
        複數物件擁有資料屬性分別為該複數的實部和虛部。複數還擁有conjugate方法,呼叫它可以返回該複數的共軛複數物件。(兩頭牛背上的架子稱為軛,軛使兩頭牛同步行走。共軛即為按一定的規律相配的一對)。
        複數屬性:
屬性                                  描述
num.real                           該複數的實部
num num.imag                該複數的虛部
num.conjugate()              返回該複數的共軛複數

5、運算子

數值型別可進行多種運算。從標準運算子到數值運算子,甚至還有專門的整數運算子。
(1)混合模式運算子

        當兩個整數相加時,+號表示整數加法,當兩個浮點數相加時,+ 表示浮點數加法。依此類推,在 Python 中,甚至非數字型別也可以使用+運算子。舉例來說,字串A+字串B並不表示加法操作,它表示的是把這兩個字串連線起來, 生成一個新的字串。關鍵之處在於支援+運算子的每種資料型別, 必須告訴 Python,+運算子應該如何去工作。 這也體現了過載概念的具體應用。
        雖然我們不能讓一個數字和一個字串相加,但Python確實支援不同的數字型別相加。當一個整數和一個浮點數相加時,系統會決定使用整數加法還是浮點數加法(實際上並不存在混合運算)。Python使用數字型別強制轉換的方法來解決數字型別不一致的問題,也就是說它會強制將一個運算元轉換為同另一個運算元相同的資料型別。這種操作不是隨意進行的,它遵循基本規則。
        首先,如果兩個運算元都是同一種資料型別,沒有必要進行型別轉換。僅當兩個運算元型別不一致時,Python 才會去檢查一個運算元是否可以轉換為另一型別的運算元。如果可以,轉換它並返回轉換結果。由於某些轉換是不可能的,比如將一個複數轉換為非複數型別,將一個浮點數轉換為整數等等,因此轉換過程必須遵守幾個規則。
        要將一個整數轉換為浮點數,只要在整數後面加個 .0 就可以了。 要將一個非複數轉換為複數,則只需要要加上一個 “0j” 的虛數部分。這些型別轉換的基本原則是:整數轉換為浮點數,非複數轉換為複數。 在Python語言參考中這樣描述 coerce() 方法:如果有一個運算元是複數,另一個運算元被轉換為複數。否則,如果有一個運算元是浮點數,另一個運算元被轉換為浮點數。否則, 如果有一個運算元是長整數,則另一個運算元被轉換為長整數。否則,兩者必然都是普通整數,無須型別轉換

(2)標準型別運算子

標準運算子都可以用於數值型別,包括<、>、<=、>=、==、!=、<>、is、is not、not、and、or。

(3)算術運算子
        Python支援單目運算子正號(+)和負號(-) ,雙目運算子 +、-、*、/、%還有 ** ,分別表示加法、減法、乘法、除法、 取餘和冪運算。從Python2.2起,還增加了一種新的整除運算子//。

        除法: 對整數運算元,會執行“地板除”(floor,取比商小的最大整數。例如5除以2等於2.5,其中“2”就稱為商的“地板”,即“地板除”的結果)。對浮點運算元會執行真正的除法。在未來的Python版本中,Python開發小組已經決定改變/運算子的行為,/ 的行為將變更為真正的除法, 會增加一種新的運算來表示地板除。 下面總結一下Python現在的除法規則,以及未來的除法規則:一、傳統除法,如果是整數除法,傳統除法會捨去小數部分,返回一個整數(地板除)。如果運算元之一是浮點數,則執行真正的除法。二、真正的除法,總是返回真實的商,不管運算元是整數還是浮點數。在未來版本的 Python 中,這將是除法運算的標準行為。現階段通過執行 from __future__ import division 指令,也可以做到這一點。三、地板除從Python 2.2開始,一個新的運算子//已經被增加進來,以執行地板除: // 除法不管運算元何種數值型別,總是捨去小數部分,返回數字序列中比真正的商小的最接近的數字。
        取餘:整數取餘相當容易理解,對於複數取餘的定義類似於浮點數,不同之處在於商僅取其實數部分。
        冪運算:冪運算操作符和一元操作符之間的優先順序關係比較特別,冪運算操作符比其左側運算元的一元操作符優先順序低,比起右側運算元的一元操作符的優先順序高,由於這個特性你會在算術運算子表中找到兩個**。
(4)算術運算子的優先順序依次是:**、正號(+)負號(-)*、/、//、%、+、-。
(5)位運算子(只適用於整數) 

        Python整數支援標準位運算:取反(~),按位與(&),或(|) 及異或(^) 及左移(<<)和右移(>>)。
        Python這樣處理位運算:負數會被當成正數的 2 進位制補碼處理。左移和右移N位等同於無溢位檢查的2的N次冪運算:2**N。對長整數來說, 位運算子使用一種經修改的2進位制補碼形式,使得符號位可以無限的向左擴充套件。取反(~)運算的優先順序與數字單目運算子相同,是所有位操作符中優先順序最高的一個。 左移和右移運算的優先順序次之,但低於加減法運算。與、或、異或運算優先順序最低。

6、內建函式與工廠函式

(1)標準型別函式
        cmp()、str()和type()內建函式,可以用於所有的標準型別。對數字物件來說,這些函式分別比較兩個數的大小,將數字轉換為字串,,以及返回數字物件的型別。
(2)數字型別函式

      Python現在擁有一系列針對數字型別的內建函式。一些函式用於數字型別轉換,另一些則執行一些常用運算。

轉換工廠函式:函式 int(), long(), float() 和 complex() 、bool()用來將其它數值型別轉換為相應的數值型別。
數值工廠函式總結:



功能函式:Python有五個運算內建函式用於數值運算: abs(), coerce(), divmod(), pow(), pow()和 round()。
數值運算內建函式總結:


(3)僅用於整數的函式
       除了適應於所有數值型別的內建函式之外,Python還提供一些僅適用於整數的內建函式(標準整數和長整數)。這些函式分為兩類:一類用於進位制轉換,另一類用於 ASCII 轉換。

       進位制轉換函式:Python整數支援十進位制,也支援八進位制和16進位制整數。 除此之外,Python還提供了兩個內建函式來返回字串表示的8進位制和16進位制整數。它們分別是 oct()和hex()。它們都接受一個整數(任意進位制的)物件,並返回一個對應值的字串物件。
       ASCII 轉換函式:Python也提供了ASCII(美國標準資訊交換碼)碼與其序列值之間的轉換函式。每個字元對應一個唯一的整數(0-255)。對所有使用ASCII表的計算機來說, 這個數值是不變的。這保證了不同系統之間程式行為的一致性。函式chr()接受一個單位元組整數值,返回一個字串,其值為對應的字元。函式ord()則相反,它接受一個字元,返回其對應的整數值。

>>> ord('a')
97
>>> ord('A')
65
>>> chr(97)
'a'
>>> chr(65L)
'A'
僅適用於整數的內建函式:


7、其他數字型別

(1)布林“數”
       從 Python2.3 開始,布林型別新增到了Python中來。儘管布林值看上去是“True”和“False”,但是事實上是整型的子類,對應與整數的 1 和 0。
(2)十進位制浮點數
        十進位制數和其它數值型別一樣,可以使用同樣的算術運算子。十進位制數本質上是一種用於數值計算的特殊類。可以通過字串或其它十進位制數建立十進位制數浮點數,但必須匯入decimal模組。

8、相關模組

       在Python標準庫中有不少專門用於處理數值型別物件的模組,它們增強並擴充套件了內建函式的功能和數值運算的功能。
數字型別相關模組:

模組                                            介紹
decimal                 十進位制浮點運算類 Decimal
array                      高效數值陣列(字元,整數,浮點數等等)
math/cmath           標準C庫數學運算函式,常規數學運算在match模組,複數運算在cmath模組
operator                 數字運算子的函式實現,比如 tor.sub(m,n)等價於m - n
random                  多種偽隨機數生成器
    

三、總結

(1)數字的處理比較繁瑣複雜,先有個整體瞭解,以後進一步加強。
(2)數字型別的相關模組還有很多,可根據實際專案的需求參考網上第三方的包。
(3)random模組包括多個偽隨機數發生器,可以當前的時間戳為隨機數種子。
(4)若有不足,請留言,在此先感謝!