官术网_书友最值得收藏!

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)列表不能作為字典的鍵,而元組可以。

主站蜘蛛池模板: 香格里拉县| 遂平县| 鄂伦春自治旗| 汶上县| 根河市| 常德市| 云林县| 桐乡市| 榆中县| 神池县| 湖州市| 乌兰浩特市| 万盛区| 南江县| 麻江县| 吴忠市| 石景山区| 云和县| 远安县| 揭东县| 久治县| 兰溪市| 镇江市| 万全县| 临城县| 岑巩县| 南漳县| 祁门县| 长阳| 贵定县| 兴化市| 梓潼县| 漠河县| 大英县| 南木林县| 通许县| 河南省| 平乡县| 南京市| 万源市| 静宁县|