- Python從入門到精通
- 明日科技
- 4297字
- 2019-12-06 14:16:31
5.3 元組
元組(tuple)是Python中另一個重要的序列結構,與列表類似,也是由一系列按特定順序排列的元素組成。但是它是不可變序列。因此,元組也可以稱為不可變的列表。在形式上,元組的所有元素都放在一對小括號“()”中,兩個相鄰元素間使用逗號“,”分隔。在內容上,可以將整數、實數、字符串、列表、元組等任何類型的內容放入元組中,并且同一個元組中,元素的類型可以不同,因為它們之間沒有任何關系。通常情況下,元組用于保存程序中不可修改的內容。
說明
從元組和列表的定義上看,這兩種結構比較相似,那么它們之間有哪些區別呢?它們之間的主要區別就是一個是不可變序列,一個是可變序列。即元組中的元素不可以單獨修改,而列表則可以任意修改。
5.3.1 元組的創建和刪除
在Python中提供了多種創建元組的方法,下面分別進行介紹。
1.使用賦值運算符直接創建元組
同其他類型的Python變量一樣,創建元組時,也可以使用賦值運算符“=”直接將一個元組賦值給變量。具體的語法格式如下:
tuplename = (element 1,element 2,element 3,...,element n)
其中,tuplename表示元組的名稱,可以是任何符合Python命名規則的標識符;element 1、element 2、element 3、element n表示元組中的元素,個數沒有限制,并且只要是Python支持的數據類型就可以。
注意
創建元組的語法與創建列表的語法類似,只是創建列表時使用的是中括號“[]”,而創建元組時使用的是小括號“()”。
例如,下面定義的都是合法的元組。
01 num = (7,14,21,28,35,42,49,56,63) 02 ukguzheng = ("漁舟唱晚","高山流水","出水蓮","漢宮秋月") 03 untitle = ('Python',28,("人生苦短","我用Python"),["爬蟲","自動化運維","云計算","Web開發"]) 04 python = ('優雅',"明確",'''簡單''')
在Python中,雖然元組是使用一對小括號將所有的元素括起來。但是實際上,小括號并不是必需的,只要將一組值用逗號分隔開來,Python就可以認為它是元組。例如,下面的代碼定義的也是元組。
ukguzheng = "漁舟唱晚","高山流水","出水蓮","漢宮秋月"
在IDLE中輸出該元組后,將顯示以下內容。
('漁舟唱晚', '高山流水', '出水蓮', '漢宮秋月')
如果要創建的元組只包括一個元素,則需要在定義元組時,在元素的后面加一個逗號“,”。例如,下面的代碼定義的就是包括一個元素的元組。
verse = ("一片冰心在玉壺",)
在IDLE中輸出verse,將顯示以下內容。
('一片冰心在玉壺',)
而下面的代碼,則表示定義一個字符串。
verse = ("一片冰心在玉壺")
在IDLE中輸出verse,將顯示以下內容。
一片冰心在玉壺
說明
在Python中,可以使用type()函數測試變量的類型。例如下面的代碼:
01 verse1 = ("一片冰心在玉壺",) 02 print("verse1的類型為",type(verse1)) 03 verse2 = ("一片冰心在玉壺") 04 print("verse2的類型為",type(verse2))
在IDLE中執行上面的代碼,將顯示以下內容。
verse1的類型為 <class 'tuple'> verse2的類型為 <class 'str'>
2.創建空元組
在Python中,也可以創建空元組,例如,要創建一個名稱為emptytuple的空元組,可以使用下面的代碼:
emptytuple = ()
空元組可以應用在為函數傳遞一個空值或者返回空值時。例如,定義一個函數必須傳遞一個元組類型的值,而我們還不想為它傳遞一組數據,那么就可以創建一個空元組傳遞給它。
3.創建數值元組
在Python中,可以使用tuple()函數直接將range()函數循環出來的結果轉換為數值元組。
說明
關于range()函數的詳細介紹請參見4.3.2節。
tuple()函數的基本語法如下:
tuple(data)
其中,data表示可以轉換為元組的數據,其類型可以是range對象、字符串、元組或者其他可迭代類型的數據。
例如,創建一個10~20(不包括20)中所有偶數的元組,可以使用下面的代碼。
tuple(range(10, 20, 2))
運行上面的代碼后,將得到下面的列表。
(10, 12, 14, 16, 18)
說明
使用tuple()函數不僅能通過range對象創建元組,還可以通過其他對象創建元組。
4.刪除元組
對于已經創建的元組,不再使用時,可以使用del語句將其刪除。語法格式如下:
del tuplename
其中,tuplename為要刪除元組的名稱。
說明
del語句在實際開發時,并不常用。因為Python自帶的垃圾回收機制會自動銷毀不用的元組,所以即使我們不手動將其刪除,Python也會自動將其回收。
例如,定義一個名稱為verse的元組,然后再應用del語句將其刪除,可以使用下面的代碼。
01 verse = ("自古逢秋悲寂寥","我言秋日勝春朝","晴空一鶴排云上","便引詩情到碧霄") 02 del verse
場景模擬:假設有一家伊米咖啡館,只提供6種咖啡,并且不會改變。請使用元組保存該咖啡館里提供的咖啡名稱。
【例5.5】 使用元組保存咖啡館里提供的咖啡名稱。(實例位置:資源包\TM\sl\05\05)
在IDLE中創建一個名稱為cafe_coffeename.py的文件,然后在該文件中定義一個包含6個元素的元組,內容為伊米咖啡館里的咖啡名稱,并且輸出該元組,代碼如下:

