Python中元組的概念及應(yīng)用小結(jié)
1.元組的概念
Python中的元組和列表很相似,元組也是Python語言提供的內(nèi)置數(shù)據(jù)結(jié)構(gòu)之一,可以在代碼中直接使用。
元組和列表就像是一個(gè)孿生兄弟,表現(xiàn)形式和使用上都大差不差,但是兩者又有非常明顯的區(qū)別:
- 元組是用小括號(hào)表示的,列表的小括號(hào)還可以直接省略,而列表是使用中括號(hào)表示的,列表的中括號(hào)必須存在。
- 元組的對(duì)象是不可變類型的,也就是說,一旦定義了元組,元組中的數(shù)據(jù)時(shí)不能進(jìn)行更改的。
- 列表中的對(duì)象是可變類型的,定義了列表之后,可以對(duì)列表中的數(shù)據(jù)進(jìn)行增刪改。
一個(gè)元組中也會(huì)定義很多個(gè)數(shù)據(jù)元素,每個(gè)數(shù)據(jù)元素也都可以通過索引的方式獲取,也有正數(shù)、負(fù)數(shù)索引一說。
當(dāng)一個(gè)元組中的數(shù)據(jù)元素是一個(gè)列表時(shí),對(duì)于元素是不允許修改的,但是元素中列表的數(shù)據(jù)時(shí)可以被修改的,有種多維列表的概念,這個(gè)列表在元組中相當(dāng)于一個(gè)子列表,這種情況在下面的操作中會(huì)進(jìn)行演示。
問題來了,既然元組和列表那么的相似,為什么還要設(shè)計(jì)元組這種數(shù)據(jù)結(jié)構(gòu)呢?
其實(shí)也并不難理解,元組的對(duì)象是不可變類型的,一旦創(chuàng)建了元組這種不可變類型的對(duì)象,對(duì)象中的所有數(shù)據(jù)將不能修改,也能夠避免由于修改數(shù)據(jù)從而引發(fā)的Bug錯(cuò)誤,此外,對(duì)于不可變類型的對(duì)象值,在多并發(fā)的環(huán)境下是不需要加鎖的,因?yàn)樗臄?shù)據(jù)不可能會(huì)被改變,因此多并發(fā)的時(shí)候就不需要加鎖,從而避免并發(fā)1修改了數(shù)據(jù)并發(fā)2依舊是舊數(shù)據(jù)。
因此在程序中我們也要盡量使用不可變類型的對(duì)象。
當(dāng)元組中存在一個(gè)列表對(duì)象時(shí),為什么列表中的元素可以被修改?不是說元組的對(duì)象是不可變類型嗎?
因?yàn)橐粋€(gè)元組中有很多個(gè)元素,列表呢只屬于其中的一個(gè)元素,對(duì)應(yīng)一個(gè)索引,對(duì)于元組而言存儲(chǔ)的是引用元素所在內(nèi)存中的地址,存儲(chǔ)引用的內(nèi)存地址是不會(huì)被改變的,也就意味著元組中的元素定義好之后,不能再添加、刪除元組中的對(duì)象元素,但是列表只是元組中的一個(gè)元素,即使修改列表的數(shù)據(jù)也不會(huì)對(duì)元組中的對(duì)象元素有改動(dòng),根據(jù)列表的特點(diǎn)以及列表有自己的數(shù)據(jù)結(jié)構(gòu),就可以對(duì)元組中元素為列表的對(duì)象進(jìn)行修改。
2.元組的基本使用
在前面說了那么多的理論,例如元組用小括號(hào)表示,元組的特性等等,在本小結(jié),我們通過案例來是驗(yàn)證。
2.1.定義一個(gè)元組
元組用小括號(hào)定義。
#定義一個(gè)元組 mytuple = ("jiangxl", 123, "python") print(mytuple) #輸出結(jié)果:('jiangxl', 123, 'python')
定義元組時(shí)小括號(hào)可以省略。
mytuple = "jiangxl", 123, "python" print(mytuple) #輸出結(jié)果:('jiangxl', 123, 'python')
2.2.定義一個(gè)空元組
可以使用()表示一個(gè)空元組,也可以使用tuple()函數(shù)定義一個(gè)空元組
mytuple = () print(mytuple) print(tuple())
2.3.元組的元素是不可變的
元組中的對(duì)象元素是不可變的,已定義好的元組,其中的元素是不能被修改的,如下所示:
mytuple = ("jiangxl", 123, "python") #嘗試修改索引為1的元素 mytuple[1] = 678
直接回拋出錯(cuò)誤:TypeError: ‘tuple’ object does not support item assignment
2.4.當(dāng)元組中的元素是一個(gè)列表時(shí)列表中的元素可變
當(dāng)一個(gè)元組中的元素是一個(gè)列表時(shí),這個(gè)列表相當(dāng)于元組的一個(gè)元素,面向一個(gè)索引,此時(shí)這個(gè)列表相當(dāng)于多維列表中子列表的概念,有自己的索引分布,因此當(dāng)元組中的元素是列表時(shí),這個(gè)列表中的元素可以改變。
元組會(huì)存儲(chǔ)元素在內(nèi)存中的地址,這個(gè)地址是不能被修改的,因此可以保證元素在元組中不會(huì)改變,但是列表是元組中的一個(gè)元素,這個(gè)元素對(duì)象不變就可以,至于元素中的元素就受列表的特性控制了。
#定義一個(gè)元組,其中索引1對(duì)應(yīng)的元素是[1, 2, 3]列表 mytuple2 = ("jiangxl", [1, 2, 3], "python") #修改[1, 2, 3]列表中1元素為123 ''' 首先找到[1, 2, 3]列表所在元組中的元素對(duì)應(yīng)的索引:mytuple2[1] 然后在找到元素1對(duì)應(yīng)在列表中的索引:mytuple2[1][0] ''' mytuple2[1][0] = 123 #打印元組的內(nèi)容觀察是否被修改 print(mytuple2) #輸出結(jié)果:('jiangxl', [123, 2, 3], 'python')
2.5.當(dāng)元組中只定義一個(gè)元素時(shí)的注意事項(xiàng)
當(dāng)在元素中只定義一個(gè)元素時(shí),有一些注意事項(xiàng),即使是只定義一個(gè)元素,也要在元組中至少包含一個(gè)逗號(hào),否則Python就認(rèn)為我們定義的并非是元組,只是一個(gè)字符串。
1)定義元組中只有一個(gè)元素且不加逗號(hào)
當(dāng)定義的元組中只有一個(gè)元素時(shí),并且沒有加逗號(hào),此時(shí)Python認(rèn)為這并不是一個(gè)元組,只是一個(gè)字符串,()括號(hào)也被認(rèn)為是數(shù)學(xué)中的括號(hào)。
#元組中只有一個(gè)元素,且不添加逗號(hào) mytuple = ("jiangxl") #打印這個(gè)元組中的元素 print(mytuple) #輸出結(jié)果:jiangxl #竟然只輸出了一個(gè)字符串,并不是元組的形式,我們打印這個(gè)數(shù)據(jù)的類型 print(type(mytuple)) #輸出結(jié)果:<class 'str'> #發(fā)現(xiàn)只是一個(gè)字符串類型,并不是元組
2)定義元組中只有一個(gè)元素且加逗號(hào)
在元組()中只要有一個(gè)逗號(hào),Python就認(rèn)為這是一個(gè)元組。
mytuple = ("jiangxl",)
3.列表的所有操作同樣適用于元組
元組和列表很類似,幾乎一樣,只不過元組是不可變的類型,列表能實(shí)現(xiàn)的操作,也同樣適用于元組。
理論就不再敘說了,不明白的去看前面列表這類操作的理論,說的非常明白了。
1)元組的切片
#元組的切片 mytuple = ("jiangxl", 123, "python", 111, 22, 45, "abc") print(mytuple[1:4]) #輸出結(jié)果; (123, 'python', 111)
2)查詢?cè)M中某個(gè)元素的索引
#查詢?cè)M中某個(gè)元素的索引 mytuple = ("jiangxl", 123, "python", 111, 22, 45, "abc") print(mytuple.index(123)) #輸出結(jié)果;1
3)使用乘法運(yùn)算符操作列表
#使用乘法運(yùn)算符操作列表 mytuple = ("jiangxl", 123, "python", 111, 22, 45, "abc") mytuple2 = mytuple * 2 print(mytuple2) #輸出結(jié)果:('jiangxl', 123, 'python', 111, 22, 45, 'abc', 'jiangxl', 123, 'python', 111, 22, 45, 'abc')
4)使用加法運(yùn)算符操作列表
#使用加法運(yùn)算符操作列表 mytuple3 = ("abc", "k8s", "jenkins") mytuple4 = (123, 456, 789, 111) print(mytuple3 + mytuple4) #輸出結(jié)果:('abc', 'k8s', 'jenkins', 123, 456, 789, 111)
5)元組之間的比較
元組的比較也是基于元組中的所有元素都是數(shù)字的情況下,才能進(jìn)行比較。
#元組的比較 mytuple5 = (1, 2, 3, 4) mytuple6 = (1, 2, 5, 8, 9) print(mytuple5 < mytuple6) #輸出結(jié)果:True
6)元組的反轉(zhuǎn)
元組是不可變的類型,不能通過方法reverse實(shí)現(xiàn)元組的反轉(zhuǎn),因?yàn)檎{(diào)用類方法會(huì)修改元組本身的元素,所以只能通過reversed函數(shù)實(shí)現(xiàn)反轉(zhuǎn)。
mytuple = ("jiangxl", 123, "python", 111, 22, 45, "abc") print(list(reversed(mytuple))) #輸出結(jié)果:['abc', 45, 22, 111, 'python', 123, 'jiangxl']
7)元組的排序
元組是不可變的類型,不能通過方法sort實(shí)現(xiàn)元組排序,因?yàn)檎{(diào)用類方法會(huì)修改元組本身的元素,所以只能通過sorted函數(shù)實(shí)現(xiàn)排序。
元組進(jìn)行排序時(shí),如果元組中存在字符串類型的元素,那么其他所有的元素?zé)o論什么類型,都需要單獨(dú)用引號(hào)引起來,否則不能排序,會(huì)拋出錯(cuò)誤。
mytuple = (1, 2, 5, 8, 9) ##升序 print(sorted(mytuple)) #輸出結(jié)果:[1, 2, 5, 8, 9] ##降序 print(sorted(mytuple, reverse=True)) #輸出結(jié)果:[9, 8, 5, 2, 1]
4.就是想修改元組中的某個(gè)元素
元組的對(duì)象是不可變類型的,不允許增、刪、改,但是我們就是想改元組的對(duì)象元素,也是有辦法的。
- 重新聲明元組,對(duì)元素進(jìn)行增刪改
- 使用切片截取元組中需要的元素,然后是還有加法運(yùn)算符拼接新的對(duì)象元素。
第一種方法無需演示,懂得都會(huì),重點(diǎn)看第二種方法。
這種方法的核心思想就是:利用切片(保留元組中想要的元素)+拼接(將多個(gè)切片的元組合并)的方式即可對(duì)元組中的元素改變。
需求:
? (“jiangxl”, 123, “python”, 111, 22, 45, “abc”)
有一個(gè)元組,對(duì)象元素如上所示,我想刪掉元組中的“22”和“45”這兩個(gè)對(duì)象元素。
實(shí)現(xiàn)思路:
- 我們都知道元組是不可變的類型,不允許修改其中的元素,但是我們就要反其道而行之,運(yùn)用所學(xué)的知識(shí)實(shí)現(xiàn)這個(gè)需求。
- 想刪掉元組中的“22”和“45”這兩個(gè)對(duì)象元素,可以使用切片的方式將這兩個(gè)元素之外的元素從列表中切出來。
- 由于這兩個(gè)元素前后都有其他元素,一個(gè)切片截取22元素之前的其他元素,一個(gè)切片截取45元素之后的其他元素。
- 最后通過加法運(yùn)算符將兩個(gè)切片合并在一起,形成一個(gè)新的元組,此時(shí)這個(gè)元組中就不包含22”和“45”這兩個(gè)對(duì)象元素。通過切片+拼接的方法就可以將元組中的元素進(jìn)行刪除操作,如果是修改也是同樣的方法:切片+拼接。
代碼如下:
#定義初始元組 ''' 定義好初始元組后,突然想修改元組中的元素了,但是又不想去調(diào)整初始元組,故而通過切片+拼接的方法產(chǎn)生一個(gè)新的元組,也就相當(dāng)于對(duì)元組的元素進(jìn)行改變了。 需求:刪掉元組中的“22”和“45”這兩個(gè)對(duì)象元素 ''' mytuple = ("jiangxl", 123, "python", 111, 22, 45, "abc") ''' 使用切片截取22元素之前的其他元素,無需指定起始索引,從第一個(gè)元素處開始截取,指定結(jié)束索引為4 索引4是元素22的索引,指定結(jié)束元素是4,結(jié)束元素不會(huì)被納入切片 ''' mytuplestart = mytuple[:4] ''' 22元素之前的全部元素都截取出來后,還要對(duì)45之后的元素進(jìn)行截取,因?yàn)槲覀冎皇遣幌胍?2和45了,45之后還有其他的元素 指定開始索引為6,索引為6的元素是abc,完美避開了22和45這兩個(gè)元素,不指定結(jié)束索引,一直切片到最后一個(gè)元素 ''' mytuolestop = mytuple[6:] ''' 使用加法運(yùn)算符將兩個(gè)切片拼接在一起,形成新的元組 ''' mytuplenew = mytuplestart + mytuolestop print(mytuplenew) #輸出結(jié)果:('jiangxl', 123, 'python', 111, 'abc')
到此這篇關(guān)于Python中元組的概念以及應(yīng)用的文章就介紹到這了,更多相關(guān)Python中元組概念內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
利用Python創(chuàng)建第一個(gè)Django框架程序
這篇文章主要介紹了利用Python創(chuàng)建第一個(gè)Django框架程序,文章圍繞主題展開詳細(xì)的內(nèi)容介紹,具有一定的參考價(jià)值,感興趣的小伙伴可以參考一下2022-06-06Python發(fā)送郵件的幾種方式(最全總結(jié)!)
發(fā)送電子郵件是個(gè)很常見的開發(fā)需求,平時(shí)如果有什么重要的信息怕錯(cuò)過,就可以發(fā)個(gè)郵件到郵箱來提醒自己,這篇文章主要給大家介紹了關(guān)于Python發(fā)送郵件的幾種方式,需要的朋友可以參考下2024-03-03利用 Flask 動(dòng)態(tài)展示 Pyecharts 圖表數(shù)據(jù)方法小結(jié)
本文將介紹如何在 web 框架 Flask 中使用可視化工具 pyecharts, 看完本教程你將掌握幾種動(dòng)態(tài)展示可視化數(shù)據(jù)的方法。感興趣的朋友跟隨小編一起看看吧2019-09-09Python實(shí)現(xiàn)網(wǎng)絡(luò)聊天室的示例代碼(支持多人聊天與私聊)
這篇文章主要介紹了Python實(shí)現(xiàn)網(wǎng)絡(luò)聊天室的示例代碼(支持多人聊天與私聊),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2021-01-01使用Python實(shí)現(xiàn)FTP文件自動(dòng)傳輸腳本
這篇文章主要為大家詳細(xì)介紹了如何使用Python實(shí)現(xiàn)FTP文件自動(dòng)傳輸腳本,文中的示例代碼講解詳細(xì),具有一定的借鑒價(jià)值,感興趣的小伙伴可以了解下2023-12-12對(duì)Django的restful用法詳解(自帶的增刪改查)
今天小編就為大家分享一篇對(duì)Django的restful用法詳解(自帶的增刪改查),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2019-08-08Python中10個(gè)常用的內(nèi)置函數(shù)詳解
這篇文章主要為大家介紹了Python常用的內(nèi)置函數(shù),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助2021-12-12Spyder中如何設(shè)置默認(rèn)python解釋器
Spyder作為一款流行的Python IDE,支持用戶自定義Python解釋器,包括虛擬環(huán)境的設(shè)置,通過打開Spyder,選擇“Tools”->“Preferences”,在彈出窗口中選擇“Use the following Python interpreter”后,瀏覽并選擇相應(yīng)的解釋器或虛擬環(huán)境路徑2024-09-09