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