運行結果如圖5.17所示。

圖5.17 使用元組保存咖啡館里提供的咖啡名稱
5.3.2 訪問元組元素
在Python中,如果想將元組的內容輸出也比較簡單,可以直接使用print()函數。例如,要想打印上面元組中的untitle元組,則可以使用下面的代碼。
print(untitle)
執行結果如下:
('Python', 28, ('人生苦短', '我用Python'), ['爬蟲', '自動化運維', '云計算', 'Web開發'])
從上面的執行結果中可以看出,在輸出元組時,是包括左右兩側的小括號的。如果不想輸出全部元素,也可以通過元組的索引獲取指定的元素。例如,要獲取元組untitle中索引為0的元素,可以使用下面的代碼。
print(untitle[0])
執行結果如下:
Python
從上面的執行結果中可以看出,在輸出單個元組元素時,不包括小括號,如果是字符串,還不包括左右的引號。
另外,對于元組也可以采用切片方式獲取指定的元素。例如,要訪問元組untitle中前3個元素,可以使用下面的代碼。
print(untitle[:3])
執行結果如下:
('Python', 28, ('人生苦短', '我用Python'))
同列表一樣,元組也可以使用for循環進行遍歷。下面通過一個具體的實例演示如何通過for循環遍歷元組。
場景模擬:仍然是伊米咖啡館,這時有客人到了,服務員向客人介紹本店提供的咖啡。
【例5.6】 使用for循環列出咖啡館里的咖啡名稱。(實例位置:資源包\TM\sl\05\06)
在IDLE中創建一個名稱為cafe_coffeename.py的文件,然后在該文件中定義一個包含6個元素的元組,內容為伊米咖啡館里的咖啡名稱,然后應用for循環語句輸出每個元組元素的值,即咖啡名稱,并且在后面加上“咖啡”二字,代碼如下:

運行結果如圖5.18所示。

圖5.18 使用元組保存咖啡館里提供的咖啡名稱
另外,元組還可以使用for循環和enumerate()函數結合進行遍歷。下面通過一個具體的實例演示如何通過for循環和enumerate()函數結合遍歷元組。
說明
enumerate()函數用于將一個可遍歷的數據對象(如列表或元組)組合為一個索引序列,同時列出數據和數據下標,一般在for循環中使用。
【例5.7】 使用元組實現每兩行一句輸出古詩《長歌行》。(實例位置:資源包\TM\sl\05\07)
本實例將在實例5.2的基礎上進行修改,將列表修改為元組,其他內容不變,修改后的代碼如下:

說明
在上面的代碼中,在print()函數中使用“, end=''”表示不換行輸出,即下一條print()函數的輸出內容會和這個內容在同一行輸出。
運行結果如圖5.19所示。

圖5.19 每兩行一句輸出古詩《長歌行》
5.3.3 修改元組
場景模擬:仍然是伊米咖啡館,因為巴西咖啡斷貨,所以店長想要把它換成土耳其咖啡。
【例5.8】 替換巴西咖啡為土耳其咖啡。(實例位置:資源包\TM\sl\05\08)
在IDLE中創建一個名稱為cafe_replace.py的文件,然后在該文件中定義一個包含6個元素的元組,內容為伊米咖啡館里的咖啡名稱,然后修改其中的第5個元素的內容為“土耳其”,代碼如下:

運行結果如圖5.20所示。

圖5.20 替換巴西咖啡為土耳其咖啡出現異常
元組是不可變序列,所以我們不能對它的單個元素值進行修改,但是元組也不是完全不能修改。我們可以對元組進行重新賦值。例如,下面的代碼是允許的。

