溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

Python3 元組tuple入門基礎(chǔ)

發(fā)布時(shí)間:2020-08-25 09:11:45 來(lái)源:腳本之家 閱讀:146 作者:mdxy-dxy 欄目:開(kāi)發(fā)技術(shù)

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ō)', '元', '組', '不', '能', '改']

這篇文章就介紹到這了,希望大家多多支持億速云。

向AI問(wèn)一下細(xì)節(jié)

免責(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)容。

AI