不間斷 Python 挑戰 Day 14 - 元組 (Tuple)

更新於 發佈於 閱讀時間約 7 分鐘

在程式設計中,我們會使用到一些固定不會變動的資料內容,例如一年的月份、物體的邊長、過去一周的氣溫等等,使用串列的結構固然也可以用來儲存這些資料,但串列可以被新增或刪除,不能有效保護這類不可變動的資料。因此,Python也提供了另一種形式的資料結構,稱為元組,它的資料結構和串列相同,但資料的內容不可變動。此外,由於元組的資料結構較串列簡單,它在執行上也會占用較少的資源。

元組

元組的資料結構如下:

tuple = ( data1, data2, data3, ... )

例如我們定義一個儲存台灣直轄市的元組:

cities_tuple = ("台北", "新北", "桃園", "台中", "台南", "高雄")
print(cities_tuple)
print(type(cities_tuple))

執行結果:

('台北', '新北', '桃園', '台中', '台南', '高雄')
<class 'tuple'>

若元組內只需定義一個元素,必須在元素的最後面加上「,」,否則會變成一個字串型態的資料。

# without 「,」
one_tuple = ("台北")
print(one_tuple)
print(type(one_tuple))

# with 「,」
one_tuple = ("台北",)
print(one_tuple)
print(type(one_tuple))

執行結果如下,可以看到不加「,」會被Python解讀為字串類型的資料:

台北
<class 'str'>
('台北',)
<class 'tuple'>

儘管如此,若要建立一個空的元組,只需要括號即可。

empty_tuple = ()
print(empty_tuple)
print(type(empty_tuple))

執行結果:

()
<class 'tuple'>

讀取元組元素

讀取的方式和串列相同,第一個元素的索引值為0、第二個元素的索引值為1,以此類推;若索引值是-1,代表的是元組的最後一個元素、若索引值是-2,代表的是元組的倒數第二個元素,以此類推。

print(cities_tuple[0])
print(cities_tuple[1])
print(cities_tuple[-1])
print(cities_tuple[-2])

執行結果:

台北
新北
高雄
台南

同樣若要同時取得元組中的多個元素,可用元組切片(slice)的方式:

  • tuple[a:b]  # 取得元組索引值為a到(b-1)的元素
  • tuple[:a]   # 取得元組前a個元素
  • tuple[a:]   # 取得元組索引值為a到最後一個元素
  • tuple[a:b:c]  # 以c為間隔取得元組索引值為a到(b-1)的元素
  • tuple[:]    # 取得元組所有元素
print(cities_tuple[2:5])
print(cities_tuple[:2])
print(cities_tuple[2:])
print(cities_tuple[1:5:2])
print(cities_tuple[:])

執行結果:

('桃園', '台中', '台南')
('台北', '新北')
('桃園', '台中', '台南', '高雄')
('新北', '台中')
('台北', '新北', '桃園', '台中', '台南', '高雄')

重新定義元組

元組內的元素不可被新增、刪除,但可以重新定義整個元組的資料。例如我們想要將前面儲存台灣直轄市的元組內容都各多加一個「市」,可以直接重新定義元組:

cities_tuple = ("台北", "新北", "桃園", "台中", "台南", "高雄")
print(cities_tuple)

cities_tuple = ("台北市", "新北市", "桃園市", "台中市", "台南市", "高雄市")
print(cities_tuple)

執行結果:

('台北', '新北', '桃園', '台中', '台南', '高雄')
('台北市', '新北市', '桃園市', '台中市', '台南市', '高雄市')

元組與串列互換

串列可以轉換為元組:

cities_list = ["台北", "新北", "桃園", "台中", "台南", "高雄"]
cities_tuple = tuple(cities_list)
print(cities_tuple)

執行結果:

('台北', '新北', '桃園', '台中', '台南', '高雄')

元組也可以轉換為串列:

cities_list = list(cities_tuple)
print(cities_list)

執行結果:

['台北', '新北', '桃園', '台中', '台南', '高雄']

使用for迴圈迭代

和串列相同,元組也可以使用for迴圈進行迭代:

cities_tuple = ("台北", "新北", "桃園", "台中", "台南", "高雄")
for city in cities_tuple:
  print(city, end=" ")

執行結果:

台北 新北 桃園 台中 台南 高雄

元組生成

元組和for迴圈結合,可以簡潔的方式產生元組,但和串列不同的是,若僅以小括號括住for迴圈的敘述,產生的僅是生成式(generator)物件,必須再經過tuple()轉換成元組。

scores_tuple = ()
scores_tuple = (x for x in range(10))
print(scores_tuple)

執行結果:

<generator object <genexpr> at 0x0000016CEE6199A0>

經過tuple()轉換:

scores_tuple = tuple((x for x in range(10)))
print(scores_tuple)

執行結果:

(0, 1, 2, 3, 4, 5, 6, 7, 8, 9)

程式範例

https://github.com/wjweng/marathon_python/blob/master/Day1_to_25/marathon_python_day14.py

留言
avatar-img
留言分享你的想法!
avatar-img
Wei-Jie Weng的沙龍
48會員
36內容數
Wei-Jie Weng的沙龍的其他內容
2022/07/13
對於程式的初學者而言,理解程式的流程、迴圈的進行、或是變數的變化會需要一定程度將程式在腦中進行運算的能力,要一段時間熟悉與適應,尤其是當程式執行的結果不如預期時,往往是計算的過程和自己所想像的不同,這時又更難靠自己的能力找出錯誤。因此,這邊要介紹的這個工具可以將程式執行的過程逐行將變數的變化視覺化地
Thumbnail
2022/07/13
對於程式的初學者而言,理解程式的流程、迴圈的進行、或是變數的變化會需要一定程度將程式在腦中進行運算的能力,要一段時間熟悉與適應,尤其是當程式執行的結果不如預期時,往往是計算的過程和自己所想像的不同,這時又更難靠自己的能力找出錯誤。因此,這邊要介紹的這個工具可以將程式執行的過程逐行將變數的變化視覺化地
Thumbnail
2022/07/13
在上一節介紹了 JSON 資料的基本架構後,我們將改寫並擴充密碼產生器程式,讓它能夠藉由 JSON 的資料結構完成帳密搜尋的功能。
Thumbnail
2022/07/13
在上一節介紹了 JSON 資料的基本架構後,我們將改寫並擴充密碼產生器程式,讓它能夠藉由 JSON 的資料結構完成帳密搜尋的功能。
Thumbnail
2022/06/23
JSON的全名叫JavaScript Object Notation,是由Douglas Crockford所設計的一種資料格式,最初應用在JavaScript程式語言中,做為一種資料交換的格式,而後被廣泛運用在Web開發與NoSQL資料庫,現今已成為一種重要的資料格式。
Thumbnail
2022/06/23
JSON的全名叫JavaScript Object Notation,是由Douglas Crockford所設計的一種資料格式,最初應用在JavaScript程式語言中,做為一種資料交換的格式,而後被廣泛運用在Web開發與NoSQL資料庫,現今已成為一種重要的資料格式。
Thumbnail
看更多