執行結果如下。
新元組 ('藍山', '卡布奇諾', '曼特寧', '摩卡', '土耳其', '哥倫比亞')
從上面的執行結果可以看出,元組coffeename的值已經改變。
另外,還可以對元組進行連接組合。例如,可以使用下面的代碼實現在已經存在的元組結尾處添加一個新元組。
01 ukguzheng = ('藍山','卡布奇諾','曼特寧','摩卡') 02 print("原元組:",ukguzheng) 03 ukguzheng = ukguzheng + ('巴西','哥倫比亞') 04 print("組合后:",ukguzheng)
執行結果如下。
原元組: ('藍山', '卡布奇諾', '曼特寧', '摩卡') 組合后: ('藍山', '卡布奇諾', '曼特寧', '摩卡', '土耳其', '哥倫比亞')
注意
在進行元組連接時,連接的內容必須都是元組。不能將元組和字符串或者列表進行連接。例如,下面的代碼就是錯誤的。
01 ukguzheng = '藍山','卡布奇諾','曼特寧','摩卡') 02 ukguzheng = ukguzheng + ['巴西','哥倫比亞']
說明
在進行元組連接時,如果要連接的元組只有一個元素,一定不要忘記后面的逗號。例如,使用下面的代碼將生產如圖5.21所示的錯誤。
01 ukguzheng = ('藍山','卡布奇諾','曼特寧','摩卡') 02 ukguzheng = ukguzheng + ('巴西')

圖5.21 在進行元組連接時產生的異常
5.3.4 元組推導式
使用元組推導式可以快速生成一個元組,它的表現形式和列表推導式類似,只是將列表推導式中的中括號“[]”修改為小括號“()”。例如,我們可以使用下面的代碼生成一個包含10個隨機數的元組。
01 import random #導入random標準庫 02 randomnumber = (random.randint(10,100) for i in range(10)) 03 print("生成的元組為:",randomnumber)
執行結果如下:
生成的元組為: <generator object <genexpr> at 0x0000000003056620>
從上面的執行結果中可以看出,使用元組推導式生成的結果并不是一個元組或者列表,而是一個生成器對象,這一點和列表推導式是不同的。要使用該生成器對象,可以將其轉換為元組或者列表。其中,轉換為元組使用tuple()函數,而轉換為列表則使用list()函數。
例如,使用元組推導式生成一個包含10個隨機數的生成器對象,然后將其轉換為元組并輸出,可以使用下面的代碼。

執行結果如下:
轉換后: (76, 54, 74, 63, 61, 71, 53, 75, 61, 55)
要使用通過元組推導器生成的生成器對象,還可以直接通過for循環遍歷或者直接使用__next()__方法進行遍歷。
說明
在Python 2.x中,__next__()方法為next(),也是用于遍歷生成器對象的。
例如,通過生成器推導式生成一個包含3個元素的生成器對象number,然后調用3次__next__()方法輸出每個元素,再將生成器對象number轉換為元組輸出,代碼如下:

上面的代碼運行后,將顯示以下結果。
0 1 2 轉換后: ()
再如,通過生成器推導式生成一個包括4個元素的生成器對象number,然后應用for循環遍歷該生成器對象,并輸出每個元素的值,最后再將其轉換為元組輸出,代碼如下:

執行結果如下:
0 1 2 3 ()
從上面的兩個示例中可以看出,無論通過哪種方法遍歷,如果還想再使用該生成器對象,都必須重新創建一個生成器對象。因為遍歷后,原生成器對象已經不存在了。
5.3.5 元組與列表的區別
元組和列表都屬于序列,而且它們又都可以按照特定順序存放一組元素,類型又不受限制,只要是Python支持的類型都可以。那么它們之間有什么區別呢?
簡單理解:列表類似于我們用鉛筆在紙上寫下自己喜歡的歌曲,寫錯了還可以擦掉。而元組則類似于用鋼筆寫下的歌曲名字,寫上了就擦不掉了,除非換一張紙重寫。
列表和元組的區別主要體現在以下5個方面。
(1)列表屬于可變序列,它的元素可以隨時修改或者刪除,而元組屬于不可變序列,其中的元素不可以修改,除非整體替換。
(2)列表可以使用append()、extend()、insert()、remove()和pop()等方法實現添加和修改列表元素,而元組則沒有這幾個方法,因為不能向元組中添加和修改元素。同樣,也不能刪除元素。
(3)列表可以使用切片訪問和修改列表中的元素。元組也支持切片,但是它只支持通過切片訪問元組中的元素,不支持修改。
(4)元組比列表的訪問和處理速度快。所以如果只需要對其中的元素進行訪問,而不進行任何修改,建議使用元組而不使用列表。
(5)列表不能作為字典的鍵,而元組可以。
- Getting Started with CreateJS
- Learning ASP.NET Core 2.0
- Python進階編程:編寫更高效、優雅的Python代碼
- Learn WebAssembly
- Xamarin.Forms Projects
- Highcharts Cookbook
- R用戶Python學習指南:數據科學方法
- 現代C++編程實戰:132個核心技巧示例(原書第2版)
- Python語言科研繪圖與學術圖表繪制從入門到精通
- C陷阱與缺陷
- Learning Bootstrap 4(Second Edition)
- Mastering Machine Learning with R
- Python計算機視覺與深度學習實戰
- HTML5程序設計基礎教程
- 前端Serverless:面向全棧的無服務器架構實戰