Python-tuple

Python有了串列(list),為何還要有元組(tuple) ?

tuple 是不可變 (Immutable) 的資料型態。

元組(tuple) 是 Python 的資料儲存容器之一,最大的特點就是,它是「不可變」(Immutable)的資料型態。(本文以直接以 tuple 稱呼元組。)

其他型態的容器包括:串列(list)、字典(dictionary)、集合(set),但這些都是「可變」 (mutable)的資料型態。

「可變」與「不可變」是很重要的觀念,關乎你如何操作各種資料型態,看到資料型態就要可以判斷它可不可變。

雖說如此,但卻不是要你刻意的去硬背它,死背只會讓你離程式語言越來越遠,因為你不了解,卻要背一堆東西,無聊感會與日俱增。

透由了解各種資料型態的操作,你就會記得了;尤其當你胡亂地用了一堆不合適的方法(Method)後,你會對「可變」與「不可變」有更深的體認,也會讓你記得誰可變,誰不可變。

這也是為什麼,學程式語言要實際打打程式碼,光上課、看影片或書籍是無法進步的,試著編寫程式,甚至照著範例打(相信我,你有很高機率照著打還是會打錯),都會有幫助。

回到正題,tuple 這個讓人沒有頭緒的資料型態,在 Python 中究竟扮演什麼角色呢?

初次看到 tuple ,腦中產生的疑惑是 tuple 怎麼唸啊?

另一個疑惑是,tuple 用小括號表示,串列(list)用中括號表示,都用逗號區隔項目,但這兩個資料型態也長得太像了吧!

關於這兩個疑惑,讓我們接著看下去,逐一為你解答。

首先,先說明一下 tuple 以小括號()來表示,不同項目之間以逗號隔開,屬於序列結構。

序列結構是什麼?

序列,指的是 tuple 內的值有順序性;結構,指的是資料結構(data structure),是電腦中儲存、組織資料的方式。

tuple 怎麼發音

關於這麼問題,Python的創造者 Guido van Rossum,2011年在 tweet 鄭重的說明 tuple 怎麼發音:

Guido van Rossum 怎麼說的呢?

他說,他是這樣念 tuple的:

  • 周一、三、五這三天,唸 too-pull。下方影片有發音可以聽。
影片有 too-pull 發音
  • 周二、四、六這三天,唸 tub-pull。下方影片有發音可以聽。
影片有 tub-pull 發音
  • 星期日他不會談到 tuple,所以周日沒有 tuple 怎麼唸的問題。

這是什麼意思呢?

就是你要唸 too-pull 或 tub-pull 都可以,都有人唸,只要你別唸成 apple 就好。

tuple與串列(list)差在哪?

tuple 與串列這兩個很相像的資料型態,長那麼像,差別在哪?

tuple 與串列主要有三點不同

  1. 使用的符號不同
    tuple ,用小括號表示 。
    例如 (‘a’, ‘b’)。

    串列,用中括號表示 。
    例如 [‘a’, ‘b’]。
  2. tuple屬於不可變的資料型態
    不可變(Immutable)是什麼意思?
    就是你不可以修改、增減tuple的值。
    也因為 tuple 不可變的特性,所以沒有append()、remove()、pop()等會更動值的操作。
  3. 只含有一個項目時,要加上逗點
    當你要建立只有一個項目的 tuple,千萬要記得加上逗號,否則不會建立 tuple。

怎麼建立 tuple?

在項目後方加上逗號

在每個要放入 tuple 這個容器的項目後方加上一個逗號。

例如,想在名為建立一個取名為 number 的 tuple,裡面包含三個項目,分別是數值 1、2、3。

>>>number = 1, 2, 3
>>>print(number)
(1, 2, 3)

想建立只有 1 個項目的 tuple 時,千萬要記得加上逗號,否則不會建立 tuple。

這點與串列(list)不同,你在建立串列時,既便只有一個項目,不需要加上逗號也可以製作串列。

>>>number = 1,
>>>print(number)
(1,)

使用小括號建立

在不使用函式的情況下,通常我們在建立 tuple 時,會加上小括號以利辨別,閱讀程式碼時就可以快速看出資料型態是 tuple。

這也是比較常見的方式。

>>>number = (1, 2, 3)
>>>print(number)
(1, 2, 3)

同樣的,如果項目只有一個時,要記得加上逗號!

不加逗號是什麼情況呢?

我們來看看下面的例子。

例如,今天你的人生成就終於達到 A+,你想建立一個名為 score 的 tuple 紀念一下,這個 tuple 就只含有 A+ 這個項目。

所以你在小括號中放入A+ 這個值,印出 score,期待得到 tuple,但你只得到一樣的資料,就是 A+ 這個字串。

使用type() 函式驗證,果然是 str(字串,string)。

>>>score = ('A+')
>>>print(score)
A+
>>>print(type(score))
<class 'str'>

而如果你在  ‘A+’ 後方加上一個逗號,就可以成功建立 tuple 了。

>>>score = ('A+',)
>>>print(score)
('A+',)
>>>print(type(score))
<class 'tuple'>

只是差了一個逗號,結果大不同,而這種小細節就是寫程式容易會產生 bug 的地方,其實你都會,但就是不小心錯了一點點,便會讓你覺得很崩潰。

空 tuple 可以直接用空的小括號建立,這個時候就不用再加逗號囉。

>>>score = ()
>>>print(score)
()
>>>print(type(score))
<class 'tuple'>

用 tuple() 函式建立

tuple() 函式可以讓你把其他的資料型態轉換為 tuple

下方的例子,就把 score 字串(string)及 number 串列(list)轉變為 tuple。

>>>score ='A+'
>>>print(tuple(score))
('A', '+')

>>>number = [1, 2, 3]
>>>print(tuple(number))
(1, 2, 3)

什麼時候會使用 tuple?

當你的值都不會改變,而且你也不希望值被更動的時候,就是適合使用 tuple的時候。

tuple 有以下幾個優點

  1. 因為不可變(immutable)的特性,運作起來比串列還要快。
  2. 不會不小心改變 tuple 的值,也就是 tuple 的項目不會不小心被更動到。
  3. 占用的空間比較少。
  4. 作為字典(dictionary)的鍵(key)使用,因為字典的鍵需要不可變的值。
  5. 具名 tuple 可以簡易的作為物件的替代品。

在一般的 Python 程式設計中,tuple 不會很常使用到。

同屬資料儲存容器類型的串列(list)、字典(dictionary)才是比較常使用的資料型態。

tuple的操作上,包括使用len()函式來得到項目數量、以位置(index)來找尋值、slice、+ 運算子、* 運算子,或是 for 與 in 的迴圈等。

只要不牽扯到變更值的事情,都與串列很相似,但只要會更動到值,tuple 就完全不能做。

台大盧信銘教授coursera 的課程便將 tuple 說明得相當清楚,不到 10 分鐘的教學影片,幫你快速弄懂 tuple。

延伸閱讀:

在〈Python有了串列(list),為何還要有元組(tuple) ?〉中有 2 則留言

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *