第4章 列表、元組_第1頁
第4章 列表、元組_第2頁
第4章 列表、元組_第3頁
第4章 列表、元組_第4頁
第4章 列表、元組_第5頁
已閱讀5頁,還剩43頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)

文檔簡介

第4章列表、元組董付國微信公眾號:Python小屋本章學(xué)習(xí)目標(biāo)理解列表和元組的概念與區(qū)別熟練掌握列表和元組對象的常用方法熟練掌握常用內(nèi)置函數(shù)、運算符對列表和元組的操作了解部分標(biāo)準庫與擴展庫對列表和元組的操作熟練掌握列表推導(dǎo)式、生成器表達式的語法和應(yīng)用熟練掌握切片操作理解淺復(fù)制與深復(fù)制的區(qū)別熟練掌握序列解包的語法和應(yīng)用4.1列表列表是包含若干元素的有序連續(xù)內(nèi)存空間,是Python內(nèi)置的有序容器對象或有序序列對象,是Python中最重要的可迭代對象之一。在形式上,列表的所有元素放在一對方括號中,相鄰元素之間使用逗號分隔。在Python中,同一個列表中元素的數(shù)據(jù)類型可以各不相同。下面幾個都是合法的列表對象:[3.141592653589793,9.8,2.718281828459045]['Python','C#','PHP','JavaScript','go','Julia','VB']['spam',2.0,5,3+4j,[10,20],(5,)][['file1',200,7],['file2',260,9]][{8},{'a':97},(1,)][range,map,filter,zip,lambdax:x**6]4.1.1列表創(chuàng)建與刪除>>>data=[1,2,3,4,5]#使用方括號直接創(chuàng)建列表>>>print(data)[1,2,3,4,5]>>>data=list('Python')#把字符串轉(zhuǎn)換為列表>>>print(data)['P','y','t','h','o','n']>>>data=list(range(5))#把range對象轉(zhuǎn)換為列表>>>print(data)[0,1,2,3,4]>>>data=list(map(str,range(5)))#把map對象轉(zhuǎn)換為列表>>>print(data)['0','1','2','3','4']>>>data=list(zip(range(5)))#把zip對象轉(zhuǎn)換為列表>>>print(data)[(0,),(1,),(2,),(3,),(4,)]>>>data=list(enumerate('Python'))#把enumerate對象轉(zhuǎn)換為列表>>>print(data)[(0,'P'),(1,'y'),(2,'t'),(3,'h'),(4,'o'),(5,'n')]4.1.1列表創(chuàng)建與刪除>>>data=list(filter(lambdax:x%2==0,range(10)))#把filter對象轉(zhuǎn)換為列表>>>print(data)[0,2,4,6,8]>>>importrandom>>>random.shuffle(data)

#隨機打亂順序>>>print(data)[2,4,6,0,8]>>>print(sorted(data))

#內(nèi)置函數(shù)sorted()返回列表[0,2,4,6,8]>>>data=random.choices('01',k=20)

#隨機選擇20個元素返回列表,允許重復(fù)>>>print(data)['1','1','0','1','1','0','0','1','0','0','1','1','1','1','1','1','0','0','0','0']>>>data=random.sample(range(100),k=20)

