Python 數值型別 int,float,complex 使用說明
訂閱 480
Python 數值型別
Python 提供了三種資料型別來表示數值,他們是整數型別int,浮點數型別float,以及複數型別complex。
如何判斷變數,物件,執行個體是否為數值型別?
要判斷一個變數(嚴格來說是指變數儲存的值),物件,執行個體是否為有效的數值型別,可以使用isinstance函式,因為numbers模組的Number類別是int,float,complex型別的抽象基底類別。你可以為isinstance函式的第二參數傳遞int,float,complex或Number,以判斷目標是否為整數型別,浮點數型別,複數型別或數值型別。
Python 判斷物件是否為數值型別、int、float、complex影片示範 YouTube
from numbers import Number
isinstance(12.1232, Number)
True
isinstance(1.1, int)
False布林值是否為數值型別?
布林型別bool是int的衍生類別,因此bool也是一種「數值型別」,只不過他用於描述真假狀態,而不是數值。當使用isinstance函式判斷True或False是否為Number或int的執行個體時,得到的結果為True。
from numbers import Number
isinstance(True, Number)
True
isinstance(False, int)
True使用底線分隔數值中的數位
在 Python 中,你可以為數值的常值加入底線(_),以使其更容易被觀察,比如0b_1000_1010。需要指出,底線只能放在前綴(0b,0x)以及數值的數位之間,以下書寫均不正確,0_b1000,12_3_,_0xA9。
布林型別
要想了解 Python 布林型別,你可以檢視Python 布林型別 bool 使用說明一節。
Python 數值型別的隱含轉換優先順序
在某些特定條件下,比如算術運算,不同的數值型別會發生隱含轉換,其中complex型別的優先順序最高,int型別的優先順序最低,優先順序較低的型別將隱含轉換為優先順序較高的型別。
在互動模式中,我們將浮點數型別的1.23456與整數型別的123相加,計算的結果將是一個浮點數型別的值。
result = 1.23456 + 123
type(result)
<class 'float'>int 型別
Python 中的整數型別int用於表示整數,在其有效的取值範圍內,int型別的精確度不受限製,這使得他可以精準的表達每一個數值,不會出現近似值。
以下是一些本節沒有特別說明的int型別的方法。
- bit_length 方法
int型別的bit_length方法,用於取得一個整數在二進位形式下的精確度。比如,(-111).bit_length()的結果為7,因為,-111的二進位形式為-0b1101111,1101111的精確度為7。- bit_count 方法
int型別的bit_count方法,用於取得一個整數二進位形式中的1的個數。比如,(-111).bit_count()的結果為6,因為,-111的二進位形式為-0b1101111,1101111中1的個數為6。
int 型別的取值範圍是多少?
在 Python3 中,int整數型別的取值範圍是不確定的,當電腦依然擁有可分配的資源時,int型別的取值可以趨近於無限,這類似於 JavaScript 中的BigInt。
如何在 Python 中書寫二進位,八進位,十六進位格式的整數?
書寫的二進位格式整數,需要具有前綴0b,比如0b1001。書寫的八進位格式整數,需要具有前綴0o,比如0o777。書寫的十六進位格式整數,需要具有前綴0x,比如0xA123。
需要指出的是,以上方法不適用於浮點數型別和複數型別,書寫類似於0b1111.0001這樣的數值將導致錯誤。
轉換 int 型別與 bytes 型別
使用int型別提供的to_bytes和from_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參數是需要轉換為int的bytes執行個體。
(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)
-1234float 型別
Python 中的浮點數型別float符合 IEEE 754 二進位浮點數標準,因此可利用采用相同標準的浮點數硬體來升階運算效率,當然,這裏有個繞不開的老問題,二進位浮點數的不準確性。
float型別允許使用類似於1.23e+2,1.23e-5這樣的科學計數法,其中+可以省略,+和-兩邊不能有空格。
二進位浮點數不準確
想要深入了解二進位浮點數的不準確問題,你可以檢視程式設計指南的為何二進位浮點數不準確?IEEE 754 二進位浮點數拾入規則一節。
如何判斷 float 型別是否能夠轉換為等價的 int 型別?
使用float型別的is_integer方法,可以判斷浮點數能否被轉換為等價的整數。由於具有近似性,浮點數表示的數值可能並非你書寫的常值,或你認為的計算結果,因此is_integer方法的存在是有意義的。int型別也擁有is_integer方法,但他總是傳回True。
Python 判斷 float 能否轉換為等價的 int影片示範 YouTube
下面互動模式中的浮點數常值1.00000000000000000000001,其小數部分會被忽略,因此實際儲存的浮點數等價於1,is_integer方法傳回True。
(1.00000000000000000000001).is_integer()
Truecomplex 型別
Python 中的complex型別用於表示複數,複數由實數和虛數兩部分組成,其中虛數對應了不存在,整個複數需要使用類似於1.23+4.56j,12-34j的形式來表示,其中+或-的左邊為實數部分,+或-和其右邊為采用j標記的虛數部分,+或-的兩邊不能有空格。當然,複數也可以被書寫為僅保留虛數部分的形式,比如4.56j。
另外,無論是實數部分還是虛數部分,都可以使用科學計數法,比如1.2e+10+3.4e-5j。
如何取得複數的實數或虛數部分?
使用complex型別的唯讀屬性real和imag,可以分別取得複數的實數和虛數部分,比如,(1-2.34j).imag的運算結果為-2.34。int和float型別也擁有real和imag屬性,但他們的imag屬性只會傳回0和0.0,並且int的real和imag屬性的型別為int。
如何取得複數的共軛複數?
使用complex型別的conjugate方法,可以取得複數的共軛複數,比如,(12+34j).conjugate()的傳回結果為(12-34j)。雖然int和float型別也擁有conjugate方法,但由於沒有虛數部分,因此該方法對於他們不具備實際效果。
在互動模式中,我們對複數a和b執行加法運算,計算方法為將實數和虛數部分分別相加。
a = 1+1j
b = 1.23e+2+1.23e-2j
a + b
(124+1.0123j)
a.conjugate()
(1-1j)轉換 Python 數值型別與字串型別
你可以使用str型別的建構子將數值型別的值轉換為字串型別的值,字串對應的數值為十進位,或者使用int,float或complex型別的建構子將字串型別的值轉換為數值型別的值,字串不能包含空格,float和complex的建構子接受科學計數法。
對於float和complex型別的值,str建構子可能會將其轉換為包含科學計數法的字串。
str(0.0000012222)
'1.2222e-06'
str(1.23e-4)
'0.000123'
float('1.23e-4')
0.000123此外,bin,oct,hex函式可將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 中的數值轉換為分數形式
對於int和float型別,可以使用as_integer_ratio方法,將其對應的數值轉換為分數表達形式,分數的分子和分母會被放入一個元組,並作為結果傳回。
(123).as_integer_ratio()
(123, 1)
(0.5).as_integer_ratio()
(1, 2)取得 Python 數值的絕對值
使用函式abs可以取得數值的絕對值,比如,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