數值型態


在Python中,數值型態有整數、浮點數、布林值與複數,雖然在Python中,所有的資料都是物件,但你可以使用實字(Literal)方式來撰寫表示數值。

在Python 3中,整數就是整數,不再區分整數與長整數,整數的長度不受限制(除了硬體上的限制之外)。直接寫下一個整數值,預設是十進位整數,如果要撰寫二進位實字,則在數字前前0b,如果要撰寫八進位實字,則在數字前置0o,之後接上1到7的數字,如果要撰寫十六進位整數,則以0x開頭,之後接上1到9、A到F。例如:
>>> 10
10
>>> 0b10
2
>>> 0o10
8
>>> 0x10
16
>>>


無論是十進位、八進位或十六進位整數,都是int類別的實例:
>>> type(1)
<class 'int'>
>>> type(0o10)
<class 'int'>
>>> type(0x10)
<class 'int'>
>>>


你可以使用int類別從字串、浮點數、布林值建立整數,使用octhex類別可以將十進位整數以八進位、十六進位表示字串傳回。例如:
>>> int('10')
10
>>> int(3.14)
3
>>> int(True)
1
>>> int(False)
0
>>> oct(10)
'0o12'
>>> hex(10)
'0xa'
>>> 1 + True
2
>>> 2 + False
2
>>>


正如以上所看到的,布林值TrueFalse也可以是代表1與0,為bool的實例,boolint的子類別。事實上,在Python中,數字不是0就是True,而所有物件不是「空」就是True,例如字串'Justin'在判斷式中會是True,而空字串''在判斷式中會是False,所以空串列是False、空字典是False、空Tuple是False,而None也是False(之後還會介紹這些型態)。

當使用字串建構整數時,還可以指定基底。例如:
>>> int('10', 8)
8
>>> int('10', 16)
16
>>> int('10', 2)
2
>>>


浮點數是float的實例,可以使用3.14e-10這樣的表示法,如果兩個整數相除後,結果必須是浮點數時,Python會自動處理。例如:
>>> 10 / 3
3.3333333333333335
>>> 10 // 3
3
>>>


在上例中,/是除法運算子,雖然10與3都是整數,但結果是3.333...的話,就會運算出浮點數結果(在其他語言中,例如Java,結果會是3)。//則會將除法結果的小數部份去掉,%則是取得除法後的餘數。除了/與//之外,+-*等都可以運用在數值上,另外還有**次方運算。例如要計算2的100次方:
>>> 2 ** 100
1267650600228229401496703205376
>>>


使用浮點數,同樣要注意浮點數精度問題,例如:
>>> 1.0 - 0.8
0.19999999999999996
>>> print(1.0 - 0.8)
0.2
>>>


開發人員基本上都要了解CPU處理浮點數的設計原理,在Python中,如果你在指令互動環境中直接顯示運算結果,則會出現0.19999999999999996的結果,如果你使用print()函式,則會出現0.2的結果,這是因為互動環境其實是使用repr()函式來顯示程式開發人員該了解的結果,而print()函式則使用str()函式來顯示較友善、適於非開發人員觀看的結果。例如:
>>> repr(1.0 - 0.8)
'0.19999999999999996'
>>> str(1.0 - 0.8)
'0.2'

>>>

事實上,精度問題確實存在,如果你要精確的結果,那麼可以使用decimal.Decimal類別。例如:
>>> import decimal
>>> a = decimal.Decimal('1.0')
>>> b = decimal.Decimal('0.8')
>>> a - b
Decimal('0.2')

Python支援複數的實字表示,複數是complex類別的實例。例如:
>>> a = 3 + 2j
>>> b = 5 + 3j
>>> c = a + b
>>> c
(8+5j)
>>> type(c)
<class 'complex'>
>>>