資料型別
內建型別
布林
bool
:True
或 False
的布林值。像 and
,or
,not
這樣的邏輯運算可以在布林值上執行。
x or y # if x is False then y otherwise x
x and y # if x is False then x otherwise y
not x # if x is True then False, otherwise True
在 Python 2.x 和 Python 3.x 中,布林值也是一個 int
。bool
型別是 int
型別的子類,True
和 False
是它唯一的例項:
issubclass(bool, int) # True
isinstance(True, bool) # True
isinstance(False, bool) # True
如果在算術運算中使用布林值,則它們的整數值(1
和 0
用於 True
和 False
)將用於返回整數結果:
True + False == 1 # 1 + 0 == 1
True * True == 1 # 1 * 1 == 1
數字
-
int
:整數a = 2 b = 100 c = 123456789 d = 38563846326424324
Python 中的整數具有任意大小。
注意:在舊版本的 Python 中,可以使用
long
型別,這與int
不同。這兩個已經統一了。 -
float
:浮點數; 精度取決於實現和系統架構,對於 CPython,float
資料型別對應於 C double。a = 2.0 b = 100.e0 c = 123456789.e1
-
complex
:複數a = 2 + 1j b = 100 + 10j
當任何運算元是複數時,<
,<=
,>
和 >=
運算子將引發 TypeError
異常。
字串
Python 3.x >= 3.0
str
:一個 unicode 字串。'hello'
的型別bytes
:一個位元組字串。b'hello'
的型別
Python 2.x <= 2.7
str
:一個位元組字串。'hello'
的型別bytes
:str
的同義詞unicode
:一個 unicode 字串。u'hello'
的型別
序列和集合
Python 區分有序序列和無序集合(例如 set
和 dict
)。
-
字串(
str
,bytes
,unicode
)是序列 -
reversed
:具有reversed
功能的str
的逆序a = reversed('hello')
-
tuple
:任何型別的n
值的有序集合(n >= 0
)。a = (1, 2, 3) b = ('a', 1, 'python', (1, 2)) b[2] = 'something else' # returns a TypeError
支援索引; 不可改變的; 如果其所有成員都可以清洗,則可以清洗
-
list
:n
值的有序集合(n >= 0
)a = [1, 2, 3] b = ['a', 1, 'python', (1, 2), [1, 2]] b[2] = 'something else' # allowed
不可洗; 可變的。
-
set
:無序的唯一值集合。物品必須是可清洗的 。a = {1, 2, 'a'}
-
dict
:一組無序的唯一鍵值對; 鍵必須是可以清洗的 。a = {1: 'one', 2: 'two'} b = {'a': [1, 2, 3], 'b': 'a string'}
如果一個物件具有一個在其生命週期內永遠不會改變的雜湊值(它需要一個
__hash__()
方法),並且可以與其他物件進行比較(它需要一個__eq__()
方法),則該物件是可清除的。比較相等性的 Hashable 物件必須具有相同的雜湊值。
內建常量
結合內建資料型別,內建名稱空間中有少量內建常量:
True
:內建式bool
的真正價值False
:內建型別bool
的錯誤值None
:用於表示某個值不存在的單例物件。Ellipsis
或...
:在 Python3 +核心中使用,在 Python2.7 +中作為陣列表示法的一部分使用有限。numpy
和相關軟體包將其用作陣列中的包含所有內容引用。NotImplemented
:用於向 Python 指示特殊方法不支援特定引數的單例,如果可用,Python 將嘗試替代方法。
a = None # No value will be assigned. Any valid datatype can be assigned later
Python 3.x >= 3.0
None
沒有任何自然順序。不再支援使用訂購比較運算子(<
,<=
,>=
,>
)並且將提升 TypeError
。
Python 2.x <= 2.7
None
總是小於任何數字(None < -32
評估為 True
)。
測試變數的型別
在 python 中,我們可以使用內建函式 type
檢查物件的資料型別。
a = '123'
print(type(a))
# Out: <class 'str'>
b = 123
print(type(b))
# Out: <class 'int'>
在條件語句中,可以使用 isinstance
測試資料型別。但是,通常不鼓勵依賴變數的型別。
i = 7
if isinstance(i, int):
i += 1
elif isinstance(i, str):
i = int(i)
i += 1
有關 type()
和 isinstance()
之間差異的資訊,請參閱: Python 中 isinstance 和 type 之間的差異
要測試是否有什麼東西是 NoneType
:
x = None
if x is None:
print('Not a surprise, I just defined x as None.')
在資料型別之間轉換
你可以執行顯式資料型別轉換。
例如,‘123’是 str
型別,可以使用 int
函式將其轉換為整數。
a = '123'
b = int(a)
可以使用 float
函式從浮點字串(例如'123.456’)轉換。
a = '123.456'
b = float(a)
c = int(a) # ValueError: invalid literal for int() with base 10: '123.456'
d = int(b) # 123
你還可以轉換序列或集合型別
a = 'hello'
list(a) # ['h', 'e', 'l', 'l', 'o']
set(a) # {'o', 'e', 'l', 'h'}
tuple(a) # ('h', 'e', 'l', 'l', 'o')
文字定義的顯式字串型別
在引號前面有一個字母標籤,你可以知道要定義的字串型別。
b'foo bar'
:Python 3 中的bytes
,Python 2 中的str
u'foo bar'
:Python 3 中的str
,Python 2 中的unicode
'foo bar'
:結果str
r'foo bar'
:結果所謂的原始字串,其中不需要轉義特殊字元,所有內容都是在你輸入時逐字記錄的
normal = 'foo\nbar' # foo
# bar
escaped = 'foo\\nbar' # foo\nbar
raw = r'foo\nbar' # foo\nbar
可變和不可變資料型別
如果可以更改物件,則稱為 mutable 。例如,當你將列表傳遞給某個函式時,可以更改列表:
def f(m):
m.append(3) # adds a number to the list. This is a mutation.
x = [1, 2]
f(x)
x == [1, 2] # False now, since an item was added to the list
如果無法以任何方式更改物件,則該物件稱為不可變。例如,整數是不可變的,因為沒有辦法改變它們:
def bar():
x = (1, 2)
g(x)
x == (1, 2) # Will always be True, since no function can change the object (1, 2)
請注意,變數本身是可變的,因此我們可以重新分配變數 x
,但這不會改變 x
之前指向的物件。它只讓 x
指向一個新物件。
例項可變的資料型別稱為可變資料型別,類似於不可變物件和資料型別。
不可變資料型別的示例:
int
,long
,float
,complex
str
bytes
tuple
frozenset
可變資料型別的示例:
bytearray
list
set
dict