Python Number型別及用法(超級詳細)

2020-07-16 10:05:25
資料型別是一種程式語言的重要組成部分。Python 內建的基本資料型別主要有:Number(數值)、Bool(布林)、String(字串)、List(列表)、Tuple(元組)、Set(集合)、Dictionary(字典)等。本節教學先對Number型別進行講解,Bool 布林型別下節介紹。

Python 3.X 中的 Number 型別包括 int(整型)、float(浮點型)和 complex (複數)三種。通常,定義數值型變數並賦值可以一步完成,例如:

a = 123
b = -123


在 Python 環境中可以使用以下程式碼檢視當前計算機可以使用的 int 型別的最大值:

import sys
print(sys.maxsize)

上述程式碼在 Windows 7 SP1 和 MacOS HighSierra 10.13.3 上的執行結果如下所示:

>>> import sys
>>> print(sys.maxsize)
9223372036854775807

需要注意的是,在 Python 2.X 中使用 sys.maxint 來檢視當前計算機可以使用的 int 型別的最大值。

Python 的 float 型別浮點數用機器上浮點數的本機雙精度(64bit)表示。和 C語言的 Double 型別相同,float 型別提供大約 17 位的精度以及從 -308 到 308 的指數。Python 不支援 32 位的單精度浮點數。如果程式需要精確控制區間和數位精度,可以考慮使用 numpy 模組。在 Python 3.X 中浮點數預設是 17 位精度。

關於單精度和雙精度:C語言中浮點型分為單精度和雙精度兩種。單精度使用 float 定義,雙精度使用 double 定義。在 Turbo C 中單精度型占 4 個位元組(32 位)記憶體空間,其數值範圍為 3.4×10-38~3.4×1038,只能提供七位有效數位。雙精度型占 8 個位元組(64 位)記憶體空間,其數值範圍為 1.7×10-308~1.7×10308,可提供 16 位有效數位。

int 型和 float 型數值可以直接進行加減乘除、乘方和取餘等運算,例如:

5 + 4           #加法
4.3 - 2         #減法
3 * 7            #乘法
2 / 4            #除法,得到一個浮點數
2 // 4           #除法,得到一個整數
17 % 3         #取餘
2 ** 5           #乘方

上述程式碼的執行結果如下所示:

>>> 5 + 4
9
>>> 4.3 - 2
2.3
>>> 3 * 7
21
>>> 2 / 4
0.5
>>> 2 // 4
0
>>> 17 % 3
2
>>> 2 ** 5
32

需要注意的是,單除號/除法總是返回一個浮點數,要獲取整數結果應使用雙除號//操作符。在混合計算時,Python 會將整數轉換成為浮點數。

在實際工作中會遇到需要使用更高精度(超過 17 位小數)的情況,可以使用 decimal 模組,配合 getcontext( ) 函數使用。例如:

from decimal import *
print(getcontext ())
getcontext().prec = 50
print(Decimal(1)/Decimal(9))
print(Decimal(1)/Decimal(19))
print(float(Decimal(1)/Decimal(19)))

上述程式碼執行結果如下所示:

>>> from decimal import *
>>> print(getcontext ())
Context(prec=28, rounding=ROUND_HALF_EVEN, Emin=-999999, Emax=999999, capitals=1, clamp=0, flags=[], traps=[InvalidOperation, DivisionByZero, Overflow])
>>> getcontext().prec = 50
>>> print(Decimal(1)/Decimal(9))
0.11111111111111111111111111111111111111111111111111
>>> print(Decimal(1)/Decimal(19))
0.052631578947368421052631578947368421052631578947368
>>> print(float(Decimal(1)/Decimal(19)))
0.05263157894736842


在具體工作中,很多時候需要將精度高的 float 型數值轉換為精度低的數值,通俗來說就是“四捨五入”,捨棄小數點右邊的部分資料。在 Python 中通常使用內建的 round( ) 函數完成,例如執行:

round(1.5)

將得到結果“2”。但 round( ) 函數對於內建的資料型別而言,執行結果往往並不像所期待的那樣,如果只有一個數作為引數,當不指定位數的時候,返回的是一個整數,而且是最靠近的整數(類似四捨五入)。

但是當出現“.5”的時候,兩邊的距離都一樣,round( ) 取靠近的偶數。例如執行:

round(2.5)
round(2.675)

上述程式碼執行結果為:

>>> round(2.5)
2
>>> round(2.675)
3


對於指定保留小數位數的情況,如果要捨棄的部分最左側是“5”,且“5”左側是奇數則直接捨棄,若“5”左側是偶數則向上取整,例如執行:

round(2.635, 2)
round(2.645, 2)
round(2.655, 2)
round(2.665, 2)
round(2.675, 2)

上述程式碼的執行結果為:

>>> round(2.635, 2)
2.63
>>> round(2.645, 2)
2.65
>>> round(2.655, 2)
2.65
>>> round(2.665, 2)
2.67
>>> round(2.675, 2)
2.67


除了 round( ) 函數,math 模組中的 ceil( ) 和 floor( ) 函數也可以實現向上或向下取整。例如:

from math import ceil, floor
round(2.5)
ceil(2.5)
floor(2.5)
round(2.3)
ceil(2.3)
floor(2.3)

上述程式碼的執行結果下所示:

>>> from math import ceil, floor
>>> round(2.5)
2
>>> ceil(2.5)
3
>>> floor(2.5)
2
>>> round(2.3)
2
>>> ceil(2.3)
3
>>> floor(2.3)
2


Python 使用 complex( ) 函數建立複數。其引數可以接受數值或字串,例如:

print(complex(1))         #只有實部1
print(complex(1, 2))     #實部為1,虛部為 2
print(complex('1+2j'))  #實部為1,虛部為 2

上述程式碼的執行結果為:

>>> print(complex(1))
(1+0j)
>>> print(complex(1, 2))
(1+2j)
>>> print(complex('1+2j'))
(1+2j)


第二個引數不能傳入字串。當希望從一個字串的複數形式轉換複數時,需要注意的是字串中不能出現空格,比如可以寫成:

complex('1+2j')

而不能寫成

complex('1    +2j')

complex('1    +       2j')

否則會返回 ValueError 異常。