在使用python過程中,列表、集合和字典是比較常用的資料結構。
但是,python中有乙個特立獨行的物件,元組tuple
,看乙個元組的簡單使用:
tu = (2, 3)
a = tu[0] # a=2
b = tu[1] # b=3
什麼?你告訴我這個乙個新的結構?不是陣列???
這用起來跟陣列也沒什麼區別啊?
要看元組和陣列的區別,最直觀的比較,就是比較兩個結構的方法,通過方法來理解結果。
列表用的比較多了,方法基本上都是常規的陣列操作:對陣列的增刪改查。對了,還有python列表最屌的操作,陣列的切片操作。
(悄悄告訴你,檢視方法只要python執行help(list)
, 就可以了)
再看一下元組的方法,暴露出來的方法只有兩個,count
和index
恩,我知道區別了,元組只能查,不能做增刪改的操作。
只能查詢,不可修改,這不是常量麼。。。。既然是常量,想必虛擬機器內部會做優化,元組占用的空間會比列表少很多吧。
分別定義列表和元組,檢視其記憶體占用情況:
from sys import getsizeof
if __name__ == '__main__':
tu = (x for x in range(20000))
li = [x for x in range(20000)]
print(getsizeof(tu))
print(getsizeof(li))
輸出結果:
啥?元組這麼小麼?我兩萬個數字才占用88個位元組?我不服,再怎麼優化這也不可能,它不是元組:
哦哦,不好意思啊,走錯片場了,這是個生成器。重新來過:
這回沒毛病了,元組確實比列表占用空間要少一些。
至此,基本已經確定了,元組最大的特性就是不可變。
通過元組的不可變特性,引申出了很多陣列無法實現的功能
這裡,看到網上有人說元組中的陣列是可變的,也給出了對應的解釋。簡單說,元組中儲存的是陣列的位址,儘管陣列內容變了,但位址沒有變,也就是元組內容沒有發生變化,很好理解。
元組是可以計算hash值的,這也就意味元組可以當做hashtable中的key存在
if __name__ == '__main__':
tu = tuple(x for x in range(20000))
li = list(x for x in range(20000))
print(hash(tu))
print(hash(li))
有人說,字串就足夠了,沒必要用元組。恩?我想到乙個應用場景:
如果要通過使用者的資訊(身高,體重,性別)來查詢使用者的id,我們固然可以遍歷一遍使用者,將符合條件的篩選出來。但這樣太慢了,如果我們維護乙個使用者資訊為key,值為id陣列的hashmap,那查詢就十份快速了。
當然,使用字串也完全可以滿足,將使用者的各種資訊拼接起來,但使用元組顯然更加直觀,key直接就是(身高,體重,性別)。
這個雖然和元組的不可變沒什麼關聯,但同樣十分實用。實現函式返回多個值。
def test_fun():
return 2, 3
if __name__ == '__main__':
a, b = test_fun()
# 用*來接受剩餘的內容
媽媽再也不用擔心我的函式返回了。
通過先人的成果來理解列表和元組,下面以numpy為例,通過作者對二者的理解來幫助我理解。
import numpy
if __name__ == '__main__':
# 建立乙個二維陣列
a = numpy.arange(9).reshape(3, 3)
print(a)
tu = (1, 2)
li = [1, 2]
print(a[tu])
print(a[li])
python 元組是什麼 python元組是什麼
python的元組與列表類似,不同之處在於元組的元素不能修改。元組使用小括號,列表使用方括號。元組建立很簡單,只需要在括號中新增元素,並使用逗號隔開即可。如下例項 tup1 physics chemistry 1997,2000 tup2 1,2,3,4,5 tup3 a b c d 建立空元祖tu...
python教程是什麼 Python是什麼?
python是物件導向,高階語言,解釋,動態和多用途程式語言。python易於學習,而且功能強大,功能多樣的指令碼語言使其對應用程式開發具有吸引力。python的語法和動態型別具有其解釋性質,使其成為許多領域的指令碼編寫和快速應用程式開發的理想語言。python支援多種程式設計模式,包括物件導向程式...
python是什麼意思 python是什麼
python 是乙個高層次的結合了解釋性 編譯性 互動性和物件導向的指令碼語言。python 的設計具有很強的可讀性,相比其他語言經常使用英文關鍵字,其他語言的一些標點符號,它具有比其他語言更有特色語法結構。python 是一種解釋型語言 這意味著開發過程中沒有了編譯這個環節。類似於php和perl...