【轉】Python資料型別之“數字(numerics)”

上一節內容說的是“Python基本語法”,本節主要講下Python中的資料型別。

儲存在記憶體中的資料通常有兩個屬性:

  • 在記憶體中的存放位置:這個存放位置通過變數名可以找到;
  • 在記憶體中的存放方式:這個由資料型別決定,如佔幾個位元組的空間、佔用空間是否需要連續等。

Python中有很多內建型別(built-in types),內建型別可以理解為構建在Python Interpreter(Python直譯器)裡面的型別。Python中主要的內建型別有以下幾種:

  • numerics(數字):int、float、complex、bool
  • sequences(序列/有序集合): str、list、tuple、range
  • sets(無序集合):set
  • mappings(對映):dict
  • classes(類)
  • instance(例項)
  • exceptions(異常)

我們主要說下numberics、sequences、sets 和 mappings這四種內建資料型別。為了避免篇幅過長,我們將對它們分別進行說明。

數字型別(numerics)


Python3 中的數字支援int(整型)、float(浮點型)、complex(複數)。Python文件中bool(布林值)不屬於數字型別,但是這裡也把bool型別放在這裡來說,因為bool是int的子類。就像大多是語言一樣,Python中的資料型別也是很直觀的。我們通過Python內建的type()函式可以檢視變數所致的物件型別:

a = 10  # 整型
b = 1.5 # 浮點型
c = True # 布林型
d = 5+2j # 複數 # 也可以同時給多個變數賦值
# a, b, c, d = 10, 1.5, True, 5+2j print(type(a), type(b), type(c), type(d))

輸出結果:

<class 'int'> <class 'float'> <class 'bool'> <class 'complex'>

說明

Python2 中的數字型別還包括一個long(長整型),且會自動將超過整型長度的數字轉換為長整型(數字最後加上L字母表示長整形)。但是Python3中已經沒有long型別了,int和long都叫整型(int)。

bool(布林型)之所以屬於數字型別,是因為bool是int的子類。

1. 強制型別轉換

顧名思義,強制型別轉換就是把一個數據型別強制轉換為另一資料型別。這裡,我們先說下數字型別(int、float、bool、complex)間的相互轉換。

int與bool型別

在Python直譯器的互動式終端通過help(bool)可以檢視bool類的完整定義,會發現bool是int型別的子類。另外bool型別只有兩個值:True和False,因此bool與int型別的值必然存在某種關聯。

>>> int(True)
1
>>> int(False)
0
>>> bool(1)
True
>>> bool(-1)
True
>>> bool(0)
False

結論:

  • bool 轉 int時, Ture->1, False->0
  • int 轉 bool時, 非0->True, 0->False

int、bool與float型別

bool型別可以看作一個特殊的int型別

>>> float(5)
5.0
>>> float(True)
1.0
>>> float(False)
0.0
>>> int(5.0)
5
>>> bool(5.0)
True
>>> bool(0.0)
False

int、bool、float與complex

>>> complex(5)
(5+0j)
>>> complex(5.0)
(5+0j)
>>> complex(True)
(1+0j)
>>> complex(False)
0j
>>> bool((5+0j))
True
>>> bool((0+0j))
False
>>> int((5+0j))
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: can't convert complex to int
>>> float((5+0j))
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: can't convert complex to float

結論:complex型別 不能強制轉換為 int 和 float型別

2. 自動型別轉換

自動型別轉換是指兩個不同型別的運算元參與運算時,Python會先按照以下規則先對其中一個運算元進行自動型別轉換,然後再進行運算。

  • 如果有一個運算元是複數,另一個運算元會被轉換為複數
  • 否則,如果有一個運算元是浮點型,另一個運算元會被轉換為浮點型
  • (Python 2)否則,如果有一個運算元是長整形,另一個運算元會被轉換為長整型
  • 否則,如果有一個是整型,另一個是布林型,則布林型會被轉換為整型0或1
  • 否則,兩個都是相同資料型別,無需型別轉換
>>> 2 + (5+2j)  # 整型轉複數
(7+2j)
>>> 2.0 + (5+2j) # 浮點型轉複數
(7+2j)
>>> True + (5+2j) # 布林型轉複數
(6+2j)
>>> 2 + 5.0 # 整型轉浮點型
7.0
>>> True + 5.0 # 布林型轉浮點型
6.0
>>> True + 2 # 布林型轉整型
3