#隨機選擇20個元素返回列表,不允許重復(fù)>>>print(data)[48,5,32,37,7,20,31,69,3,0,88,46,38,39,54,43,14,40,15,66]4.1.1列表創(chuàng)建與刪除#下面一行代碼適用于Python3.9之后的版本#counts參數(shù)用來指定元素的重復(fù)次數(shù),也就是從3個'a'和9個'b'中選擇5個>>>print(random.sample(['a','b'],5,counts=[3,9]))['b','b','a','a','b']>>>print('Beautifulisbetterthanugly.'.split())#分隔字符串,返回列表['Beautiful','is','better','than','ugly.']>>>fromjiebaimportlcut#需要先安裝擴展庫jieba>>>text='列表是包含若干元素的有序連續(xù)內(nèi)存空間,是Python內(nèi)置的有序容器對象或有序序列對象,是Python中最重要的可迭代對象之一。'>>>words=lcut(text)#分詞結(jié)果以列表形式返回>>>print(words)['列表','是','包含','若干','元素','的','有序','連續(xù)','內(nèi)存空間',',','是','Python','內(nèi)置','的','有序','容器','對象','或','有序','序列','對象',',','是','Python','中','最','重要','的','可','迭代','對象','之一','。']4.1.1列表創(chuàng)建與刪除>>>importitertools>>>dir(itertools)#查看模塊中的成員,返回列表['__doc__','__loader__','__name__','__package__','__spec__','_grouper','_tee','_tee_dataobject','accumulate','chain','combinations','combinations_with_replacement','compress','count','cycle','dropwhile','filterfalse','groupby','islice','permutations','product','repeat','starmap','takewhile','tee','zip_longest']>>>importre>>>print(re.findall('\w+','Explicitisbetterthanimplicit.'))#提取所有單詞['Explicit','is','better','than','implicit']>>>print(re.findall('\d+','1234567890ab999c888'))#提取所有數(shù)字子串['1234567890','999','888']4.1.2列表元素訪問列表、元組和字符串屬于有序序列,其中的元素有嚴格的先后順序,可以很確定地說第幾個元素是什么,可以使用整數(shù)作為下標(biāo)來隨機訪問其中任意位置上的元素,也支持使用切片訪問其中的多個元素。列表、元組和字符串都支持雙向索引,有效索引范圍為[-L,L-1],其中L表示列表、元組或字符串的長度。使用正向索引時下標(biāo)0表示第1個元素,下標(biāo)1表示第2個元素,下標(biāo)2表示第3個元素,以此類推;使用反向索引時下標(biāo)-1表示最后1個元素,下標(biāo)-2表示倒數(shù)第2個元素,下標(biāo)-3表示倒數(shù)第3個元素,以此類推。另外,列表屬于Python可迭代對象類型,除支持下標(biāo)和切片之外,也可以使用for循環(huán)從前向后逐個遍歷其中的元素。4.1.2列表元素訪問fromrandomimportsample,seed#設(shè)置隨機數(shù)種子,使得每次運行結(jié)果一樣seed(202208132245)values=[89,92,97,69,81,19]length=len(values)forindexinsample(range(-length,length),5):print(f'{index=},{values[index]=}')運行結(jié)果為:index=-3,values[index]=69index=3,values[index]=69index=-2,values[index]=81index=5,values[index]=19index=2,values[index]=974.1.3列表常用方法方法說明append(object,/)將任意對象object追加至當(dāng)前列表的尾部clear()刪除列表中的所有元素copy()返回當(dāng)前列表對象的淺復(fù)制count(value,/)返回值為value的元素在當(dāng)前列表中的出現(xiàn)次數(shù)extend(iterable,/)將有限長度的可迭代對象iterable中所有元素追加至當(dāng)前列表的尾部insert(index,object,/)在當(dāng)前列表的index位置前面插入對象objectindex(value,start=0,stop=9223372036854775807,/)返回當(dāng)前列表指定范圍中第一個值為value的元素的索引,若不存在值為value的元素則拋出異常pop(index=-1,/)刪除并返回當(dāng)前列表中下標(biāo)為index的元素remove(value,/)在當(dāng)前列表中刪除第一個值為value的元素reverse()對當(dāng)前列表中的所有元素進行原地翻轉(zhuǎn),首尾交換sort(*,key=None,reverse=False)對當(dāng)前列表中的元素進行原地排序4.1.3列表常用方法(1)append()、insert()、extend()列表方法append(object,/)用于向列表尾部追加一個元素,參數(shù)object可以是任意類型的對象,不影響列表引用和原有元素的引用;insert(index,object,/)用于向參數(shù)index指定的列表位置插入一個元素,下標(biāo)index以及后面的所有元素向后移動一個位置,下標(biāo)加1,參數(shù)object可以是任意類型的對象;extend(iterable,/)用于將參數(shù)iterable指定的列表、元組、字典、集合、字符串、map對象、zip對象等任意可迭代對象中的所有元素追加至當(dāng)前列表的尾部,不影響列表引用和原有元素的引用。Python會在列表增加或刪除元素時自動擴展或收縮內(nèi)存,使得元素之間沒有空隙。在列表開頭或中間位置插入元素時,該位置后面的所有元素自動向后移動,索引會發(fā)生變化。4.1.3列表常用方法>>>data=[1,2,3]>>>data.append(4)#使用insert()方法在指定的位置插入元素,該位置及后面所有元素在列表中向后移動>>>data.insert(0,0)>>>data.insert(2,1.5)#insert()方法第一個參數(shù)可以是正整數(shù)或負整數(shù)#如果當(dāng)前列表存在這個位置就在這個位置上插入元素>>>data.insert(-2,2.5)#如果指定的負整數(shù)位置不存在,就在列表頭部插入元素>>>data.insert(-20,-1)#如果指定的正整數(shù)位置不存在,就在列表尾部追加元素>>>data.insert(20,5)>>>print(data)[-1,0,1,1.5,2,2.5,3,4,5]4.1.3列表常用方法#使用extend()方法把列表、元組、字符串、集合#或其他有限長度的可迭代對象中所有元素添加到當(dāng)前列表尾部#如果參數(shù)是字典,默認把字典中的“鍵”添加到當(dāng)前列表尾部>>>data.extend([6,7])>>>data.extend(map(int,'89'))>>>print(data)[-1,0,1,1.5,2,2.5,3,4,5,6,7,8,9]#注意append()與extend()的不同#不管append()方法的參數(shù)是什么對象,都直接追加到當(dāng)前列表尾部>>>data.append([10])>>>print(data)[-1,0,1,1.5,2,2.5,3,4,5,6,7,8,9,[10]]4.1.3列表常用方法(2)pop()、remove()、clear()列表方法pop(index=-1,/)用于刪除并返回下標(biāo)為index的元素,不指定參數(shù)index時默認刪除并返回列表中最后一個元素,如果列表為空或者指定的位置不存在會拋出異常;remove(value,/)用于刪除列表中第一個值與參數(shù)value相等的元素,不存在時拋出異常;clear()用于清空列表中的所有元素。remove()和clear()方法都沒有返回值,pop()方法有返回值。Python會在列表增加或刪除元素時自動擴展或收縮內(nèi)存,使得元素之間沒有空隙。刪除列表非尾部元素時,會使得被刪除元素位置后面的所有元素向前移動,索引會發(fā)生變化。4.1.3列表常用方法>>>data=list('Readabilitycount.')>>>print(data)['R','e','a','d','a','b','i','l','i','t','y','','c','o','u','n','t','.']>>>print(data.pop())#刪除并返回最后一個元素.>>>print(data.pop(3))#刪除并返回下標(biāo)3的元素d>>>print(data.pop(-3))#刪除并返回下標(biāo)-3的元素u>>>print(data)['R','e','a','a','b','i','l','i','t','y','','c','o','n','t']>>>data.remove('i')#刪除列表中第一個字符i>>>print(data)['R','e','a','a','b','l','i','t','y','','c','o','n','t']>>>data.clear()#清空列表,刪除所有元素>>>print(data)[]4.1.3列表常用方法(3)count()、index()列表方法count(value,/)用于返回列表中值為value的元素出現(xiàn)的次數(shù);index(value,start=0,stop=9223372036854775807,/)用于返回值為value的元素在列表中首次出現(xiàn)的位置,如果不存在則拋出異常。方法index()的參數(shù)start和stop用來指定搜索的下標(biāo)范圍,其中start默認值為0表示從頭開始搜索,stop默認值為9223372036854775807(8個字節(jié)能表示的最大正整數(shù),十六進制形式為0x7fffffffffffffff,適用于64位Python)或2147483647(4個字節(jié)能表示的最大正整數(shù),十六進制形式為0x7fffffff,適用于32位Python),分別表示64位和32位允許的最大下標(biāo)范圍。這兩個方法都有返回值,可以將其返回值賦值給變量進行保存后使用,也可以直接輸出或者作為其他函數(shù)的參數(shù)。4.1.3列表常用方法data=[1,2,2,3,3,3,4,4,4,4]print(data.count(4),data.count(8))number=3ifnumberindata:print(data.index(number))#與選擇結(jié)構(gòu)結(jié)合使用else:print('列表中沒有這個元素')number=8try:print(data.index(number))#與異常處理結(jié)構(gòu)結(jié)合使用except:print('列表中沒有這個元素')運行結(jié)果為:403列表中沒有這個元素4.1.3列表常用方法(4)sort()、reverse()列表方法sort(*,key=None,reverse=False)用于按照指定的規(guī)則對列表中所有元素進行排序,其中key參數(shù)與內(nèi)置函數(shù)sorted()、max()、min()的key參數(shù)作用相同,用來指定排序規(guī)則,可以是任意單參數(shù)可調(diào)用對象,不指定排序規(guī)則時默認按照元素的大小直接進行排序;reverse參數(shù)用來指定升序排序還是降序排序,默認升序排序,如果需要降序排序可以指定參數(shù)reverse=True。列表方法reverse()用于原地翻轉(zhuǎn)列表中所有元素。這兩個方法都沒有返回值,類似于ret=lst.sort()這樣的語句都會使得變量ret得到空值None。4.1.3列表常用方法fromrandomimportshuffle,seeddata=list(range(15))print(f'原始數(shù)據(jù):\n{data}')seed(202209092155)shuffle(data)print(f'隨機打亂順序:\n{data}')data.sort(key=str)print(f'按轉(zhuǎn)換為字符串后的大小升序排序:\n{data}')shuffle(data)print(f'隨機打亂順序:\n{data}')#按轉(zhuǎn)換為字符串后的長度升序排序,長度相同的保持原來的相對順序data.sort(key=lambdanum:len(str(num)))print(f'按轉(zhuǎn)換為字符串后的長度升序排序:\n{data}')data.sort(key=lambdanum:len(str(num)),reverse=True)print(f'按轉(zhuǎn)換為字符串后的長度降序排序:\n{data}')shuffle(data)print(f'隨機打亂順序:\n{data}')#不指定排序規(guī)則,按元素本身的大小排序data.sort(reverse=True)print(f'直接按數(shù)值大小降序排序:\n{data}')shuffle(data)print(f'隨機打亂順序:\n{data}')data.reverse()print(f'翻轉(zhuǎn)后的數(shù)據(jù):\n{data}')運行結(jié)果為:原始數(shù)據(jù):[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14]隨機打亂順序:[3,12,2,6,7,9,5,1,8,4,13,0,11,14,10]按轉(zhuǎn)換為字符串后的大小升序排序:[0,1,10,11,12,13,14,2,3,4,5,6,7,8,9]隨機打亂順序:[9,3,12,7,14,4,2,10,8,5,6,13,0,11,1]按轉(zhuǎn)換為字符串后的長度升序排序:[9,3,7,4,2,8,5,6,0,1,12,14,10,13,11]按轉(zhuǎn)換為字符串后的長度降序排序:[12,14,10,13,11,9,3,7,4,2,8,5,6,0,1]隨機打亂順序:[9,13,4,8,0,10,3,1,6,2,5,12,7,11,14]直接按數(shù)值大小降序排序:[14,13,12,11,10,9,8,7,6,5,4,3,2,1,0]隨機打亂順序:[6,4,5,11,1,2,14,10,8,13,7,9,3,0,12]翻轉(zhuǎn)后的數(shù)據(jù):[12,0,3,9,7,13,8,10,14,2,1,11,5,4,6]4.1.3列表常用方法(5)copy()列表方法copy()返回列表對象的淺復(fù)制。所謂淺復(fù)制,是指只對列表中第一級元素(例如,對于列表[[3],[4]],第一級元素為子列表[3]和[4],數(shù)字3和4不是原列表的元素)的引用進行復(fù)制,在淺復(fù)制完成的瞬間,新列表和原列表包含同樣的引用。如果原列表中只包含整數(shù)、實數(shù)、復(fù)數(shù)、元組、字符串、range對象以及map對象、zip對象等可哈希對象(或稱不可變對象),淺復(fù)制和深復(fù)制是一樣的。但是如果原列表中包含列表、字典、集合這樣的不可哈希對象(或稱可變對象),那么淺復(fù)制得到的列表和原列表之間可能會互相影響。4.1.3列表常用方法data=[1,2.0,3+4j,'5',(6,)]#原列表中所有元素都是可哈希對象data_new=data.copy()#得到的新列表與原列表互相不影響data_new[3]=3print(data)print(data_new)data=[[1],[2],[3]]#原列表中包含不可哈希的子列表data_new=data.copy()#淺復(fù)制#直接修改新列表中元素的引用,不影響原列表data_new[1]=3#調(diào)用新列表中可哈希元素的原地操作方法,影響原列表data_new[0].append(4)data[2].extend([5,6,7])print(data)print(data_new)運行結(jié)果為:[1,2.0,(3+4j),'5',(6,)][1,2.0,(3+4j),3,(6,)][[1,4],[2],[3,5,6,7]][[1,4],3,[3,5,6,7]]4.1.3列表常用方法對于包含列表、字典、集合等可變對象的列表,如果想使得復(fù)制得到的新列表和原列表完全獨立、互相不影響,應(yīng)使用標(biāo)準庫copy提供的函數(shù)deepcopy()進行深復(fù)制。fromcopyimportdeepcopydata=[[1],[2],[3]]data_new=deepcopy(data)#深復(fù)制data_new[1]=3#修改新列表元素的引用,不影響原列表data_new[0].append(4)#調(diào)用新列表元素的原地操作方法,不影響原列表data[2].extend([5,6,7])#調(diào)用原列表元素的原地操作方法,不影響新列表print(data)print(data_new)運行結(jié)果為:[[1],[2],[3,5,6,7]][[1,4],3,[3]]4.1.4列表對象支持的運算符(1)加法運算符“+”可以連接兩個列表,得到一個新列表。使用這種方式連接多個列表,會涉及大量元素的復(fù)制,效率較低,不推薦使用。(2)乘法運算符“*”可以用于列表與整數(shù)相乘(或整數(shù)與列表相乘),對列表中的元素進行重復(fù),返回新列表。在使用時需要注意的是,該運算符類似于淺復(fù)制,只對列表中的第一級元素的引用進行重復(fù)。values=[1,2,3]*3values[3]=666#修改特定元素的引用,不影響其他元素print(values)values=[[1,2,3]]*3#內(nèi)部的3個子列表其實是同一個列表的3個引用values[0][1]=888#通過任何1個都可以影響另外2個引用print(values)運行結(jié)果為:[1,2,3,666,2,3,1,2,3][[1,888,3],[1,888,3],[1,888,3]]4.1.4列表對象支持的運算符(3)成員測試運算符in可用于測試列表中是否包含某個元素,包含時返回True,否則返回False。與該運算符相反,notin用于測試列表中是否不包含某個元素,如果不包含就返回True,包含就返回False。當(dāng)作用于列表、元組和字符串時,這兩個運算符具有惰性求值特點并且采用了線性搜索的算法,也就是從前往后逐個遍歷其中的元素,如果遇到滿足條件的元素就返回True不再檢查后面的元素,如果所有元素都不滿足條件就返回False。列表、元組、字符串越長,所需要的平均時間也越長。由于內(nèi)部實現(xiàn)方式不同,in運算符作用于字典和集合時,長度對所需時間的影響非常小。4.1.4列表對象支持的運算符(4)關(guān)系運算符可以用來比較兩個列表的大小,從前向后逐個比較兩個列表中對應(yīng)位置上的元素的值,直到能夠得出明確的結(jié)論為止。關(guān)系運算符具有惰性求值的特點,任何時候只要能夠確定表達式的值,后面的元素就不會再比較了。(5)屬性訪問運算符“.”可以用來訪問列表或其他任意類型對象的方法,也可以用來訪問模塊中的成員。下標(biāo)運算符[]用來獲取列表中指定位置的元素,或者定義切片訪問列表中部分元素。4.1.5列表推導(dǎo)式語法與應(yīng)用列表推導(dǎo)式(listcomprehension,也叫列表解析式)是Python的一種常用語法,可以使用非常簡潔的形式對列表或其他可迭代對象的元素進行遍歷、過濾或再次計算,快速生成滿足特定需求的列表。列表推導(dǎo)式的語法形式為:[expressionforelement1initerable1ifcondition1forelement2initerable2ifcondition2forelement3initerable3ifcondition3...forelementNiniterableNifconditionN]列表推導(dǎo)式在邏輯上等價于一個循環(huán)結(jié)構(gòu),第一個循環(huán)相當(dāng)于最外層的循環(huán),最后一個循環(huán)相當(dāng)于最內(nèi)層的循環(huán)。4.1.5列表推導(dǎo)式語法與應(yīng)用例4-1編寫程序,使用列表模擬向量,使用列表推導(dǎo)式模擬兩個等長向量的加法、減法、內(nèi)積運算以及向量與標(biāo)量之間的除法運算。vector1=[1,3,9,30]vector2=[-5,-17,22,0]print(vector1,vector2,sep='\n')print('向量相加:')print([x+yforx,yinzip(vector1,vector2)])print('向量相減:')print([x-yforx,yinzip(vector1,vector2)])print('向量內(nèi)積:')print(sum([x*yforx,yinzip(vector1,vector2)]))print('向量與標(biāo)量相除:')print([num/5fornuminvector1])運行結(jié)果為:[1,3,9,30][-5,-17,22,0]向量相加:[-4,-14,31,30]向量相減:[6,20,-13,30]向量內(nèi)積:142向量與標(biāo)量相除:[0.2,0.6,1.8,6.0]4.1.6切片語法與應(yīng)用切片(slice)是用來獲取列表、元組、字符串等有序序列中部分元素的一種語法,也適用于range對象,但很少那樣用。在語法形式上,切片使用2個冒號分隔的3個整數(shù)來完成。[start:stop:step]其中start表示切片開始位置,默認為0(step>0時)或-1(step<0時);stop表示切片截止(但不包含)位置,當(dāng)step>0時stop默認為L,當(dāng)step<0時stop默認為-L-1(其中L表示列表長度);step表示切片的步長(默認為1),省略步長時還可以同時省略第二個冒號,寫作[start:stop]。另外,當(dāng)step<0時表示反向切片,這時start應(yīng)該在stop的右側(cè),否則切片為空。4.1.6切片語法與應(yīng)用切片作用于元組和字符串時僅能訪問其中的部分元素,作用于列表時具有最強大的功能。不僅可以使用切片來截取列表中的任何部分返回得到一個新列表,也可以通過切片來修改和刪除列表中元素,甚至可以通過切片操作為列表對象增加元素。本書重點介紹訪問有序序列中部分元素的用法。使用切片可以返回列表中部分元素組成的新列表。當(dāng)切片范圍超出列表邊界時,不會因為下標(biāo)越界而拋出異常,而是簡單地在列表尾部截斷或者返回一個空列表,代碼具有更強的魯棒性。4.1.6切片語法與應(yīng)用>>>values=list('Beautifulisbetterthanugly.')#切片,start、end、step均使用默認值,返回所有元素組成的新列表>>>print(f'{values[:]=}')values[:]=['B','e','a','u','t','i','f','u','l','','i','s','','b','e','t','t','e','r','','t','h','a','n','','u','g','l','y','.']>>>print(f'{values[:3]=}')#下標(biāo)介于[0,3)區(qū)間的元素values[:3]=['B','e','a']>>>print(f'{values[5:9]=}')#下標(biāo)介于[5,9)區(qū)間的元素values[5:9]=['i','f','u','l']>>>print(f'{values[-3:]=}')#最后3個元素values[-3:]=['l','y','.']>>>print(f'{values[::2]=}')#從下標(biāo)0開始,返回偶數(shù)位置上的元素values[::2]=['B','a','t','f','l','i','','e','t','r','t','a','','g','y']#從下標(biāo)0開始,每3個元素取1個,或者說每隔2個取1個>>>print(f'{values[::3]=}')values[::3]=['B','u','f','','','t','r','h','','l']#下標(biāo)介于[6,100)區(qū)間的元素,由于100大于實際長度,在尾部截斷>>>print(f'{values[6:100]=}')values[6:100]=['f','u','l','','i','s','','b','e','t','t','e','r','','t','h','a','n','','u','g','l','y','.']#下標(biāo)大于等于100的所有元素,由于100大于實際長度,返回空列表>>>print(f'{values[100:]=}')values[100:]=[]#-100不在有效下標(biāo)范圍之內(nèi)并且-100小于0,在列表頭部截斷>>>print(f'{values[-100:-21]=}')values[-100:-21]=['B','e','a','u','t','i','f','u','l']4.1.6切片語法與應(yīng)用在使用時要注意的是,切片得到的是原列表的淺復(fù)制。如果原列表中包含列表、字典、集合這樣的可變對象,切片得到的新列表和原列表之間可能會互相影響。>>>data=[[1],[2],[3],[4]]

