URLhttps://learnscript.net/zh-hant/python/data-types/numeric-types/
    複製連結移至說明  範例

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

    閱讀 11:35·字數 3479·發佈 
    Youtube 頻道
    訂閱 375

    Python 數值型別

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

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

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

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

    布林值是否為數值型別?

    布林型別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 數值型別的隱含轉換優先順序

    在某些特定條件下,比如算術運算,不同的數值型別會發生隱含轉換,其中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的二進位形式為-0b11011111101111的精確度為7

    bit_count 方法

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

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

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

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

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

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

    轉換 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

    float 型別

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

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

    二進位浮點數不準確

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

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

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

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

    (1.00000000000000000000001).is_integer()
    True

    complex 型別

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

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

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

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

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

    使用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 中的數值轉換為分數形式

    對於intfloat型別,可以使用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