Python中的元組類似于列表。兩者之間的區(qū)別在于,一旦分配了元組,就無(wú)法更改其元素,而在列表中,可以更改元素。
通過(guò)將所有項(xiàng)目(元素)放在括號(hào)內(nèi)()(以逗號(hào)分隔)來(lái)創(chuàng)建元組。括號(hào)是可選的,但是,使用括號(hào)是一個(gè)好習(xí)慣。
元組可以具有任意數(shù)量的項(xiàng),并且它們可以具有不同的類型(整數(shù),浮點(diǎn)數(shù),列表,字符串等)。
也可以在不使用括號(hào)的情況下創(chuàng)建元組。這稱為元組包裝。
用一個(gè)元素創(chuàng)建一個(gè)元組有點(diǎn)特殊。
只有一個(gè)元素的元組,括號(hào)內(nèi)僅包含一個(gè)元素是不夠的。我們將需要一個(gè)逗號(hào)結(jié)尾來(lái)表明它實(shí)際上是一個(gè)元組。
my_tuple = ("hello")
print(type(my_tuple)) # <class 'str'>
# 創(chuàng)建一個(gè)只有一個(gè)元素的元組
my_tuple = ("hello",)
print(type(my_tuple)) # <class 'tuple'>
# 括號(hào)是可選的
my_tuple = "hello",
print(type(my_tuple)) # <class 'tuple'>我們可以通過(guò)多種方式訪問(wèn)元組的元素。
我們可以使用索引運(yùn)算符[]訪問(wèn)索引從0開始的元組中的項(xiàng)目。
因此,具有6個(gè)元素的元組將具有從0到5的索引。嘗試訪問(wèn)元組之外的元素(例如6、7 ...)將引發(fā)IndexError。
索引必須是整數(shù);因此我們不能使用float或其他類型。如果使用會(huì)導(dǎo)致TypeError。
同樣,使用嵌套索引訪問(wèn)嵌套元組,如下面的示例所示。
my_tuple = ('p','e','r','m','i','t')
print(my_tuple[0]) # 'p'
print(my_tuple[5]) # 't'
# IndexError:列表索引超出范圍
# print(my_tuple[6])
# 索引必須是整數(shù)
# TypeError: 列表索引必須是整數(shù),而不是浮點(diǎn)數(shù)
# my_tuple[2.0]
# 嵌套元組
n_tuple = ("mouse", [8, 4, 6], (1, 2, 3))
# 嵌套索引
print(n_tuple[0][3]) # 's'
print(n_tuple[1][1]) # 4Python允許對(duì)其序列進(jìn)行負(fù)索引。
索引-1表示最后一項(xiàng),-2表示倒數(shù)第二項(xiàng),依此類推。
my_tuple = ('p','e','r','m','i','t')
# 輸出: 't'
print(my_tuple[-1])
# 輸出: 'p'
print(my_tuple[-6])我們可以使用切片運(yùn)算符-冒號(hào)“:”訪問(wèn)元組中的一系列項(xiàng)目。
my_tuple = ('p','r','o','g','r','a','m','i','z')
# 第2個(gè)-4個(gè)元素
# 輸出: ('r', 'o', 'g')
print(my_tuple[1:4])
# 從開始到第二個(gè)元素
# 輸出: ('p', 'r')
print(my_tuple[:-7])
# 第8個(gè)元素到結(jié)尾
# 輸出: ('i', 'z')
print(my_tuple[7:])
# 從開始到結(jié)尾的元素
# 輸出: ('p', 'r', 'o', 'g', 'r', 'a', 'm', 'i', 'z')
print(my_tuple[:])通過(guò)考慮索引位于元素之間,可以最好地可視化切片,如下所示。因此,如果要訪問(wèn)范圍,則需要將元組中的部分切片的索引。

與列表不同,元組是不可變的。
這意味著一旦分配了元組的元素就無(wú)法更改。但是,如果元素本身是可變的數(shù)據(jù)類型(如列表),則可以更改其嵌套項(xiàng)目。
我們還可以將元組分配給不同的值(重新分配)。
my_tuple = (4, 2, 3, [6, 5])
# TypeError: 'tuple' 對(duì)象不支持項(xiàng)分配
# my_tuple[1] = 9
# 但是,可變要素的項(xiàng)目可以變更
my_tuple[3][0] = 9 # Output: (4, 2, 3, [9, 5])
print(my_tuple)
# 元組可以重新分配
my_tuple = ('p','r','o','g','r','a','m','i','z')
# 輸出: ('p', 'r', 'o', 'g', 'r', 'a', 'm', 'i', 'z')
print(my_tuple)我們可以使用+運(yùn)算符來(lái)合并兩個(gè)元組。這也稱為串聯(lián)。
我們還可以使用運(yùn)算符*,將元組中的元素重復(fù)給定次數(shù)。
無(wú)論+和*操作會(huì)導(dǎo)致新的記錄。
# 串聯(lián)
# 輸出: (1, 2, 3, 4, 5, 6)
print((1, 2, 3) + (4, 5, 6))
# 重復(fù)
# 輸出: ('Repeat', 'Repeat', 'Repeat')
print(("Repeat",) * 3)如上所述,我們不能更改元組中的元素。這也意味著我們無(wú)法刪除或刪除元組中的項(xiàng)目。
但是可以使用關(guān)鍵字del完全刪除一個(gè)元組。
my_tuple = ('p','r','o','g','r','a','m','i','z')
# 不能刪除條目
# TypeError: 'tuple'對(duì)象不支持項(xiàng)目刪除
# del my_tuple[3]
# 可以刪除整個(gè)元組
del my_tuple
# NameError: 未定義名稱“ my_tuple”
print(my_tuple)元組不提供添加項(xiàng)目或刪除項(xiàng)目的方法。僅以下兩種方法可用。
| 方法 | 描述 |
|---|---|
| count(x) | 返回項(xiàng)目數(shù)x |
| index(x) | 返回等于x的第一項(xiàng)的索引 |
Python元組方法的一些示例:
my_tuple = ('a','p','p','l','e',)
print(my_tuple.count('p')) # Output: 2
print(my_tuple.index('l')) # Output: 3我們可以使用關(guān)鍵字in來(lái)測(cè)試項(xiàng)目是否存在于元組中。
my_tuple = ('a','p','p','l','e',)
# In 操作
# 輸出: True
print('a' in my_tuple)
# 輸出: False
print('b' in my_tuple)
# Not in 操作
# 輸出: True
print('g' not in my_tuple)使用for循環(huán),我們可以遍歷元組中的每個(gè)項(xiàng)目。
# 輸出:
# Hello John
# Hello Kate
for name in ('John','Kate'):
print("Hello",name)由于元組與列表非常相似,因此它們?cè)陬愃魄闆r下也都使用。
但是,在列表上實(shí)現(xiàn)元組具有某些優(yōu)點(diǎn)。下面列出了一些主要優(yōu)點(diǎn):
我們通常將元組用于異構(gòu)(不同)數(shù)據(jù)類型,將列表用于同類(相似)數(shù)據(jù)類型。
由于元組是不可變的,因此遍歷元組要比使用list更快。因此,性能略有提升。
包含不可變?cè)氐脑M可以用作字典的鍵。對(duì)于列表,這是不可能的。
如果您擁有不變的數(shù)據(jù),則將其實(shí)現(xiàn)為元組將確保其保持寫保護(hù)。