#包含子列表的列表>>>data_new=data[:2]#返回前兩個元素的引用組成的新列表>>>print(f'{data=}')data=[[1],[2],[3],[4]]>>>print(f'{data_new=}')data_new=[[1],[2]]>>>data_new[0].append(666)#通過data_new可以影響原列表data>>>data_new[1].extend([0,0])>>>print(f'{data=}')data=[[1,666],[2,0,0],[3],[4]]>>>print(f'{data_new=}')data_new=[[1,666],[2,0,0]]4.2元組與生成器表達式在形式上,元組的所有元素放在一對圓括號中,元素之間使用逗號分隔,如果元組中只有一個元素則必須在最后增加一個逗號。嚴格來說,是逗號創(chuàng)建了元組,圓括號只是一種好看的輔助形式??梢园言M看作是輕量級列表或者簡化版列表,支持很多和列表類似的操作,但功能要比列表簡單很多,并且元組定義后其中元素數(shù)量和每個元素的引用都不能發(fā)生改變。4.2.1元組創(chuàng)建#表示顏色的三元組,分別表示紅、綠、藍三個分量的值>>>red=(255,0,0)#測試3是否為三種類型之一的對象>>>print(isinstance(3,(int,float,complex)))True#divmod()函數(shù)返回元組,其中包含整商和余數(shù)>>>print(divmod(60,13))(4,8)>>>text='abcde'#把字符串轉(zhuǎn)換為元組>>>keys=tuple(text)#把map對象轉(zhuǎn)換為元組>>>values=tuple(map(ord,text))>>>print(keys,values,sep='\n')('a','b','c','d','e')(97,98,99,100,101)4.2.1元組創(chuàng)建#zip()函數(shù)返回包含若干元組的zip對象#*表示序列解包,一次性輸出zip對象中的所有元素>>>print(*zip(keys,values),sep=',')('a',97),('b',98),('c',99),('d',100),('e',101)#enumerate()函數(shù)返回包含若干元組的enumerate對象>>>print(*enumerate('Python'),sep=',')(0,'P'),(1,'y'),(2,'t'),(3,'h'),(4,'o'),(5,'n')4.2.1元組創(chuàng)建>>>fromitertoolsimportcombinations,permutations,product#從5個元素中任選3個組成的所有組合>>>print(*combinations(range(5),3),sep=',')(0,1,2),(0,1,3),(0,1,4),(0,2,3),(0,2,4),(0,3,4),(1,2,3),(1,2,4),(1,3,4),(2,3,4)#從5個元素中任選3個的所有排列>>>print(*permutations(range(5),3),sep=',')(0,1,2),(0,1,3),(0,1,4),(0,2,1),(0,2,3),(0,2,4),(0,3,1),(0,3,2),(0,3,4),(0,4,1),(0,4,2),(0,4,3),(1,0,2),(1,0,3),(1,0,4),(1,2,0),(1,2,3),(1,2,4),(1,3,0),(1,3,2),(1,3,4),(1,4,0),(1,4,2),(1,4,3),(2,0,1),(2,0,3),(2,0,4),(2,1,0),(2,1,3),(2,1,4),(2,3,0),(2,3,1),(2,3,4),(2,4,0),(2,4,1),(2,4,3),(3,0,1),(3,0,2),(3,0,4),(3,1,0),(3,1,2),(3,1,4),(3,2,0),(3,2,1),(3,2,4),(3,4,0),(3,4,1),(3,4,2),(4,0,1),(4,0,2),(4,0,3),(4,1,0),(4,1,2),(4,1,3),(4,2,0),(4,2,1),(4,2,3),(4,3,0),(4,3,1),(4,3,2)#3個字符串'abc'中元素的笛卡爾積>>>print(*product('abc',repeat=3),sep=',')('a','a','a'),('a','a','b'),('a','a','c'),('a','b','a'),('a','b','b'),('a','b','c'),('a','c','a'),('a','c','b'),('a','c','c'),('b','a','a'),('b','a','b'),('b','a','c'),('b','b','a'),('b','b','b'),('b','b','c'),('b','c','a'),('b','c','b'),('b','c','c'),('c','a','a'),('c','a','b'),('c','a','c'),('c','b','a'),('c','b','b'),('c','b','c'),('c','c','a'),('c','c','b'),('c','c','c')4.2.1元組創(chuàng)建#需要安裝擴展庫pillow,其中的Image是圖像處理常用模塊>>>fromPILimportImage#打開一個圖像文件>>>im=Image.open('test.jpg')#獲取并輸出指定位置像素的顏色值#(300,400)中的數(shù)字分別表示像素橫坐標(biāo)和縱坐標(biāo)#返回的結(jié)果元組中元素分別是紅、綠、藍三原色分量的值>>>print(im.getpixel((300,400)))(52,52,52)4.2.2元組方法與常用操作>>>data=(1,2,3,4)>>>print(len(data))#元組長度,即元素數(shù)量4>>>print(max(data),min(data))

