元組是一個固定長度,不可改變的Python序列對象。建立元組的最簡單方式,是用逗號分隔一列值:python
In [1]: tup = 4, 5, 6 In [2]: tup Out[2]: (4, 5, 6)
當用複雜的表達式定義元組,最好將值放到圓括號內,以下所示:程序員
In [3]: nested_tup = (4, 5, 6), (7, 8) In [4]: nested_tup Out[4]: ((4, 5, 6), (7, 8))
用tuple
能夠將任意序列或迭代器轉換成元組:app
In [5]: tuple([4, 0, 2]) Out[5]: (4, 0, 2) In [6]: tup = tuple('string') In [7]: tup Out[7]: ('s', 't', 'r', 'i', 'n', 'g')
能夠用方括號訪問元組中的元素。和C、C++、JAVA等語言同樣,序列是從0開始的:函數
In [8]: tup[0] Out[8]: 's'
元組中存儲的對象多是可變對象。一旦建立了元組,元組中的對象就不能修改了:spa
In [9]: tup = tuple(['foo', [1, 2], True]) In [10]: tup[2] = False --------------------------------------------------------------------------- TypeError Traceback (most recent call last) <ipython-input-10-c7308343b841> in <module>() ----> 1 tup[2] = False TypeError: 'tuple' object does not support item assignment
若是元組中的某個對象是可變的,好比列表,能夠在原位進行修改:rest
In [11]: tup[1].append(3) In [12]: tup Out[12]: ('foo', [1, 2, 3], True)
能夠用加號運算符將元組串聯起來:code
In [13]: (4, None, 'foo') + (6, 0) + ('bar',) Out[13]: (4, None, 'foo', 6, 0, 'bar')
元組乘以一個整數,像列表同樣,會將幾個元組的複製串聯起來:orm
In [14]: ('foo', 'bar') * 4 Out[14]: ('foo', 'bar', 'foo', 'bar', 'foo', 'bar', 'foo', 'bar')
對象自己並無被複制,只是引用了它。對象
若是你想將元組賦值給相似元組的變量,Python會試圖拆分等號右邊的值:ip
In [15]: tup = (4, 5, 6) In [16]: a, b, c = tup In [17]: b Out[17]: 5
即便含有元組的元組也會被拆分:
In [18]: tup = 4, 5, (6, 7) In [19]: a, b, (c, d) = tup In [20]: d Out[20]: 7
使用這個功能,你能夠很容易地替換變量的名字,其它語言多是這樣:
tmp = a a = b b = tmp
可是在Python中,替換能夠這樣作:
In [21]: a, b = 1, 2 In [22]: a Out[22]: 1 In [23]: b Out[23]: 2 In [24]: b, a = a, b In [25]: a Out[25]: 2 In [26]: b Out[26]: 1
變量拆分經常使用來迭代元組或列表序列:
In [27]: seq = [(1, 2, 3), (4, 5, 6), (7, 8, 9)] In [28]: for a, b, c in seq: ....: print('a={0}, b={1}, c={2}'.format(a, b, c)) a=1, b=2, c=3 a=4, b=5, c=6 a=7, b=8, c=9
另外一個常見用法是從函數返回多個值。後面會詳解。
Python最近新增了更多高級的元組拆分功能,容許從元組的開頭「摘取」幾個元素。它使用了特殊的語法*rest
,這也用在函數簽名中以抓取任意長度列表的位置參數:
In [29]: values = 1, 2, 3, 4, 5 In [30]: a, b, *rest = values In [31]: a, b Out[31]: (1, 2) In [32]: rest Out[32]: [3, 4, 5]
rest
的部分是想要捨棄的部分,rest的名字不重要。做爲慣用寫法,許多Python程序員會將不須要的變量使用下劃線:
In [33]: a, b, *_ = values
由於元組的大小和內容不能修改,它的實例方法都很輕量。其中一個頗有用的就是count
(也適用於列表),它能夠統計某個值得出現頻率:
In [34]: a = (1, 2, 2, 2, 3, 4, 2) In [35]: a.count(2) Out[35]: 4