Python 數值型別 int,float,complex 使用說明

閱讀 11:55·字數 3576·發佈 
Youtube 頻道
訂閱 130

Python 數值型別

Python 提供了三種資料型別來表示數值,他們是整數型別int,浮點數型別float,以及複數型別complex

如何判斷 Python 變數,物件,執行個體是否為數值型別?

要判斷一個 Python 變數(嚴格來說是指變數儲存的值),物件,執行個體是否為有效的數值型別,可以使用isinstance函式,因為numbers模組的Number類別是intfloatcomplex型別的抽象基底類別。你可以為isinstance函式的第二參數傳遞intfloatcomplexNumber,以判斷目標是否為整數型別,浮點數型別,複數型別或數值型別。

from numbers import Number
isinstance(12.1232, Number)
True
isinstance(1.1, int)
False

Python 中的布林值是否為數值型別?

Python 的布林型別boolint的衍生類別,因此bool也是一種“數值型別”,只不過他用於描述真假狀態,而不是數值。當使用isinstance函式判斷TrueFalse是否為Numberint的執行個體時,得到的結果為True

from numbers import Number
isinstance(True, Number)
True
isinstance(False, int)
True

使用底線分隔數值中的數位

在 Python 中,你可以為數值的常值加入底線(_),以使其更容易被觀察,比如0b_1000_1010。需要指出,底線只能放在首碼(0b0x)以及數值的數位之間,以下書寫均不正確,0_b100012_3__0xA9

布林型別

要想了解 Python 布林型別,你可以檢視Python 布林型別 bool 使用說明一節。

Python 數值型別的隱含轉換優先順序

在某些特定條件下,比如算術運算,不同的 Python 數值型別會發生隱含轉換,其中complex型別的優先順序最高,int型別的優先順序最低,優先順序較低的型別將隱含轉換為優先順序較高的型別。

在互動模式中,我們將浮點數型別的1.23456與整數型別的123相加,計算的結果將是一個浮點數型別的值。

result = 1.23456 + 123
type(result)
<class 'float'>

Python int 型別

Python 中的整數型別int用於表示整數,在其有效的取值範圍內,int型別的有效位數不受限製,這使得他可以精準的表達每一個數值,不會出現近似值。

以下是一些本節沒有特殊描述的int型別的方法。

bit_length 方法

int型別的bit_length方法,用於取得一個整數在二進位形式下的有效位數。比如,(-111).bit_length()的結果為7,因為,-111的二進位形式為-0b11011111101111的有效位數為7

bit_count 方法

int型別的bit_count方法,用於取得一個整數二進位形式中的1的個數。比如,(-111).bit_count()的結果為6,因為,-111的二進位形式為-0b110111111011111的個數為6

Python int 型別的取值範圍是多少?

在 Python3 中,int整數型別的取值範圍是不確定的,當電腦依然擁有可分配的資源時,int型別的取值可以趨近於無限大,這類似於 JavaScript 中的BigInt

如何在 Python 中書寫二進位,八進位,十六進位格式的整數?

Python 中書寫的二進位格式整數,需要具有首碼0b,比如0b1001。Python 中書寫的八進位格式整數,需要具有首碼0o,比如0o777。Python 中書寫的十六進位格式整數,需要具有首碼0x,比如0xA123

需要指出的是,以上方法不適用於浮點數型別和複數型別,書寫類似於0b1111.0001這樣的數值將導致錯誤。

轉換 Python int 型別與 bytes 型別

使用int型別提供的to_bytesfrom_bytes方法,你可以將int型別的值轉換為一個bytes執行個體,或將一個bytes執行個體轉換為int型別的值。

to_bytes(length=1, byteorder='big', *, signed=False)
int.from_bytes(bytes, byteorder='big', *, signed=False)

length 參數

length參數預設為1,他決定了bytes執行個體的長度,當bytes不足以容納被轉換的整數時,將引發例外狀況OverflowError

byteorder 參數

byteorder參數用於決定整數轉換後在bytes中的儲存順序,其預設值為'big',他表示整數的高位在序列的左邊,如果設定為'little',則整數的高位在序列的右邊。

signed 參數

signed參數用於決定是否采用補數表示整數,預設為False,如果目標是負數,則需要設定為True

bytes 參數

bytes參數是需要轉換為intbytes執行個體。

(1234).to_bytes(4)
b'\x00\x00\x04\xd2'
(1234).to_bytes(4, 'little')
b'\xd2\x04\x00\x00'
int.from_bytes(b'\xd2\x04\x00\x00', 'little')
1234
(-1234).to_bytes(4, signed=True)
b'\xff\xff\xfb.'
int.from_bytes(b'\xff\xff\xfb.', signed=True)
-1234

Python float 型別