#最大值,最小值41>>>print(data[0])#元組中下標(biāo)為0的元素1>>>print(data[-2])#元組中倒數(shù)第2個元素3>>>print(data+(5,6))#使用加號連接兩個元組(1,2,3,4,5,6)>>>print(data*3)#元組與整數(shù)相乘,返回新元組(1,2,3,4,1,2,3,4,1,2,3,4)>>>print(data[2:])#切片,元組中下標(biāo)2以及后面的元素(3,4)>>>print(data.count(3))#元組中元素3出現(xiàn)的次數(shù)1>>>print(data.index(3))#元組中元素3首次出現(xiàn)的下標(biāo)24.2.3元組與列表的區(qū)別元組是不可變的,定義之后不可以修改元組中元素的數(shù)量和引用,也不支持任何增加、刪除、修改元素的操作。元組在內(nèi)部實現(xiàn)上不允許修改其元素的引用,從而使得代碼更加安全,例如調(diào)用函數(shù)時使用元組傳遞參數(shù)可以防止在函數(shù)中修改元組,使用列表則無法保證這一點。元組也支持切片操作,但是只能通過切片來訪問元組中的元素,不允許使用切片來修改元組中元素的值,也不支持使用切片操作來為元組增加或刪除元素。列表支持使用切片進行元素的訪問、增加、刪除、修改等操作。元組的訪問速度比列表略快,開銷略小。如果定義了一系列常量值,主要用途只是對它們進行遍歷或其他類似操作,那么一般建議使用元組而不用列表。最后,作為不可變序列,與整數(shù)、字符串一樣,元組可以作為字典的鍵,也可以作為集合的元素。列表不能當(dāng)作字典鍵使用,也不能作為集合中的元素,因為列表是可變的。4.2.4生成器表達式生成器表達式(generatorexpression)的形式與列表推導(dǎo)式類似,只不過生成器表達式使用圓括號作為定界符。與列表推導(dǎo)式本質(zhì)的區(qū)別是,生成器表達式的結(jié)果是一個生成器對象,屬于迭代器,具有惰性求值的特點。生成器表達式的空間占用非常少,尤其適合大數(shù)據(jù)處理。生成器對象可以根據(jù)需要將其轉(zhuǎn)化為列表、元組、字典、集合,也可以使用內(nèi)置函數(shù)next()從前向后逐個訪問其中的元素,或者直接使用for循環(huán)來遍歷其中的元素。4.2.4生成器表達式#創(chuàng)建生成器對象>>>g=(i**2foriinrange(10))#把生成器對象轉(zhuǎn)換為列表,用完了生成器對象中的所有元素>>>list(g)[0,1,4,9,16,25,36,49,64,81]#此時生成器對象中已經(jīng)沒有任何元素,轉(zhuǎn)換得到空列表>>>list(g)[]#重新創(chuàng)建生成器對象>>>g=(i**2foriinrange(10))#生成器對象中包含4,返回True,不再檢查后面的元素#這時用完了原來的生成器對象中元素4以及前面的所有元素>>>4ingTrue#從原來生成器對象中元素4的下一個元素開始檢查#因為生成器對象中不再包含元素4,所以檢查完所有元素才能得出結(jié)論#這次測試用完了生成器對象中的所有元素>>>4ingFalse#此時生成器對象中已經(jīng)沒有任何元素>>>49ingFalse4.3序列解包序列解包(sequenceunpack)的本質(zhì)是對多個變量同時賦值,要求等號左側(cè)變量的數(shù)量和等號右側(cè)可迭代對象中元素的數(shù)量必須一致。#同時給多個變量賦值,等號右側(cè)雖然沒有圓括號,但實際是個元組#元組、列表、字符串屬于有序序列,其中的元素有嚴格的先后順序#序列解包時把其中元素的引用按順序依次賦值給等號左側(cè)的變量>>>x,y,z=1,2,3>>>x,y,z=[1,2,3]#交換兩個變量的引用,也可以簡單地理解為交換兩個變量的值>>>x,y=y,x#等號右側(cè)可以是range對象>>>x,y,z=range(3)#等號右側(cè)可以是ma

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論