Python 數值型別 int,float,complex 使用說明
Python 數值型別
Python 提供了三種資料型別來表示數值,他們是整數型別int
,浮點數型別float
,以及複數型別complex
。
如何判斷 Python 變數,物件,執行個體是否為數值型別?
要判斷一個 Python 變數(嚴格來說是指變數儲存的值),物件,執行個體是否為有效的數值型別,可以使用isinstance
函式,因為numbers
模組的Number
類別是int
,float
,complex
型別的抽象基底類別。你可以為isinstance
函式的第二參數傳遞int
,float
,complex
或Number
,以判斷目標是否為整數型別,浮點數型別,複數型別或數值型別。
from numbers import Number
isinstance(12.1232, Number)
True
isinstance(1.1, int)
False
如何判斷 Python 物件是否為數值型別,整數型別 int,浮點數型別 float 或複數型別 complex更多程式碼與講解 YouTube
Python 中的布林值是否為數值型別?
Python 的布林型別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 數值型別的隱含轉換優先順序
在某些特定條件下,比如算術運算,不同的 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
的二進位形式為-0b1101111
,1101111
的有效位數為7
。- bit_count 方法
int
型別的bit_count
方法,用於取得一個整數二進位形式中的1
的個數。比如,(-111).bit_count()
的結果為6
,因為,-111
的二進位形式為-0b1101111
,1101111
中1
的個數為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_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)
-1234
Python float 型別
Python 中的浮點數型別float
符合 IEEE 754 二進位浮點數標準,因此可利用采用相同標準的浮點數硬體來升階運算效率,當然,這裏有個繞不開的老問題,二進位浮點數的不準確性。
float
型別允許使用類似於1.23e+2
,1.23e-5
這樣的科學運算質,其中+
可以省略,+
和-
兩邊不能有空格。
二進位浮點數不準確
想要深入了解二進位浮點數的不準確問題,你可以檢視程式設計指南的為何二進位浮點數不準確?IEEE 754 二進位浮點數拾入規則一節。
如何判斷 Python float 型別是否能夠轉換為等價的 int 型別?
使用float
型別的is_integer
方法,可以判斷浮點數能否被轉換為等價的整數。由於具有近似性,浮點數表示的數值可能並非你書寫的常值,或你認為的計算結果,因此is_integer
方法的存在是有意義的。Python 的int
型別也擁有is_integer
方法,但他總是傳回True
。
下面互動模式中的浮點數常值1.00000000000000000000001
,其小數部分會被忽略,因此實際儲存的浮點數等價於1
,is_integer
方法傳回True
。
(1.00000000000000000000001).is_integer()
True
如何判斷 Python 浮點數型別 float 能否轉換為等價整數型別 int更多程式碼與講解 YouTube
Python complex 型別
Python 中的complex
型別用於表示複數,複數由實數和虛數兩部分組成,其中虛數對應了不存在,整個複數需要使用類似於1.23+4.56j
,12-34j
的形式來表示,其中+
或-
的左邊為實數部分,+
或-
和其右邊為采用j
標記的虛數部分,+
或-
的兩邊不能有空格。當然,複數也可以被書寫為僅保留虛數部分的形式,比如4.56j
。
另外,無論是實數部分還是虛數部分,都可以使用科學運算質,比如1.2e+10+3.4e-5j
。
如何取得 Python 複數的實數或虛數部分?
使用complex
型別的唯讀屬性real
和imag
,可以分別取得複數的實數和虛數部分,比如,(1-2.34j).imag
的運算結果為-2.34
。int
和float
型別也擁有real
和imag
屬性,但他們的imag
屬性只會傳回0
和0.0
,並且int
的real
和imag
屬性的型別為int
。
如何取得 Python 複數的共軛複數?
使用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 中的數值轉換為分數形式
對於 Python 的int
和float
型別,可以使用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