Python 中的浮點數型別float符合 IEEE 754 二進位浮點數標準,因此可利用采用相同標準的浮點數硬體來升階運算效率,當然,這裏有個繞不開的老問題,二進位浮點數的不準確性。

float型別允許使用類似於1.23e+21.23e-5這樣的科學運算質,其中+可以省略,+-兩邊不能有空格。

二進位浮點數不準確

想要深入了解二進位浮點數的不準確問題,你可以檢視程式設計指南為何二進位浮點數不準確?IEEE 754 二進位浮點數拾入規則一節。

如何判斷 Python float 型別是否能夠轉換為等價的 int 型別?

使用float型別的is_integer方法,可以判斷浮點數能否被轉換為等價的整數。由於具有近似性,浮點數表示的數值可能並非你書寫的常值,或你認為的計算結果,因此is_integer方法的存在是有意義的。Python 的int型別也擁有is_integer方法,但他總是傳回True

下面互動模式中的浮點數常值1.00000000000000000000001,其小數部分會被忽略,因此實際儲存的浮點數等價於1is_integer方法傳回True

(1.00000000000000000000001).is_integer()
True

Python complex 型別

Python 中的complex型別用於表示複數,複數由實數和虛數兩部分組成,其中虛數對應了不存在,整個複數需要使用類似於1.23+4.56j12-34j的形式來表示,其中+-的左邊為實數部分,+-和其右邊為采用j標記的虛數部分,+-的兩邊不能有空格。當然,複數也可以被書寫為僅保留虛數部分的形式,比如4.56j

另外,無論是實數部分還是虛數部分,都可以使用科學運算質,比如1.2e+10+3.4e-5j

如何取得 Python 複數的實數或虛數部分?

使用complex型別的唯讀屬性realimag,可以分別取得複數的實數和虛數部分,比如,(1-2.34j).imag的運算結果為-2.34intfloat型別也擁有realimag屬性,但他們的imag屬性只會傳回00.0,並且intrealimag屬性的型別為int

如何取得 Python 複數的共軛複數?

使用complex型別的conjugate方法,可以取得複數的共軛複數,比如,(12+34j).conjugate()的傳回結果為(12-34j)。雖然intfloat型別也擁有conjugate方法,但由於沒有虛數部分,因此該方法對於他們不具備實際效果。

在互動模式中,我們對複數ab執行加法運算,計算方法為將實數和虛數部分分別相加。

a = 1+1j
b = 1.23e+2+1.23e-2j
a + b
(124+1.0123j)
a.conjugate()
(1-1j)

轉換 Python 數值型別與字串型別

你可以使用str型別的建構子將數值型別的值轉換為字串型別的值,字串對應的數值為十進位,或者使用intfloatcomplex型別的建構子將字串型別的值轉換為數值型別的值,字串不能包含空格,floatcomplex的建構子接受科學運算質。

對於floatcomplex型別的值,str建構子可能會將其轉換為包含科學運算質的字串。

str(0.0000012222)
'1.2222e-06'
str(1.23e-4)
'0.000123'
float('1.23e-4')
0.000123

此外,binocthex函式可將int型別的值轉換為二進位,八進位或十六進位的數值字串,float型別的hex方法可將浮點數轉換為十六進位的數值字串,他可能類似於'0x3.a7p10',其中p用於標記指數。hex方法建置的字串,可通過float型別的fromhex方法重新轉換為浮點數。

bin(1234)
'0b10011010010'
(1.234).hex()
'0x1.3be76c8b43958p+0'
float.fromhex('0x1.3be76c8b43958p+0')
1.234

文字/字串型別

如果你希望了解如何判斷字串是否為數值,可以檢視判斷 Python 字串是否為字母或數值一段。

將 Python 中的數值轉換為分數形式

對於 Python 的intfloat型別,可以使用as_integer_ratio方法,將其對應的數值轉換為分數表達形式,分數的分子和分母會被放入一個 Python 元組,並作為結果傳回。

(123).as_integer_ratio()
(123, 1)
(0.5).as_integer_ratio()
(1, 2)

取得 Python 數值的絕對值

使用函式abs可以取得 Python 數值的絕對值,比如,abs(-100)的結果為100。需要說明的是,abs函式不適用於複數,他可能會傳回一些莫名其妙的值,比如abs(-100+123j)的結果可能是158.52129194527782

程式碼

check_numeric_types.ipynb·codebeatme/python·GitHub
check_if_float_types_are_integer_types.ipynb·codebeatme/python·GitHub

講解影片

如何判斷 Python 物件是否為數值型別,整數型別 int,浮點數型別 float 或複數型別 complex·YouTube
如何判斷 Python 浮點數型別 float 能否轉換為等價整數型別 int·YouTube