Python 進價之路 (三) Tuple元組使用指南

比List更安全的數據類型

大家好,今天爲大家介紹一種更爲安全的Python內置數據類型:tuple(元組),以及它的基礎用法

元組是什麼

元組(tuple)是另一種有序的數據類型,與list比較類似。主要不同的一點是tuple被創建後就不能對其進行修改。所以,tuple與list不同,沒有append(),pop(),insert()這些方法可以使用。獲取元素的方法和list是一樣的,可以通過索引來訪問(也是從0開始的),只不過不能賦值成爲其他的元素。

因爲 tuple不可變,所以代碼更安全。如果可以的話,我們儘量使用tuple代替list。

創建元組
# 定義一個空的tuple
t = ()
print(t)
Out:()

只有1個元素的元組在進行定義的時候,需要加一個逗號 , 來消除歧義,否則定義的就不是一個元組而是元素本身

t1 = (5)
t2 = (5, )
print(t1)
print(t2)

Out: 5
    (5,)
tup4 = (1, 2, 3, 4, 5 );          # 創建時直接賦值
tup5 = "a", "b", "c", "d";        # 創建時直接賦值
print(tup4)
print(tup5)

Out:(1, 2, 3, 4, 5)
     ('a', 'b', 'c', 'd')

一旦創建完,比如tup4 和 tup5 這兩個tuple不能變了,它也沒有append(),insert()這樣的方法。其他獲取元素的方法和List是一樣的,我們可以正常地使用tup4[0],tup5[-1],但不能賦值成另外的元素

訪問元組

訪問元組和List基本一樣,我們可以用切片很容易的查看元組中的元素,這裏不多說,看個小栗子:

tup4 = (1, 2, 3, 4, 5 );
tup5 = "a", "b", "c", "d";
print(tup4[0])
print(tup5[1:3])
print(tup5[::-1])
print(sorted(tup5,reverse=True))   # 使用sorted結果變成了List

Out: 1
    ('b', 'c')
    ('d', 'c', 'b', 'a')
    ['d', 'c', 'b', 'a']
理解元組的不可變

上面已經說過了,元組是不可變的,讓我們來看下面這個小栗子:

    test=('a','b',[1,2,3])
    print(test)
    test[2][0]=100
    print(test)

Out: ('a', 'b', [1, 2, 3])
     ('a', 'b', [100, 2, 3])

不知道有沒有朋友會有疑問? 你不是說元組不能變嘛,這裏怎麼回事,test元組的第三個元素是List,這裏我們修改了List的值結果不是變了嗎?

這裏要給大家說明一下,tuple不可變指的是指向不變,也就是說test[2]永遠指向List[1,2,3],這裏是因爲List可變,所以我們才能修改爲[100,2,3],但是改變前後test[2]的指向沒有發生任何變化,如果我們想要直接改變test[2]的值,就會發現如下錯誤

test[2]=[100,2,3]
Out: TypeError: 'tuple' object does not support item assignment

理解了“指向不變”後,如果我們需要創建一個內容也不變的tuple怎麼做?那就必須保證tuple的每一個元素本身也不能變。

元組的連接

如前面所說,元組是不可改的,但是可以連接,我們可以使用 + 對元組進行連接:

t1 = (2,3,5)
t2 = ('ricequant','python')
t3 = t1 + t2
print(t3)
Out:(2, 3, 5, 'ricequant', 'python')
元組的刪除

元組中的元素不能被刪除,但是我們可以使用 del 刪除整個元組,刪除後可以重新定義,非常簡單,不多說啦

person = ('xiaobai',18,'paris')
print(person)
del person
print(person)

Out: ('xiaobai', 18, 'paris')
     NameError: name 'person' is not defined
元組的解包
這裏是比較有意思的地方,假設我們有一個元組t如下:
t = ('foo', 'bar', 'baz', 'qux')

當我們創建 t 時,實際上就是一個打包,過程展示如下圖:

clipboard.png

那如果是解包呢? 換過來就行了呀

t = ('foo', 'bar', 'baz', 'qux')
(s1, s2, s3, s4) = t
print(s1,s2,s3,s4)

Out:foo bar baz qux

當我們執行(s1, s2, s3, s4) = t的時候,實際發生的情況如下:

clipboard.png

這裏注意一點,如果我們嘗試解包一個元祖是傳遞的變量和元組實際元素數量不相符時會產生錯誤:

(s1, s2, s3) = t
ValueError: too many values to unpack (expected 3)

(s1, s2, s3, s4, s5) = t
ValueError: not enough values to unpack (expected 5, got 4)
元組的互換swap

其實Python裏面還有一種非常簡單的創建元組的方法,那就是逗號,我們如果用逗號分隔一些元素,會自動生成一個元組:

a = 'foo'
b = 'bar'
x= a, b
print(x)

Out:('foo', 'bar')

如果做一個簡單的互換很容易,只要這樣就可以了:

x= b,a
print(x)
Out:('bar', 'foo')
元組的常用方法彙總
  • tup.index(x, [start, [stop]])) 返回元組中start到stop索引中第一個值爲 x的元素在整個列表中的索引。如果沒有匹配的元素就會返回一個錯誤。
  • tup.count(x) 返回 x 在元組中出現的次數。
  • cmp(tuple1, tuple2) 比較元組中兩個元素。
  • len(tuple) 計算元組元素個數。
  • max(tuple) 返回元組中元素最大值。
  • min(tuple) 返回元組中元素最小值。
  • tuple(seq) 將列表轉換爲元組。
  • 元組不提供字符串、列表和字典中的方法。如果相對元組排序,通常先得將它轉換爲列表並使其成爲一個可變對象,才能獲得使用排序方法,或使用sorted內置方法。

總結

今天爲大家講解了我知道的有關tuple的一切,也爲大家展示了一些常規操作,希望能夠幫助到大家,馬上就要到初五了,迎財神,吃餃子!!! 希望大家在2019大吉大利,大發橫財!!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章