1. 程式人生 > 其它 >Python 3中的數字型別

Python 3中的數字型別

技術標籤:計算機技術# Pythonpython程式語言數字型別數學運算

Python 3中的數字型別


Python中常見的數字型別包括整數int,浮點數float以及複數complex幾種。Python還提供了有理數Fraction以及定點數Decimal的實現。本文通過一些簡單的實驗,來揭示數字型別的用法及其原理。實驗程式碼均在較新的Python 3.8中執行通過。建議開啟Python 3的互動式介面,順序貼上程式碼以檢視執行結果。

type(1)
int
type
(2.5)
float
type(3.2+2j)
complex

整數int

對於整數型別int,可以採用十進位制、二進位制、八進位制和十六進位制表示。二進位制的字首為0b或這0B;八進位制的字首為0o或者0O;十六進位制的字首為0x或者0X。

0b11101111
239
type(0o123)
int
0x123
291

Python提供了不同進位制之間的轉換函式,分別為bin、oct和hex函式。

hex(123456)
'0x1e240'
oct(0x1e240)
'0o361100'
bin(0O361100)
'0b11110001001000000'

在像C語言這樣的程式語言中,能夠表示的整數大小通常受限於系統的儲存位寬。系統如果採用4個位元組也就是32bit來儲存一個整數,那麼能夠表示的最大的無符號整數就是0xFFFFFFFF;如果採用8位元組也就是64bit來儲存,則能表示的最大無符號整數為0xFFFFFFFFFFFFFFFF。超過這個範圍就會發生溢位。但Python裡的整數不一樣,原則上它沒有這個限制,這是因為它內部採用位元組陣列來儲存整數,因此其儲存位寬可以動態分配的。可以用整數物件的bit_length()方法來得到儲存整數的位寬,從下面的例子可以看到,它可以支援超過64bit的整數及其運算。

(200).bit_length()
8
0xAAAA0000AAAA0000AA.bit_length()
72
0xFFFFFFFFFFFFFFFFFFFFFFFF+1
79228162514264337593543950336
x = 1
for i in range(1,100):
    x = x * i
x.bit_length()
519

正是由於Python內部採用位元組陣列來儲存整數,因此整數和位元組串bytes之間可以很容易地轉換。整數int類提供了to_bytes和from_bytes方法。在轉換為位元組串bytes時,如果時可列印字元則顯示可列印字元,只有不可列印字元才以\x的十六進位制形式顯示。

int().from_bytes(b'\xde\xad\xbe\xef', byteorder='big')
3735928559
_.to_bytes(length=4, byteorder='big')
b'\xde\xad\xbe\xef'
0x31323334.to_bytes(length=4, byteorder='little')
b'4321'

Python這麼設計的好處是易用,程式設計人員不用再擔心溢位問題了,平時能夠用到的數都可以直接表示。但缺點是效能可能會稍低,因此某些特定領域的計算庫,為了提升效能,都會使用自己的的數字型別而非Python內建型別。

浮點數float

浮點數有兩種表示形式,小數和指數。指數形式指數前面為字母e或者E。

type(3.14)
float
type(3.0e8)
float

浮點數字面值(literal)物件只能用十進位制來表示,不能用其它進製表示。但是浮點數物件(包括字面值物件)都可以呼叫hex()方法轉換成十六進位制,也可以呼叫fromhex()方法將一個表示十六進位制浮點數的字串轉換為十進位制的浮點數。

(1.25).hex()
'0x1.4000000000000p+0'
float().fromhex('0x1.0p-2')
0.25

浮點數的範圍跟系統有關,可從sys模組的float_info獲取。

import sys
print(sys.float_info)
sys.float_info(max=1.7976931348623157e+308, max_exp=1024, max_10_exp=308, min=2.2250738585072014e-308, min_exp=-1021, min_10_exp=-307, dig=15, mant_dig=53, epsilon=2.220446049250313e-16, radix=2, rounds=1)

在math模組中,定義了一些數學上的常數,如℮,