Python中的元組類似于列表。兩者之間的區(qū)別在于,一旦分配了元組,就無法更改其元素,而在列表中,可以更改元素。
通過將所有項(xiàng)目(元素)放在括號內(nèi)()(以逗號分隔)來創(chuàng)建元組。括號是可選的,但是,使用括號是一個(gè)好習(xí)慣。
元組可以具有任意數(shù)量的項(xiàng),并且它們可以具有不同的類型(整數(shù),浮點(diǎn)數(shù),列表,字符串等)。
也可以在不使用括號的情況下創(chuàng)建元組。這稱為元組包裝。
用一個(gè)元素創(chuàng)建一個(gè)元組有點(diǎn)特殊。
只有一個(gè)元素的元組,括號內(nèi)僅包含一個(gè)元素是不夠的。我們將需要一個(gè)逗號結(jié)尾來表明它實(shí)際上是一個(gè)元組。
my_tuple = ("hello") print(type(my_tuple)) # <class 'str'> # 創(chuàng)建一個(gè)只有一個(gè)元素的元組 my_tuple = ("hello",) print(type(my_tuple)) # <class 'tuple'> # 括號是可選的 my_tuple = "hello", print(type(my_tuple)) # <class 'tuple'>
我們可以通過多種方式訪問元組的元素。
我們可以使用索引運(yùn)算符[]訪問索引從0開始的元組中的項(xiàng)目。
因此,具有6個(gè)元素的元組將具有從0到5的索引。嘗試訪問元組之外的元素(例如6、7 ...)將引發(fā)IndexError。
索引必須是整數(shù);因此我們不能使用float或其他類型。如果使用會導(dǎo)致TypeError。
同樣,使用嵌套索引訪問嵌套元組,如下面的示例所示。
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]) # 4
Python允許對其序列進(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)算符-冒號“:”訪問元組中的一系列項(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[:])
通過考慮索引位于元素之間,可以最好地可視化切片,如下所示。因此,如果要訪問范圍,則需要將元組中的部分切片的索引。
與列表不同,元組是不可變的。
這意味著一旦分配了元組的元素就無法更改。但是,如果元素本身是可變的數(shù)據(jù)類型(如列表),則可以更改其嵌套項(xiàng)目。
我們還可以將元組分配給不同的值(重新分配)。
my_tuple = (4, 2, 3, [6, 5]) # TypeError: 'tuple' 對象不支持項(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)算符來合并兩個(gè)元組。這也稱為串聯(lián)。
我們還可以使用運(yùn)算符*,將元組中的元素重復(fù)給定次數(shù)。
無論+和*操作會導(dǎo)致新的記錄。
# 串聯(lián) # 輸出: (1, 2, 3, 4, 5, 6) print((1, 2, 3) + (4, 5, 6)) # 重復(fù) # 輸出: ('Repeat', 'Repeat', 'Repeat') print(("Repeat",) * 3)
如上所述,我們不能更改元組中的元素。這也意味著我們無法刪除或刪除元組中的項(xiàng)目。
但是可以使用關(guān)鍵字del完全刪除一個(gè)元組。
my_tuple = ('p','r','o','g','r','a','m','i','z') # 不能刪除條目 # TypeError: 'tuple'對象不支持項(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來測試項(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)
由于元組與列表非常相似,因此它們在類似情況下也都使用。
但是,在列表上實(shí)現(xiàn)元組具有某些優(yōu)點(diǎn)。下面列出了一些主要優(yōu)點(diǎn):
我們通常將元組用于異構(gòu)(不同)數(shù)據(jù)類型,將列表用于同類(相似)數(shù)據(jù)類型。
由于元組是不可變的,因此遍歷元組要比使用list更快。因此,性能略有提升。
包含不可變元素的元組可以用作字典的鍵。對于列表,這是不可能的。
如果您擁有不變的數(shù)據(jù),則將其實(shí)現(xiàn)為元組將確保其保持寫保護(hù)。