一般,定義數據類型的格式都是爲了設置數據的上限和下限,以便程序能夠很好利用。可是,在 Python 中不須要聲明變量就可讓變量持有數據類型,這種功能叫做動態類型。python
Python 解釋器在運行時會根據語法肯定變量的類型。例如,引號(' ')表明聲明字符串值,方括號([ ])表明聲明列表,大括號({ })表明聲明字典,非小數表明整數(Integer)類型,帶小數點表明浮點數(float)類型。編程
Python 中的全部變量、函數和模塊都是對象,即萬物皆對象。數組
下面是 Python 中主要的數據類型:緩存
幾乎全部的編程語言都有布爾值,布爾值中有兩個值,分別是 True 和 False,這些值都是常量,主要用來作賦值和比較操做。例如:網絡
condition = False
if condition == True:
print("You can continue with the prpgram.")
else:
print("The program will end here.")
複製代碼
輸出的結果是什麼取決於這條語句:數據結構
if condition:
複製代碼
能夠理解成:app
if condition == True:
複製代碼
其實,Python 表達式也能產生布爾值的結果。socket
例如,條件表達式執行完後會產生一個布爾值,那麼 Python 就會評估表達式和上下文關係建立布爾值。編程語言
因爲 Python 具備許多數據結構,所以它們將使用本身的規則進行操做以在布爾值上下文你中查找結果。函數
>>> str = "Learn Python"
>>> len(str)
12
>>> len(str) == 12
True
>>> len(str) != 12
False
複製代碼
某些狀況下,布爾常量 True 和 False 也能夠用做數字。
>>> A, B = True + 0, False + 0
>>> print(A, B)
1 0
>>> type(A), type(B)
(<class 'int'>, <class 'int'>)
複製代碼
能夠看到,True 能做爲 1,False 能做爲 0,它們在進行算術運算時能被用做數字計算。
數字是程序中運用最多的數據類型,Python 不只有整數和浮點數類型,還引入了 complex(複數) 做爲一種新型的數字類型。
還須要知道幾點:
j
或 J
表示複數值。例如:
num = 2
print("The number (", num, ") is of type", type(num))
num = 3.0
print("The number (", num, ") is of type", type(num))
num = 3+5j
print("The number ", num, " is of type", type(num))
print("The number ", num, " is complex number?", isinstance(3+5j, complex))
複製代碼
輸出結果:
The number ( 2 ) is of type <class 'int'>
The number ( 3.0 ) is of type <class 'float'>
The number (3+5j) is of type <class 'complex'>
The number (3+5j) is complex number? True
複製代碼
>>> complex(1.2, 5)
(1.2+j)
複製代碼
>>> import sys
>>> sys.maxsize
9223372036854775807
複製代碼
>>> num = 1234567890123456789
>>> num.bit_length()
61
>>> num
1234567890123456789
>>> num = 1234567890123456789123456789012345678912345678901234567891234567890123456789
>>> num.bit_length()
250
>>> num
1234567890123456789123456789012345678912345678901234567891234567890123456789
複製代碼
>>> import sys
>>> sys.float_info
sys.float_info(max=1.7976931348623157e+308, max_exp=1024, max_10_exp=308, min=2.2250738585072014e-308, min_exp=-1021, min_10_exp=-307, dig=15, mant_dig=53, epsilon=2.220446049250313e-16, radix=2, rounds=1)
>>> sys.float_info.dig
15
複製代碼
dig 是浮點數的最大小數位數。
用單引號 '
或雙引號 "
引發來的多個字符串序列被視爲字符串,任何一個字符、數字或符號均可能是字符串的一部分。
Python 支持多行字符串,在開始和結束時都使用三個引號括起來。
>>> str = 'A string wrapped in single quotes'
>>> str
'A string wrapped in single quotes'
>>> str = "A string enclosed within double quotes"
>>> str
'A string enclosed within double quotes'
>>> str = """A multiline string starts and ends with a triple quotation mark."""
>>> str
'A multiline string\nstarts and ends with\na triple quotation mark.'
複製代碼
字符串類型的內存地址是不變的,意味着只會存儲一次,被重複拿來使用
>>> A = 'Python3'
>>> id(A)
4460827632
>>> B = A
>>> id(B)
4460827632
複製代碼
能夠看到第二個字符串變量和第一個共享同一個地址。
Python 有兩個流行的版本,分別是 2.7 和 3.4,Python 2 默認不支持 Unicode(ASCII),可是也能夠支持。而 Python 3 字符串類型已經所有支持 Unicode(UTF-8)。
Python2 字符串類型:
>>> print(type('Python String'))
<type 'str'>
>>> print(type(u'Python Unicode String'))
<type 'unicode'>
複製代碼
Python3 字符串類型:
>>> print(type('Python String'))
<class 'str'>
>>> print(type(u'Python Unicode String'))
<class 'str'>
複製代碼
若是要截取字符串,可使用特殊的方括號語法提取子串實現:
>>> str = "Learn Python"
>>> first_5_chars = str[0:5]
>>> print(first_5_chars)
Learn
>>> substr_from_2_to_5 = str[1:5]
>>> print(substr_from_2_to_5)
earn
>>> substr_from_6_to_end = str[6:]
>>> print(substr_from_6_to_end)
Python
>>> last_2_chars = str[-2:]
>>> print(last_2_chars)
on
>>> first_2_chars = str[:2]
>>> print(first_2_chars)
Le
>>> two_chars_before_last = str[-3:-1]
>>> print(two_chars_before_last)
ho
複製代碼
字節是不可變類型,能夠用來存儲字符序列(8位),範圍從 0 到 255。於數組類型,可使用索引獲取單個字節值,可是不能修改值。
字節和字符串的區別:
>>> empty_object = bytes(16)
>>> print(type(empty_object))
<class 'bytes'>
>>> print(empty_object)
b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
複製代碼
字節常常在緩衝區執行 I/O 操做,例若有一個程序正在經過網絡不斷接收數據,程序等待消息頭和終止符出現流中後開始解析數據,過程當中一直保持着將字節追加到環緩存區中。
使用 Python 的僞代碼實現這樣的功能:
buf = b''
while message_not_complete(buf):
buf += read_form_socket()
複製代碼
列表是相似構造一個數組,它以有序序列存儲任意類型的對象。列表很是靈活,沒有固定大小,索引從 0 開始。
建立一個列表的方式是經過將元素放在方括號內並用逗號分隔開來。
>>> assorted_list = [True, False, 1, 1.1, 1+2j, 'Learn', b'Python']
>>> first_element = assorted_list[0]
>>> print(first_element)
True
>>> print(assorted_list)
[True, False, 1, 1.1, (1+2j), 'Learn', b'Python']
>>> for item in assorted_list:
print(type(item))
<class 'bool'>
<class 'bool'>
<class 'int'>
<class 'float'>
<class 'complex'>
<class 'str'>
<class 'bytes'>
複製代碼
>>> simpleton = ['Learn', 'Python', '2']
>>> id(simpleton)
56321160
>>> simpleton
['Learn', 'Python', '2']
>>> simpleton[2] = '3'
>>> id(simpleton)
56321160
>>> simpleton
['Learn', 'Python', '3']
複製代碼
列表能夠包含另外一個列表,這樣的列表被稱爲嵌套列表。
>>> nested = [[1,1,1], [2,2,2], [3,3,3]]
>>> for items in nested:
for item in items:
print(item, end=' ')
1 1 1 2 2 2 3 3 3
複製代碼
列表也支持切片操做,就像以前介紹的字符串類型那樣。使用切片運算符 [ ]
能夠從列表中提取一個或多個元素。
>>> languages = ['C', 'C++', 'Python', 'Java', 'Go', 'Angular']
>>> print('languages[0:3] = ', languages[0:3])
languages[0:3] = ['C', 'C++', 'Python']
>>> print('languages[2:] = ', languages[2:])
languages[2:] = ['Python', 'Java', 'Go', 'Angular']
複製代碼
元組是由逗號分隔的異構(heterogeneous)集合,能夠存儲任何數據類型。元組和列表有類似之處,具體以下:
建立一個元組的方式是經過將元素放在封閉的圓括號內並用逗號分隔開來。
pure_tuple = ()
print (pure_tuple)
複製代碼
first_tuple = (3, 5, 7, 9)
second_tuple = ('learn', 'python 3')
nested_tuple = (first_tuple, second_tuple)
print(nested_tuple)
複製代碼
輸出結果:
((3, 5, 7, 9), ('learn', 'python 3'))
複製代碼
sample_tuple = ('Python 3',)*3
print(sample_tuple)
複製代碼
輸出:
('Python 3', 'Python 3', 'Python 3')
複製代碼
sample_tuple = (0 ,1, 2, 3, 4)
tuple_without_first_item = sample_tuple[1:]
print(tuple_without_first_item)
tuple_reverse = sample_tuple[::-1]
print(tuple_reverse)
tuple_from_3_to_5 = sample_tuple[2:4]
print(tuple_from_3_to_5)
複製代碼
輸出結果:
(1, 2, 3, 4)
(4, 3, 2, 1, 0)
(2, 3)
複製代碼
sample_tuple[2:4]
這裏的 2 表示從元組第三個元素開始,4 表示到元組第五個元素結束並將其排除在外。
列表和元組最大的不一樣是列表可變,元組不可變。Python 不容許修改建立後的元組,也就是說不能添加和刪除任何元素。因此若是想更新元組中的元素就必須從新建立個新的。
元組中的元素不可修改,可是若是元素是可變對象,那麼這個可變對象就是可被修改的。
例如:
>>> sample_tuple = (0 ,[1, 2, 3], 2, 3, 4)
>>> sample_tuple[1][0] = 666
>>> print(sample_tuple)
(0, [666, 2, 3], 2, 3, 4)
複製代碼
由於列表是可變對象,因此可修改。
Python 支持元組的緣由:
集合支持數學運算,例如並集、交集、對稱差等。集合是惟一一個不可變對象的無序集合,用大括號定義,並在元素之間用逗號隔開。
集合是從數學應用的「集合」派生而來,因此同一個元素不能出現屢次。
集合類型比列表更有優點。集合使用了哈希表的數據結構實現了檢查容器內是否承載了特定元素。
可使用內置的 set() 函數建立可迭代的集合。
>>> sample_set = set("Python data types")
>>> type(sample_set)
<class 'set'>
>>> sample_set
{'e', 'y', 't', 'o', ' ', 'd', 's', 'P', 'p', 'n', 'h', 'a'}
複製代碼
另外一個簡單的方式是用大括號 { }
將元素括起來。
>>> another_set = {'red', 'green', 'black'}
>>> type(another_set)
<class 'set'>
>>> another_set
{'red', 'green', 'black'}
複製代碼
frozen set 是傳統集合的一種處理形式,數據不可變,僅支持不更改上下文使用的狀況下執行方法和運算符。
>>> frozenset()
frozenset()
>>> cities = {"New York City", "Saint Petersburg", "London", "Munich", "Paris"}
>>> fset = frozenset(cities)
>>> type(fset)
<class 'frozenset'>
複製代碼
使用完整的例子說明 frozen set 和正常集合的區別:
sample_set = {"red", "green"}
sample_set.add("black")
print("Standard Set")
print(sample_set)
frozen_set = frozenset(["red", "green", "black"])
print("Frozen Set")
print(frozen_set)
複製代碼
輸出結果:
Standard Set
{'green', 'red', 'black'}
Frozen Set
frozenset({'green', 'red', 'black'})
複製代碼
字典類型是鍵-值對的無序集合,屬於內置的映射類型,其中鍵映射到值。這種鍵值對提供了直觀的數據存儲方式。
字典能有效存儲大量數據集,Python 對字典進行了高度優化以實現快速的數據檢索。
使用大括號 { }
建立字典,其中每一個元素都是一對鍵和值,鍵和值均可以是任何數據類型。
>>> sample_dict = {'key':'value', 'jan':31, 'feb':28, 'mar':31}
>>> type(sample_dict)
<class 'dict'>
>>> sample_dict
{'mar': 31, 'key': 'value', 'jan': 31, 'feb': 28}
複製代碼
字典內置訪問元素方法:
>>> sample_dict = {'key':'value', 'jan':31, 'feb':28, 'mar':31}
>>> sample_dict.keys()
dict_keys(['key', 'jan', 'feb', 'mar'])
>>> sample_dict.values()
dict_values(['value', 31, 28, 31])
>>> sample_dict.items()
dict_items([('key', 'value'), ('jan', 31), ('feb', 28), ('mar', 31)])
複製代碼
由於字典對象是可變的,因此能夠對其進行添加、更新和刪除操做。
>>> sample_dict['feb'] = 29
>>> sample_dict
{'mar': 31, 'key': 'value', 'jan': 31, 'feb': 29}
>>> sample_dict.update({'apr':30})
>>> sample_dict
{'apr': 30, 'mar': 31, 'key': 'value', 'jan': 31, 'feb': 29}
>>> del sample_dict['key']
>>> sample_dict
{'apr': 30, 'mar': 31, 'jan': 31, 'feb': 29}
複製代碼
本節講解了 Python 的已支持的數據類型,包括布爾值、數字、字符串、字節、列表、元組、集合和字典。基礎比較簡單,多加運用便可在實際項目中使用。