Python中的元組(Tuple)

在Python中,元組(Tuple)與列表(List)類似,也是一個有序的序列,但元組是一個不可變對象,其一旦初始化後便無法進行修改。

創建元組

一般在創建元組時,分爲創建空元組和非空元組,其創建方式如下:

# 創建空元組,有兩種方式
tuple1= tuple()
tuple2 = ()

# 創建同一數據類型元素的元組
tuple3 = ("a", "b", "c", "d", "e", "f")

# 創建不同數據類型元素的元組
tuple4 = ("a", 2, {}, [1, 3], False, ())

從上面可以看到,我們只需要把元組的所有元素放在 小括號 () 裏面,每個元素之間通過 逗號 , 間隔起來即可,當然和列表一樣,元組中同樣允許存放不同數據類型的元素。

元組中使用的 () 是常見的數學運算符,如果參考列表的創建,如下:

>>> name = ("語文")
>>> type(name)
<class 'str'>
>>>
>>> num = (123)
>>> type(num)
<class 'int'>

從上面可以看到,我們創建出來的壓根就不是元組類型。那麼我們想創建一個只包含一個元素的元組時,需要怎麼創建呢?

>>> name = ("語文",)
>>> type(name)
<class 'tuple'>
>>>
>>> num = (123,)
>>> type(name)
<class 'tuple'>

很簡單,只需要在元素後加上一個 逗號 , ,這樣創建出來就是一個元組。

獲取元組中的元素

當我們需要訪問元組中的元素,可以類似列表一樣通過索引取值或切片取值。

  • 下標索引取值
>>> books = ("語文", "數學", "英語", "歷史", "物理", "化學")
>>>
>>> books[0]  # 取第 1 個元素
'語文'
>>> books[5]  # 取第 6 個元素
'化學'
>>> books[-1]  # 取最後一個元素
'化學'
>>>
>>> books[100]  # 取第 101 個元素,不存在該索引,報錯
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
IndexError: tuple index out of range

如果訪問的索引不存在,那麼會報錯:IndexError: tuple index out of range

  • 切片取值

在元組中,可以像列表一樣使用切片,語法爲:元組[start:end:step],通過切片可以獲取到元組中指定範圍的元素,返回結果是一個新元組。在這裏,需要注意切片的規則是左閉右開,也就是說包含頭部 start,但不包含尾部 end ,而 step 則表示切片的步長,需要每間隔 step 個元素取一次。

>>> books = ("語文", "數學", "英語", "歷史", "物理", "化學")
>>>
>>> books[1:4:2]  # 從第2個到第4個元素,每間隔2個元素取值
('數學', '歷史')
>>> books[1::2]  # 從第2個到元組末尾,每間隔2個元素取值
('數學', '歷史', '化學')
>>> books[1:4]  # 獲取從第2個到第4個的所有元素
('數學', '英語', '歷史')
>>> books[:]  # 獲取全部元素
('語文', '數學', '英語', '歷史', '物理', '化學')
>>>
>>> books[::-1]  # 逆序獲取全部元素
('化學', '物理', '歷史', '英語', '數學', '語文')

修改元組

在上面我們提到了元組是不可變的,這就意味着我們創建一個元組之後,不能再去改變其值了,比如下面這樣就會出現報錯:

>>> books = ("語文", "數學", "英語", "歷史", "物理", "化學")
>>>
>>> books[1] = "地理"
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: 'tuple' object does not support item assignment

假設元組中存在元素是一個可變對象,如果我們不改變元組,但改變了可變對象的值,又會得到怎麼的結果呢?請看下面實例:

>>> nums = [100, 200, 300, 400]
>>> books = ("語文", nums, "英語", "歷史", "物理", "化學")
>>>
>>> print(books)
('語文', [100, 200, 300, 400], '英語', '歷史', '物理', '化學')
>>>
>>> nums[2] = 666
>>> nums.append(999)
>>>
>>> print(books)
('語文', [100, 200, 666, 400, 999], '英語', '歷史', '物理', '化學')

從上面可以看到,元組中的第 2 個元素似乎發生了變化,這豈不是和上面說的元組不可變自相矛盾了嗎?

其實,我們說的元組不可變,指的是元組中各元素的指向永遠保持不變。在上面操作中,元組中第 2 個元素指向的一直是 列表nums ,我們改變的其實不是元組的元素,而只是改變了 列表nums 中的元素。

刪除元組

元組是不可變的,因此我們就不能刪除元組中的元素,但是,我們可以通過 del 語句刪除整個元組。

>>> books = ("語文", "數學", "英語", "歷史", "物理", "化學")
>>>
>>> del books  # 刪除元組
>>>
>>> print(books)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
NameError: name 'books' is not defined

元組運算操作符

  • 運算符 + ,用於組合拼接元組
>>> tuple1 = (1, 3, 5)
>>> tuple2 = (2, 4, 6)
>>>
>>> print(tuple1 + tuple2)
(1, 3, 5, 2, 4, 6)
  • 運算符 * ,用於重複元組
>>> name = ("hello", "word")
>>>
>>> print(name * 3)
('hello', 'word', 'hello', 'word', 'hello', 'word')
  • 關鍵字 in

通過關鍵字 in ,可檢查當前元組中是否包含指定元素,返回結果爲布爾值 True 或 False。

>>> tuple3 = (1, 2, 3)
>>>
>>> print(2 in tuple3)
True
>>>
>>> print(6 in tuple3)
False

通過關鍵字 in ,還可以用於遍歷當前元組。

books = ("語文", "數學", "英語", "歷史", "物理", "化學")
for i in books:
    print(i, end=" ")

元組函數&方法

函數 & 方法 描述
len(tuple) 返回元組元素個數
max(tuple) 返回元組元素最大值
min(tuple) 返回元組元素最小值
tuple(iterable) 將可迭代對象轉換爲元組,若 iterable 爲空則創建空元組
tuple.count(obj) 統計某個元素在元組中出現的次數
tuple.index(obj) 從元組中找出某個元素第一次出現的索引位置
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章