上一節內容說的是“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