您好,登錄后才能下訂單哦!
Python 的元組與列表類似,不同之處在于元組的元素不能修改。
元組使用小括號,列表使用方括號。
元組創建很簡單,只需要在括號中添加元素,并使用逗號隔開即可。
實例(Python 3.0+)
>>>tup1 = ('Baidu', 'jb51', 1997, 2000) >>> tup2 = (1, 2, 3, 4, 5 ) >>> tup3 = "a", "b", "c", "d" # 不需要括號也可以 >>> type(tup3) <class 'tuple'>
創建空元組
tup1 = ()
元組中只包含一個元素時,需要在元素后面添加逗號,否則括號會被當作運算符使用:
實例(Python 3.0+)
>>>tup1 = (50) >>> type(tup1) # 不加逗號,類型為整型 <class 'int'> >>> tup1 = (50,) >>> type(tup1) # 加上逗號,類型為元組 <class 'tuple'>
元組與字符串類似,下標索引從0開始,可以進行截取,組合等。
訪問元組
元組可以使用下標索引來訪問元組中的值,如下實例:
實例(Python 3.0+)
#!/usr/bin/python3 tup1 = ('Baidu', 'jb51', 1997, 2000) tup2 = (1, 2, 3, 4, 5, 6, 7 ) print ("tup1[0]: ", tup1[0]) print ("tup2[1:5]: ", tup2[1:5])
以上實例輸出結果:
tup1[0]: Baidu
tup2[1:5]: (2, 3, 4, 5)
修改元組
元組中的元素值是不允許修改的,但我們可以對元組進行連接組合,如下實例:
實例(Python 3.0+)
#!/usr/bin/python3 tup1 = (12, 34.56) tup2 = ('abc', 'xyz') # 以下修改元組元素操作是非法的。 # tup1[0] = 100 # 創建一個新的元組 tup3 = tup1 + tup2 print (tup3)
以上實例輸出結果:
(12, 34.56, 'abc', 'xyz')
刪除元組
元組中的元素值是不允許刪除的,但我們可以使用del語句來刪除整個元組,如下實例:
實例(Python 3.0+)
#!/usr/bin/python3 tup = ('Baidu', 'Jb51', 1997, 2000) print (tup) del tup print ("刪除后的元組 tup : ") print (tup)
以上實例元組被刪除后,輸出變量會有異常信息,輸出如下所示:
刪除后的元組 tup :
Traceback (most recent call last):
File "test.py", line 8, in <module>
print (tup)
NameError: name 'tup' is not defined
元組運算符
與字符串一樣,元組之間可以使用 + 號和 * 號進行運算。這就意味著他們可以組合和復制,運算后會生成一個新的元組。
Python 表達式 | 結果 | 描述 |
---|---|---|
len((1, 2, 3)) | 3 | 計算元素個數 |
(1, 2, 3) + (4, 5, 6) | (1, 2, 3, 4, 5, 6) | 連接 |
('Hi!',) * 4 | ('Hi!', 'Hi!', 'Hi!', 'Hi!') | 復制 |
3 in (1, 2, 3) | True | 元素是否存在 |
for x in (1, 2, 3): print (x,) | 1 2 3 | 迭代 |
元組索引,截取
因為元組也是一個序列,所以我們可以訪問元組中的指定位置的元素,也可以截取索引中的一段元素,如下所示:
元組:
L = ('Baidu', 'Taobao', 'jb51')
Python 表達式 | 結果 | 描述 |
---|---|---|
L[2] | 'jb51' | 讀取第三個元素 |
L[-2] | 'Taobao' | 反向讀取,讀取倒數第二個元素 |
L[1:] | ('Taobao', 'jb51') | 截取元素,從第二個開始后的所有元素。 |
運行實例如下:
>>> L = ('Baidu', 'Taobao', 'Jb51') >>> L[2] 'Jb51' >>> L[-2] 'Taobao' >>> L[1:] ('Taobao', 'Jb51')
元組內置函數
Python元組包含了以下內置函數
序號 | 方法及描述 | 實例 |
---|---|---|
1 | len(tuple) 計算元組元素個數。 |
>>> tuple1 = ('Baidu', 'Jb51', 'Taobao') >>> len(tuple1) 3 >>> |
2 | max(tuple) 返回元組中元素最大值。 |
>>> tuple2 = ('5', '4', '8') >>> max(tuple2) '8' >>> |
3 | min(tuple) 返回元組中元素最小值。 |
>>> tuple2 = ('5', '4', '8') >>> min(tuple2) '4' >>> |
4 | tuple(iterable) 將可迭代系列轉換為元組。 |
>>> list1= ['Baidu', 'Taobao', 'Jb51', 'Baidu'] >>> tuple1=tuple(list1) >>> tuple1 ('Baidu', 'Taobao', 'Jb51', 'Baidu') |
關于元組是不可變的
所謂元組的不可變指的是元組所指向的內存中的內容不可變。
>>> tup = ('r', 'u', 'n', 'o', 'o', 'b') >>> tup[0] = 'g' # 不支持修改元素 Traceback (most recent call last): File "<stdin>", line 1, in <module> TypeError: 'tuple' object does not support item assignment >>> id(tup) # 查看內存地址 4440687904 >>> tup = (1,2,3) >>> id(tup) 4441088800 # 內存地址不一樣了
從以上實例可以看出,重新賦值的元組 tup,綁定到新的對象了,不是修改了原來的對象。
下面是其他網友的補充
tuple和list非常類似,但是tuple一旦初始化就不能修改,比如同樣是列出同學的名字:
代碼如下:
>>> classmates = ('Michael', 'Bob', 'Tracy')
現在,classmates這個tuple不能變了,它也沒有append(),insert()這樣的方法。其他獲取元素的方法和list是一樣的,你可以正常地使用classmates[0],classmates[-1],但不能賦值成另外的元素。不可變的tuple有什么意義?因為tuple不可變,所以代碼更安全。如果可能,能用tuple代替list就盡量用tuple。tuple的陷阱:當你定義一個tuple時,在定義的時候,tuple的元素就必須被確定下來,比如:
代碼如下:
>>> t = (1, 2) >>> t (1, 2)
如果要定義一個空的tuple,可以寫成():
代碼如下:
>>> t = () >>> t ()
但是,要定義一個只有1個元素的tuple,如果你這么定義:
代碼如下:
>>> t = (1) >>> t 1
定義的不是tuple,是1這個數!這是因為括號()既可以表示tuple,又可以表示數學公式中的小括號,這就產生了歧義,因此,Python規定,這種情況下,按小括號進行計算,計算結果自然是1。
所以,只有1個元素的tuple定義時必須加一個逗號 ,來消除歧義:
代碼如下:
>>> t = (1,) >>> t (1,)
Python在顯示只有1個元素的tuple時,也會加一個逗號,,以免你誤解成數學計算意義上的括號。
在來看一個"可變的"tuple:
代碼如下:
>>> t = ('a', 'b', ['A', 'B']) >>> t[2][0] = 'X' >>> t[2][1] = 'Y' >>> t ('a', 'b', ['X', 'Y'])
這個tuple定義的時候有3個元素,分別是'a','b'和一個list。不是說tuple一旦定義后就不可變了嗎?怎么后來又變了?
別急,我們先看看定義的時候tuple包含的3個元素:當我們把list的元素'A'和'B'修改為'X'和'Y'后,tuple變為:表面上看,tuple的元素確實變了,但其實變的不是tuple的元素,而是list的元素。tuple一開始指向的list并沒有改成別的list,所以,tuple所謂的"不變"是說,tuple的每個元素,指向永遠不變。即指向'a',就不能改成指向'b',指向一個list,就不能改成指向其他對象,但指向的這個list本身是可變的!理解了"指向不變"后,要創建一個內容也不變的tuple怎么做?那就必須保證tuple的每一個元素本身也不能變。
tuple元素不可變有一種特殊情況,當元素是可變對象時。對象內部屬性是可以修改的!tuple的不可變限制只是在一個緯度上:元素的類型。實現理解,tuple的元素所保存的內容(數值或內存地址)是不允許修改的,但地址映射的對象自身是可以修改的。
>>> a = (1,[3,2]) >>> a[1][0] = 1 >>> a (1, [1, 2]) >>> a[1].append(3) >>> a (1, [1, 2, 3]) >>> del a[1][2] >>> a (1, [1, 2]) >>> del a[1] Traceback (most recent call last): File "<stdin>", line 1, in <module> TypeError: 'tuple' object doesn't support item deletion >>> del a[1][1] >>> del a[1][0] >>> a (1, []) >>>
字符串是一種特殊的tuple,支持部分tuple的運算符
>>> a = '12345' >>> a[2] '3' >>> a[3:] '45' >>> type(a) <class 'str'> >>> a*2 '1234512345' >>> 6 in a Traceback (most recent call last): File "<stdin>", line 1, in <module> TypeError: 'in <string>' requires string as left operand, not int >>> a '12345' >>> for x in a: print(x) ... 1 2 3 4 5
Python元組的升級版本 -- namedtuple(具名元組)
因為元組的局限性:不能為元組內部的數據進行命名,所以往往我們并不知道一個元組所要表達的意義,所以在這里引入了 collections.namedtuple 這個工廠函數,來構造一個帶字段名的元組。具名元組的實例和普通元組消耗的內存一樣多,因為字段名都被存在對應的類里面。這個類跟普通的對象實例比起來也要小一些,因為 Python 不會用 __dict__ 來存放這些實例的屬性。
namedtuple 對象的定義如以下格式:
collections.namedtuple(typename, field_names, verbose=False, rename=False)
返回一個具名元組子類 typename,其中參數的意義如下:
typename:元組名稱
field_names: 元組中元素的名稱
rename: 如果元素名稱中含有 python 的關鍵字,則必須設置為 rename=True
verbose: 默認就好
下面來看看聲明一個具名元組及其實例化的方法:
import collections # 兩種方法來給 namedtuple 定義方法名 #User = collections.namedtuple('User', ['name', 'age', 'id']) User = collections.namedtuple('User', 'name age id') user = User('tester', '22', '464643123') print(user)
collections.namedtuple('User', 'name age id') 創建一個具名元組,需要兩個參數,一個是類名,另一個是類的各個字段名。后者可以是有多個字符串組成的可迭代對象,或者是有空格分隔開的字段名組成的字符串(比如本示例)。具名元組可以通過字段名或者位置來獲取一個字段的信息。
輸出結果:
User(name='tester', age='22', id='464643123')
具名元組的特有屬性:
類屬性 _fields:包含這個類所有字段名的元組 類方法 _make(iterable):接受一個可迭代對象來生產這個類的實例 實例方法 _asdict():把具名元組以 collections.OrdereDict 的形式返回,可以利用它來把元組里的信息友好的展示出來
from collections import namedtuple # 定義一個namedtuple類型User,并包含name,sex和age屬性。 User = namedtuple('User', ['name', 'sex', 'age']) # 創建一個User對象 user = User(name='Runoob', sex='male', age=12) # 獲取所有字段名 print( user._fields ) # 也可以通過一個list來創建一個User對象,這里注意需要使用"_make"方法 user = User._make(['Runoob', 'male', 12]) print( user ) # User(name='user1', sex='male', age=12) # 獲取用戶的屬性 print( user.name ) print( user.sex ) print( user.age ) # 修改對象屬性,注意要使用"_replace"方法 user = user._replace(age=22) print( user ) # User(name='user1', sex='male', age=21) # 將User對象轉換成字典,注意要使用"_asdict" print( user._asdict() ) # OrderedDict([('name', 'Runoob'), ('sex', 'male'), ('age', 22)])
以上實例輸出結果為:
('name', 'sex', 'age')
User(name='Runoob', sex='male', age=12)
Runoob
male
12
User(name='Runoob', sex='male', age=22)
OrderedDict([('name', 'Runoob'), ('sex', 'male'), ('age', 22)])
元組的一些特殊需求實現
1、定義元組后,根據不同的情形增加新的元組內容
t1=(1,2,3) for i in range(1,5): t2=(i,) t1=t1+t2 print(t1)
輸出為:
(1, 2, 3, 1, 2, 3, 4)
2、修改元組內的特定位置的值
t1=(1,2,3) for i in range(1,5): t2=(i,) t1=t1+t2 print(t1) l1=list(t1) print(l1) l1[0]=9 print(l1) t1=tuple(l1) print(t1)
輸出為:
(1, 2, 3, 1, 2, 3, 4)
[1, 2, 3, 1, 2, 3, 4]
[9, 2, 3, 1, 2, 3, 4]
(9, 2, 3, 1, 2, 3, 4)
元組所指向的內存實際上保存的是元組內數據的內存地址集合(即 t[0], t[1]...t[n] 的內存地址),且元組一旦建立,這個集合就不能增加修改刪除,一旦集合內的地址發生改變,必須重新分配元組空間保存新的地址集(元組類似 C 語言里的指針數組,只不過這個數組不能被修改)。
測試下面代碼:
print("連接前:") t1=(1,2,"3") t2=("4",5,["d1","d2"]) print("t1=",t1) print("t2=",t2) print("t1:",id(t1)) print("t2:",id(t2)) print("t1[0]:",id(t1[0])) print("t1[1]:",id(t1[1])) print("t1[2]:",id(t1[2])) print("t2[0]:",id(t2[0])) print("t2[1]:",id(t2[1])) print("t2[2]:",id(t2[2])) print("連接后:") t1= t1+t2 print("t1(t1+t2):",id(t1)) print("t1[0]:",id(t1[0])) print("t1[1]:",id(t1[1])) print("t1[2]:",id(t1[2])) print("t1[3]:",id(t1[3])) print("t1[4]:",id(t1[4])) print("t1[5]:",id(t1[5])) t1[5].append("d3") print("t1[5]增加d3:") print("t1[5]=",t1[5]) print("t1[5]:",id(t1[5])) print("t2=",t2)
輸出:
連接前:
t1= (1, 2, '3')
t2= ('4', 5, ['d1', 'd2'])
t1: 1719219799168
t2: 1719219799528
t1[0]: 1378249760
t1[1]: 1378249792
t1[2]: 1719200188208
t2[0]: 1719199042336
t2[1]: 1378249888
t2[2]: 1719219441608
連接后:
t1(t1+t2): 1719222365256
t1[0]: 1378249760
t1[1]: 1378249792
t1[2]: 1719200188208
t1[3]: 1719199042336
t1[4]: 1378249888
t1[5]: 1719219441608
t1[5]增加d3:
t1[5]= ['d1', 'd2', 'd3']
t1[5]: 1719219441608
t2= ('4', 5, ['d1', 'd2', 'd3'])
測試結論:元組 t1 跟 t2 連接并賦值 t1 后,t1 地址發生變化(因地址集合變化),t1[0], t1[1], t1[2], t2[0], t2[1], t2[2] 地址不變且保存在連接后的 t1,元組內數據根據自身類型確定是否可修改值(t1[0]..t1[4] 分別為不可修改的數據類型,t1[5] 為可修改的列表),連接后 t1[5] 跟 t2[2] 地址一樣,t1[5] 變化將會導致 t2[2] 變化。
通過間接方法修改元組:
tuple1 = (1,2,4,5) tuple2 = tuple1[:2] + (3,) + tuple1[2:] print(tuple2)
輸出結果為:
(1, 2, 3, 4, 5)
關于如何修改元組的幾個脫褲子放屁的方法:
# 方法一,賦值修改法 tup = (4,5,6,7,8) tup = ('誰', '說', '元', '組', '不', '能', '改') print(tup) #輸出: ('誰', '說', '元', '組', '不', '能', '改') #方法二、中間變量法 tup = (4, 6, 7,8, 9, 10 ,0) tup = list(tup) list2 = ['誰', '說', '元', '組', '不', '能', '改'] for i in range(7): tup[i] = list2[i] print(tup) #輸出: ['誰', '說', '元', '組', '不', '能', '改']
這篇文章就介紹到這了,希望大家多多支持億速云。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。