![《Python程序設(shè)計(jì)》課件第二章-復(fù)合數(shù)據(jù)類型_第1頁](http://file4.renrendoc.com/view12/M0A/15/3E/wKhkGWZLKI2AW3C7AABSkqFuxmI195.jpg)
![《Python程序設(shè)計(jì)》課件第二章-復(fù)合數(shù)據(jù)類型_第2頁](http://file4.renrendoc.com/view12/M0A/15/3E/wKhkGWZLKI2AW3C7AABSkqFuxmI1952.jpg)
![《Python程序設(shè)計(jì)》課件第二章-復(fù)合數(shù)據(jù)類型_第3頁](http://file4.renrendoc.com/view12/M0A/15/3E/wKhkGWZLKI2AW3C7AABSkqFuxmI1953.jpg)
![《Python程序設(shè)計(jì)》課件第二章-復(fù)合數(shù)據(jù)類型_第4頁](http://file4.renrendoc.com/view12/M0A/15/3E/wKhkGWZLKI2AW3C7AABSkqFuxmI1954.jpg)
![《Python程序設(shè)計(jì)》課件第二章-復(fù)合數(shù)據(jù)類型_第5頁](http://file4.renrendoc.com/view12/M0A/15/3E/wKhkGWZLKI2AW3C7AABSkqFuxmI1955.jpg)
版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
第2章復(fù)合數(shù)據(jù)類型復(fù)合數(shù)據(jù)類型由程序設(shè)計(jì)語言提供的基本數(shù)據(jù)類型以一定方式組合而成,Python中常用的復(fù)合數(shù)據(jù)結(jié)構(gòu)有列表(list)、元組(tuple)、字典(dict)、集合(set)、字符串(str)等序列(list)元組(tuple)字典(dict)集合(set)復(fù)合數(shù)據(jù)類型squares=
[1,
4,
9,
16,
25]t=
((12345,
54321,
'hello!'),
(1,
2,
3,
4),
(3.14,))d
=
{'Name':
'Wang',
'Age':
7,
'Class':
'First'}s=
{1,
2,
3}列表列表(list)是若干個(gè)對象的有序聚合列表中存儲的每一個(gè)對象稱為一個(gè)元素,在定義列表時(shí),將所有元素置于一對方括號中,并用逗號進(jìn)行分隔列表中各個(gè)元素的數(shù)據(jù)類型可以相同,也可以不同,可同時(shí)包含整型、浮點(diǎn)型、字符串等任意類型的對象,甚至是另一個(gè)列表可以通過索引的方式訪問列表的元素,索引由一對方括號和其中表示下標(biāo)的數(shù)字組成第一個(gè)元素的下標(biāo)為0,第二個(gè)元素的下標(biāo)為1,依此類推除正向索引外,Python還支持反向索引,最后一個(gè)元素的下標(biāo)為?-1,倒數(shù)第二個(gè)元素的下標(biāo)為?-2,依此類推,例如:列表的基本操作列表屬于可變對象(mutableobject),這里的可變(mutable)指的是一個(gè)對象在創(chuàng)建之后其值仍可被修改,而與之相對的不可變(immutable)是指一個(gè)對象一經(jīng)創(chuàng)建就不可修改可以通過下標(biāo)索引配合賦值操作來改變列表中的元素如果使用切片操作,即用冒號分隔兩個(gè)下標(biāo)值,分別代表起始下標(biāo)(包含)和終止下標(biāo)(不包含),則可以改變列表的長度,甚至是清空列表中所有的元素,使其成為空列表,空列表的長度為零,例如:列表的基本操作可以使用del命令配合索引或切片操作刪除列表中的一個(gè)或多個(gè)元素,也可以通過del命令加列表名刪除整個(gè)列表,例如:列表的基本操作可以使用“+”運(yùn)算符連接兩個(gè)列表,雖然這種方法在形式上看是向原列表末尾添加元素,然而實(shí)際上在經(jīng)過“+”運(yùn)算之后,原列表沒有變化,而是由Python自動創(chuàng)建了一個(gè)新列表,并將原列表中的元素和另一列表中的元素依次復(fù)制到新列表中,類似的操作還有“*”運(yùn)算,其返回一個(gè)新列表,而不改變原列表,例如:列表的基本操作可以使用運(yùn)算符in判斷一個(gè)元素是否存在于列表中,返回結(jié)果為布爾型的True或False運(yùn)算符in也可與for循環(huán)語句一同使用,用于遍歷列表中的每一個(gè)元素,例如:列表的基本操作為了遍歷列表,還可以依據(jù)列表長度,使用內(nèi)置函數(shù)range()生成從0至列表長度減1的序列,再將該序列中的元素作為索引操作的下標(biāo)使用,例如:也可以通過內(nèi)置函數(shù)enumerate()同時(shí)獲得列表中的元素和其對應(yīng)的下標(biāo),例如:列表的基本操作除了索引、切片以及一些內(nèi)置函數(shù)外,大多數(shù)對列表的操作要通過列表對象自身提供的一系列方法來實(shí)現(xiàn),所謂方法(method),只不過是一些函數(shù),這些函數(shù)依附于特定的對象并對這些對象進(jìn)行操作要調(diào)用某一對象的方法,需使用點(diǎn)號操作符“.”,并采用形如object.method()的語法對象調(diào)用方法之后的結(jié)果可分兩種情況一種是沒有返回值(實(shí)際返回了Python中特有的空對象None),但對象本身得到了修改另一種是以函數(shù)返回值的形式返回調(diào)用結(jié)果,但對象本身保持不變列表的常用方法方法說明list.append(x)將對象x添加至列表list尾部list.extend(x)將序列x中的所有元素依次添加至列表list尾部list.insert(index,x)在列表指定位置index處添加對象xlist.pop([index])刪除并返回列表對象指定位置的元素list.remove(x)在列表list中刪除首次出現(xiàn)的指定元素xlist.clear()刪除列表中的所有元素,但保留列表對象list.index(x)返回值為x的首個(gè)元素的下標(biāo)list.count(x)返回指定元素x在列表list中的出現(xiàn)次數(shù)list.sort()對列表元素進(jìn)行原地排序list.reverse()對列表元素進(jìn)行原地逆序list.copy()返回列表對象的淺拷貝(shallowcopy)列表的常用方法為了向列表尾部添加元素,應(yīng)該使用列表對象的append()方法append()方法沒有返回值,但會修改原列表(所謂的原地修改)由于無須生成新的列表對象,因此append()方法的效率要高于使用“+”運(yùn)算符的連接操作,以下代碼分別對append()方法和“+”運(yùn)算符進(jìn)行了10000次調(diào)用,并簡單計(jì)時(shí),輸出的結(jié)果是以秒為單位的運(yùn)行時(shí)間,使用append()方法要比“+”運(yùn)算符快100倍以上,因此,向列表末尾添加元素應(yīng)盡量使用列表的append()方法列表的常用方法importtime
x=
[]start=time.time()foriin
range(10000):x.append(i)print("%f"
%
(time.time()
-start))
y=
[]start=time.time()foriin
range(10000):y=y+
[i]print("%f"
%
(time.time()
-start))列表的extend()方法同樣可以用于向列表末尾追加元素與append()方法將待添加的對象作為一個(gè)整體一次性加入原列表末尾不同,extend()方法是將一個(gè)序列中的對象依次添加到原列表末尾extend()方法同樣對列表進(jìn)行原地修改,沒有返回值,試比較下例中添加同一個(gè)列表對象時(shí)append()和extend()方法調(diào)用結(jié)果的區(qū)別:列表的常用方法列表對象的insert(index,item)方法將元素item添加至由參數(shù)index指定的列表下標(biāo)位置之前insert()方法對列表進(jìn)行原地修改,沒有返回值,例如:應(yīng)盡量從列表尾部進(jìn)行元素的增加與刪除操作,使用列表的insert()方法可以在列表的任意位置插入元素,但在列表頭部及中間位置插入時(shí)會涉及插入位置之后的存儲內(nèi)容的移動,較為耗時(shí);使用remove()方法移除指定元素、使用pop()方法彈出列表非尾部元素以及使用del命令刪除列表非尾部元素時(shí)都有類似的問題列表的常用方法列表對象的pop([index])方法刪除并返回指定位置下標(biāo)index處的元素如果不提供下標(biāo)index作為參數(shù),則刪除并返回列表中最后一個(gè)元素如果下標(biāo)索引超出了列表的范圍,則產(chǎn)生異常,例如:列表的常用方法使用列表對象的remove(item)方法刪除列表中首次出現(xiàn)的指定元素item,如果列表中不存在該元素,則會產(chǎn)生異常pop()方法和remove()方法都修改了原列表,但pop()方法有返回值,而remove()方法沒有返回值,例如:列表的常用方法在調(diào)用pop()方法和remove()方法時(shí)會造成列表長度的收縮,由此帶來的元素位置索引的變化有時(shí)會產(chǎn)生出乎意料的結(jié)果,如使用不當(dāng),可能帶來難以察覺的錯(cuò)誤使用“在循環(huán)內(nèi)多次調(diào)用remove()”這樣的方法刪除列表中所有的指定元素,其結(jié)果的正確與否與輸入數(shù)據(jù)有關(guān),當(dāng)待刪除的元素連續(xù)出現(xiàn)時(shí),就會出現(xiàn)錯(cuò)誤,例如:右側(cè)的列表中有兩個(gè)連續(xù)的1,當(dāng)在for循環(huán)中反復(fù)調(diào)用列表的remove()方法刪除列表中的元素1時(shí),列表的長度變短,剩余元素的索引值發(fā)生變化;而for循環(huán)通過對索引值逐步加1的方式遍歷列表,由此原列表中倒數(shù)第二個(gè)1被for循環(huán)“跳過”并遺留在了結(jié)果中列表的常用方法由此可見,在遍歷列表的過程中同時(shí)改變列表的長度是有風(fēng)險(xiǎn)的一種正確的做法是先生成一個(gè)原列表的“拷貝”,這是一個(gè)獨(dú)立于原列表的新對象,然后在遍歷該復(fù)制的對象的同時(shí)修改原列表,例如:更好的方法是使用列表推導(dǎo)式,其效率更高,也更符合Python代碼的風(fēng)格,例如:列表的常用方法列表的clear()方法用于清空列表中的所有元素原列表對象在調(diào)用clear()方法之后仍存在,只是變成空列表與list.clear()等價(jià)的是語句dellist[:],執(zhí)行之后會將原列表變成一個(gè)空列表,這里的del是Python的一個(gè)關(guān)鍵字,del語句還可以刪除列表中指定位置上的元素,也可以直接刪除列表對象,例如:列表的常用方法調(diào)用內(nèi)置函數(shù)list()而不提供參數(shù)將生成空列表,這與使用不包含任何內(nèi)容的一對空方括號“[]”作用相同,例如:列表對象的index(item)方法獲取指定元素item首次出現(xiàn)的下標(biāo),若列表對象中不存在指定元素,則產(chǎn)生異常,例如:列表的常用方法列表對象的count(item)方法統(tǒng)計(jì)指定元素item在列表對象中出現(xiàn)的次數(shù),例如:列表的常用方法列表對象的sort()方法對列表元素進(jìn)行原地排序原地排序指的是排序后不產(chǎn)生新對象,而是直接更改原列表中元素的順序sort()方法默認(rèn)以升序排序,可以使用關(guān)鍵字參數(shù)reverse=True令其以降序排序還可以使用關(guān)鍵字參數(shù)key指定帶有一個(gè)參數(shù)的函數(shù),用于從每個(gè)列表元素中提取比較鍵(例如,key=str.lower),對應(yīng)于列表中每一項(xiàng)的鍵會被計(jì)算一次,然后在整個(gè)排序過程中使用,例如:列表的常用方法內(nèi)置函數(shù)sorted()同樣可以用于排序與列表對象的sort()方法進(jìn)行原地排序不同,內(nèi)置函數(shù)sorted()不改變原列表,而將排序結(jié)果以一個(gè)新的列表對象的形式返回,例如:sort()方法對列表進(jìn)行原地修改,并沒有返回值;內(nèi)置函數(shù)sorted(),需注意其沒有修改原列表,排序結(jié)果必須由另一個(gè)變量接收列表的常用方法列表推導(dǎo)式(listcomprehension)是Python的一種獨(dú)特語法,用于根據(jù)給定的規(guī)則由一個(gè)序列構(gòu)造出一個(gè)新的列表,其具有語法簡潔明了、代碼可讀性強(qiáng)、運(yùn)行效率高等優(yōu)點(diǎn)列表推導(dǎo)式由一對方括號界定,內(nèi)部從左至右依次是一個(gè)表達(dá)式、一個(gè)for語句以及零個(gè)或多個(gè)for或if語句執(zhí)行列表推導(dǎo)式會產(chǎn)生一個(gè)新列表,新列表中的元素是將列表推導(dǎo)式中的規(guī)則作用在序列上的結(jié)果,例如,為了將0~9共10個(gè)數(shù)分別進(jìn)行平方運(yùn)算并將結(jié)果存儲在一個(gè)列表中,可使用如下列表推導(dǎo)式:列表推導(dǎo)式對于任意列表推導(dǎo)式,總可以將其改寫成具有相同功能的for循環(huán)語句,但是,列表推導(dǎo)式的執(zhí)行效率要高于for循環(huán),并且列表推導(dǎo)式更符合Python的編程風(fēng)格,在實(shí)踐中應(yīng)當(dāng)盡可能多地使用列表推導(dǎo)式上頁列表推導(dǎo)式與如下的for循環(huán)語句等價(jià):列表推導(dǎo)式列表推導(dǎo)式還可以包含多個(gè)for循環(huán)和if條件判斷語句,以完成復(fù)雜的操作如下的列表推導(dǎo)式將兩個(gè)列表中不相等的元素組合起來構(gòu)成新列表:列表推導(dǎo)式元組元組(tuple)是任意對象組成的序列,其內(nèi)部元素按插入的先后順序從左至右排列,這一點(diǎn)與列表相同與列表不同的是,元組不支持原地修改,即元組一經(jīng)創(chuàng)建,其中的元素用任何方式都無法改變,這意味著其長度也是固定的,不能增加或縮短定義元組時(shí)可以將其元素放在一對圓括號內(nèi),元素間用逗號分隔當(dāng)單獨(dú)定義元組時(shí),左右圓括號并非必需,但習(xí)慣上會加上,以增加可讀性當(dāng)元組作為參數(shù)用于其他表達(dá)式中時(shí),圓括號不能省略當(dāng)元組只含一個(gè)元素時(shí),該元素后的逗號必不可少如要定義空元組,可以使用不包含任何內(nèi)容的一對空圓括號“()”或內(nèi)置函數(shù)tuple(),例如:元組的基本操作元組支持下標(biāo)索引和切片操作,可以使用下標(biāo)索引或切片操作訪問元組中的元素,但無法改變其值,這是由于元組中的數(shù)據(jù)一經(jīng)定義就不能更改正因如此,元組沒有append()、extend()和insert()等方法,無法向元組中添加元素;也沒有remove()、pop()和clear()方法,不能從元組中刪除元素,只能使用del語句一次性刪除整個(gè)元組對象,例如:元組的基本操作元組對象仍有count()和index()方法,它們的作用與列表中的相同,調(diào)用后不會修改元組對象,例如:元組對象沒有sort()和reverse()方法,但內(nèi)置函數(shù)sorted()和reversed()可以接收元組作為輸入并將結(jié)果作為新對象返回內(nèi)置函數(shù)sorted()和reversed()要求輸入的第一個(gè)參數(shù)是一個(gè)序列對象,列表、元組及字符串等都是序列對象,因此sorted()和reversed()對它們都適用,如:元組的基本操作直觀上看,元組與列表類似,只增加了“可讀不可寫”的限制,既然有了列表,為什么還需要元組?元組必不可少的原因在于,元組是不可變的,這意味著元組一旦創(chuàng)建,就不能用新值替換它其中的任何元素這種不可變性提供了一種完整性保障:如果一組元素不應(yīng)被修改,那么使用元組進(jìn)行存儲就完全杜絕了其被修改的可能此外,一些操作和表達(dá)式只接受元組,例如,只有不可變對象可以作為字典的鍵,因此只能使用元組而非列表,字符串格式化中的值替換也只能使用元組,例如:元組的基本操作對象在被創(chuàng)建之后,其值仍能被改變,這樣的對象稱為可變的(mutable);反之,不能改變其值的對象稱為不可變的(immutable)Python中的可變對象有列表、字典、集合,不可變對象有元組、字符串、整數(shù)、浮點(diǎn)數(shù)、布爾型等可變對象與不可變對象列表、元組、字典、集合、字符串等都屬于復(fù)合數(shù)據(jù)類型,可以將其理解成用于裝載其他對象的容器如果一個(gè)列表包含一個(gè)元組作為它的元素,那么雖然元組是不可變的,但頂層容器即列表仍是可變的不可變的元組也可以包含可變的列表,該元組容器仍然被認(rèn)為是不可變的要判斷復(fù)合數(shù)據(jù)類型的對象是否可變,只需依據(jù)其頂層容器的可變性即可,例如:可變對象與不可變對象對于整型、浮點(diǎn)型、布爾型等基本數(shù)據(jù)類型而言,將其歸為不可變對象在初學(xué)者看來也許有違常理,因?yàn)閯?chuàng)建一個(gè)整型變量后再更改其值是很常見的操作,這里的關(guān)鍵是要區(qū)分Python中的變量(variable)和對象(object)對于a=1這樣的語句,1是整型對象,而a是變量Python在執(zhí)行語句a=1時(shí)會先在內(nèi)存中生成對象1,再用變量a引用對象1,這在用戶看來就是將整數(shù)1賦給了變量a當(dāng)使用a=2再次賦值時(shí),Python不會改變對象1的值,而是在內(nèi)存中另外開辟空間用以生成新的對象2,然后用變量a引用新的對象2,在此過程中,整型對象1保持不變,例如:可變對象與不可變對象上頁示例中使用了內(nèi)置函數(shù)id(),其接收一個(gè)對象作為參數(shù),返回作為該對象唯一標(biāo)識的一串?dāng)?shù)字,這串?dāng)?shù)字對應(yīng)該對象在內(nèi)存中的地址可見,對變量a第二次賦值后,其引用的對象的地址發(fā)生了變化,這就證明整型對象一經(jīng)創(chuàng)建,其值不能改變,因此整型對象是不可變的可變對象與不可變對象字典字典(dict)是鍵值對的可變集合與用整數(shù)下標(biāo)作為索引的列表不同,字典以鍵為索引,鍵可以是任意不可變類型,通常是數(shù)字或字符串如果一個(gè)元組只包含字符串、數(shù)字或其他元組,那么該元組也可以用作鍵;但如果元組直接或間接地包含可變對象,那么它就不能用作鍵字典的基本操作定義字典時(shí),每個(gè)項(xiàng)目(item)的鍵(key)和值(value)都要用冒號分隔,形如key:value(好的書寫習(xí)慣是冒號之前無空格,冒號之后加一個(gè)空格);項(xiàng)目之間用逗號分隔,所有的項(xiàng)目放在一對大括號“{}”中,字典中的鍵不允許重復(fù)如要?jiǎng)?chuàng)建空字典,可以使用不包含任何內(nèi)容的一對空大括號“{}”或調(diào)用內(nèi)置函數(shù)dict(),例如:字典的基本操作內(nèi)置函數(shù)dict()提供了多種創(chuàng)建字典對象的方法,如可以將作為鍵的字符串以函數(shù)關(guān)鍵值參數(shù)的形式傳入,但是,對于不是字符串的鍵不能這樣做,例如:字典的基本操作可以將鍵和值配對,將其存儲成序列,再將序列作為參數(shù)傳給內(nèi)置函數(shù)dict()這種方法還常與內(nèi)置函數(shù)zip()配合,以dict(zip(key_list,value_list))的形式使用,用于根據(jù)鍵的列表和值的列表創(chuàng)建字典對象(鍵列表和值列表中的元素需要一一對應(yīng)),這提供了一種在程序運(yùn)行中動態(tài)地創(chuàng)建字典的方法,例如:字典的基本操作可以使用字典的dict.fromkeys()方法根據(jù)給定的鍵的序列生成字典對象,所生成字典的所有值均為None,該方法一般用于初始化字典通過傳入第二個(gè)參數(shù),可以指定生成字典的默認(rèn)值,例如:要訪問字典中的項(xiàng)目,可以將鍵放入一對方括號中作為索引,以返回字典中相應(yīng)的值,若鍵不存在則產(chǎn)生異常,例如:字典的基本操作可以通過指定鍵的方式為字典賦值,若鍵存在,則會修改該鍵對應(yīng)的值;若鍵不存在,則向字典中添加一個(gè)新的鍵值對,例如:為了判斷一個(gè)項(xiàng)目是否在字典中,可使用Python的成員關(guān)系運(yùn)算符in,值得注意的是,只應(yīng)該對字典的鍵進(jìn)行判斷,因?yàn)殒I是字典中項(xiàng)目的獨(dú)一無二的標(biāo)識,例如:字典的基本操作使用del命令配合鍵索引刪除字典中指定的鍵值對,或del加字典名刪除整個(gè)字典對象,例如:字典的基本操作與列表相似,字典也有對內(nèi)部項(xiàng)目進(jìn)行查找、修改等的方法,下表列出了字典對象的常用方法,在使用這些方法時(shí),需要注意其是對字典進(jìn)行原地修改還是有返回值字典的常用方法方法說明dict.get(key[,default])返回指定鍵對應(yīng)的值dict.setdefault(key[,default])返回指定鍵對應(yīng)的值。如果該鍵不存在,則插入具有指定值的鍵dict.update()使用指定的鍵值對對字典進(jìn)行更新dict.pop(key[,default])刪除擁有指定鍵的項(xiàng)目dict.popitem()刪除最后插入的鍵值對dict.clear()刪除字典中的所有項(xiàng)目dict.keys()返回包含字典鍵的字典視圖dict.values()返回字典中所有值的字典視圖dict.items()返回包含每個(gè)鍵值對的元組的字典視圖dict.copy()返回字典對象的淺拷貝使用鍵作為索引訪問字典中對應(yīng)的值,當(dāng)鍵不存在時(shí)會產(chǎn)生KeyError異常,這在默認(rèn)情況下會中斷程序的執(zhí)行在實(shí)踐中,一種更為安全的讀取字典值的方法是使用字典的get(key[,default])方法,該方法獲取指定鍵對應(yīng)的值,并且可以在鍵不存在時(shí)返回指定值這個(gè)起備用作用的返回值可以由用戶提前設(shè)定,如不設(shè)定,則默認(rèn)返回None,例如:字典的常用方法字典的setdefault(key[,default])方法返回指定鍵對應(yīng)的值如果該鍵不存在,則向字典插入鍵key和值default,并返回所插入的值default值default作為可選參數(shù),用戶不提供時(shí)默認(rèn)為None,例如:字典的常用方法字典對象的update()方法使用以參數(shù)形式傳入的鍵值對更新原字典,其對原字典進(jìn)行原地修改,沒有返回值update()方法接收的參數(shù)可以是另一個(gè)字典對象,也可以是一個(gè)序列,該序列的每一個(gè)元素都必須是由鍵值對構(gòu)成的長度為2的序列,update()方法還可以接收關(guān)鍵字參數(shù),例如:字典的常用方法字典的pop(key[,default])方法刪除擁有指定鍵的項(xiàng)目如果鍵key存在于字典中,則將其對應(yīng)的項(xiàng)目刪除并返回相應(yīng)的值;如果鍵key不在字典中,則會引發(fā)KeyError異常;如果鍵key不在字典中,但用戶為可選參數(shù)default指定了值,就會返回這個(gè)以參數(shù)形式指定的default的值,例如:字典的常用方法字典的popitem()方法從字典中移除并返回一個(gè)鍵值對在Python3.7之前,popitem()會返回一個(gè)任意的鍵值對;而在Python3.7版本及之后,popitem()會按后進(jìn)先出的順序返回鍵值對,例如:字典的clear()方法刪除字典對象中所有的項(xiàng)目,使得原字典對象成為一個(gè)空字典,例如:字典的常用方法字典的keys()、values()以及items()方法經(jīng)常與for循環(huán)配合使用,分別用于遍歷字典的鍵、值以及項(xiàng)目(鍵值對),例如:字典的常用方法字典的keys()、values()以及items()方法在Python2中以列表形式返回結(jié)果,但在Python3中其返回的不是列表,而是一個(gè)名為字典視圖(dictionaryview)的對象,例如:字典的常用方法字典視圖存儲著所對應(yīng)字典對象的引用在字典視圖上進(jìn)行迭代比在Python2的列表上效率更高Python2中舊方法要遍歷字典的存儲結(jié)構(gòu)以構(gòu)建新列表,然后遍歷該列表,這需要花費(fèi)時(shí)間和內(nèi)存而Python3中的字典視圖為用戶提供了一個(gè)迭代器,該迭代器直接遍歷字典的存儲結(jié)構(gòu),從而跳過了創(chuàng)建列表的步驟字典的常用方法字典視圖的一個(gè)特點(diǎn)是其能動態(tài)地反映原字典的變化下例中首先由一個(gè)字典對象生成字典視圖,然后更改原字典,這時(shí)會發(fā)現(xiàn)已生成的字典視圖也發(fā)生了變化字典的常用方法因?yàn)樽值涞逆I是唯一且可哈希的,所以鍵視圖類似于集合如果字典的值也是可哈希的,則鍵值對也是不重復(fù)且可哈希的,那么項(xiàng)目視圖也類似于集合,但值視圖與集合無關(guān),因?yàn)槠渲锌赡馨貜?fù)的內(nèi)容與集合類似的視圖可以參與集合運(yùn)算,例如:字典的常用方法字典推導(dǎo)式(dictionarycomprehension)的構(gòu)造方式與列表推導(dǎo)式類似,不同之處在于字典推導(dǎo)式的前部需要以key:value的形式指定字典的鍵值對,并且整個(gè)表達(dá)式需要寫在一對大括號“{}”中,執(zhí)行字典推導(dǎo)式返回一個(gè)字典對象,例如:字典推導(dǎo)式集合集合(set)是無序可變對象,使用一對大括號“{}”界定集合中的元素是唯一的,不可重復(fù),且只能是不可變對象,如數(shù)字、字符串、元組等列表、字典以及集合本身都是可變的,不能作為集合元素,例如:集合的基本操作內(nèi)置函數(shù)set()接受列表、元組等可迭代對象作為參數(shù)并使用其元素構(gòu)建集合,如果原來的對象中存在重復(fù)元素,則只會保留一個(gè)創(chuàng)建空集合只能使用不含參數(shù)的內(nèi)置函數(shù)set(),而不能使用一對空大括號“{}”,因?yàn)楹笳邉?chuàng)建的是一個(gè)空字典,例如:集合的基本操作集合中的元素是無序的,不能通過下標(biāo)索引的方式訪問集合元素,集合也不支持切片操作最常見的操作是判斷元素是否屬于集合,此時(shí)可以使用in運(yùn)算符,例如:集合的基本操作集合的常用方法方法說明set.add(element)向集合添加元素elementset.remove(element)從集合中移除元素element,若元素element不在集合中,則引發(fā)KeyError異常set.discard(element)從集合中移除元素element,若元素element不在集合中,也不會引發(fā)異常set.pop()從集合中移除并返回任意一個(gè)元素,若集合為空,則引發(fā)KeyError異常set.clear()從集合中移除所有元素set.update(*others)向原集合中加入另一個(gè)或多個(gè)對象others中的元素sersection(*others)交集運(yùn)算set.union(*others)并集運(yùn)算set.difference(*others)差集運(yùn)算set.symmetric_difference(other)對稱差集運(yùn)算set.issubset(other)子集測試set.issuperset(other)超集測試set.copy()返回集合對象的淺拷貝集合對象的add(element)方法用來添加一個(gè)新元素,element元素須為不可變數(shù)據(jù)類型,如果所添加的元素已經(jīng)在集合中,那么add()方法將不會生效,例如:集合對象的remove(element)方法用來從集合中移除元素element,如果element不存在于集合中,則會引發(fā)KeyError異常,例如:集合的常用方法集合對象的discard(element)方法同樣用來從集合中移除元素element,但是與remove()方法不同的是,即使元素element不存在于集合中也不會引發(fā)異常,例如:集合的常用方法集合對象的pop()方法是從集合中移除元素的另一種方法與remove()方法和discard()方法不同的是,pop()方法不是指定移除某個(gè)特定元素,而是隨機(jī)移除存在于集合中的任意一個(gè)元素,如果集合為空,則會引發(fā)KeyError異常Python的KeyError異常是內(nèi)置的異常類之一,由許多可用于具有鍵值對的對象的方法引發(fā)在集合中,remove()方法和pop()方法如果找不到要移除或是可以移除的元素,就會引發(fā)該異常,例如:集合的常用方法實(shí)際上,集合對象的pop()方法移除的元素也不是完全隨機(jī)的如果集合中的元素是一組較小的整數(shù),它也可能按照某種特定順序移除,如先刪除較小的整數(shù)一般而言,依據(jù)其底層實(shí)現(xiàn)細(xì)節(jié),集合中的元素會依照其哈希值排序進(jìn)行刪除,例如:集合的常用方法集合對象的clear()方法用來清空集合元素,例如:集合對象的update()方法將作為參數(shù)傳入的可迭代對象中的元素加入原集合,例如:集合的常用方法集合對象支持交集、并集、差集、對稱差集等數(shù)學(xué)運(yùn)算使用集合對象的intersection(*others)方法(此處*others表示可以有任意多個(gè)參數(shù))或運(yùn)算符“&”進(jìn)行交集運(yùn)算,交集運(yùn)算后返回新的集合對象集合a和集合b的交集由所有屬于集合a且屬于集合b的元素組成,如:集合的常用方法使用集合對象的union(*others)方法或運(yùn)算符“|”進(jìn)行并集運(yùn)算,并集運(yùn)算后返回新的集合對象;集合a和集合b的并集由所有屬于集合a或?qū)儆诩蟗的元素組成,例如:集合的常用方法使用集合對象的difference(*others)方法或運(yùn)算符“-”進(jìn)行差集運(yùn)算,差集運(yùn)算后返回新的集合對象集合a和集合b的差集由所有只屬于集合a而不屬于集合b的元素組成,例如:集合的常用方法使用集合對象的symmetric_difference(other)方法(此處other表示只能有一個(gè)參數(shù))或運(yùn)算符“^”進(jìn)行對稱差集運(yùn)算,對稱差集運(yùn)算后返回新的集合對象集合a和集合b的對稱差集由屬于集合a或集合b,但不屬于a與b的交集的元素組成,例如:集合的常用方法除以上四種運(yùn)算之外,集合對象還有判斷子集或超集的運(yùn)算集合對象的set.issubset(other)方法用來判斷set是否為other的子集,即集合set的每個(gè)元素是否都在other之中,其等價(jià)于“<=”運(yùn)算符集合對象的set.issuperset(other)方法用來判斷set是否為other的超集,即集合other的每個(gè)元素是否都在set之中,其等價(jià)于“>=”運(yùn)算符集合的常用方法集合對象的set.issubset(other)方法和set.issuperset(other)方法無法進(jìn)行真子集(set<=otherandset!=other)或真超集(set>=otherandset!=other)運(yùn)算,可以借助運(yùn)算符“<”和“>”實(shí)現(xiàn),例如:集合的常用方法集合推導(dǎo)式(setcomprehension)的構(gòu)建方式與列表推導(dǎo)式類似,區(qū)別在于集合推導(dǎo)式使用一對大括號“{}”作為界定符,集合推導(dǎo)式返回的是集合對象,例如:集合推導(dǎo)式Python有兩種內(nèi)置的集合類型,即set和frozenset以上小節(jié)介紹的set對象是可變的,其在創(chuàng)建后仍可以通過add()和remove()等方法來增刪元素由于是可變類型,因此set對象沒有哈希值,且不能被用作字典的鍵或其他集合的元素frozenset類型的對象是不可變的且可哈希的,其一經(jīng)創(chuàng)建就不能再改變?nèi)绻粋€(gè)對象有哈希值且哈希值在其生命周期內(nèi)不會改變,則該對象是可哈希的frozenset對象可以被用作字典的鍵或其他集合的元素不可變集合使用內(nèi)置函數(shù)frozenset()由傳入的可迭代對象構(gòu)建不可變集合frozenset,如果要構(gòu)建一個(gè)由集合對象構(gòu)成的集合,則所有的內(nèi)層集合必須為frozenset對象,例如:不可變集合深入理解動態(tài)類型Python采用動態(tài)類型(dynamictyping)Python中的類型是在程序運(yùn)行過程中自動確定的,而不是由程序員通過編寫代碼來聲明的Python中“類型”這一概念并不屬于變量(variable),而是屬于對象(object),變量是通用的,只是在某個(gè)時(shí)段內(nèi)引用了特定的對象對于a=1這樣的賦值語句,a是變量而1是對象變量是一種標(biāo)識符,命名時(shí)要遵循Python標(biāo)識符命名規(guī)范,還要避免和Python內(nèi)置函數(shù)和保留字重名,變量在第一次為其賦值時(shí)被創(chuàng)建,對已創(chuàng)建好的變量再次賦值不會創(chuàng)建新的同名變量,而只會使用已有的變量對象是Python中對數(shù)據(jù)的抽象,整數(shù)、浮點(diǎn)數(shù)、字符串、列表、函數(shù)和類都是對象,每個(gè)對象都有類型信息、值和一個(gè)標(biāo)識它的獨(dú)一無二的數(shù)字,一個(gè)對象被創(chuàng)建后,它的標(biāo)識數(shù)字不會再改變深入理解動態(tài)類型內(nèi)置函數(shù)id()接收一個(gè)對象,返回該對象的標(biāo)識數(shù)字,可以將該數(shù)字視為對象在內(nèi)存中的首地址,內(nèi)置函數(shù)type()則返回對象的類型名稱深入理解動態(tài)類型在執(zhí)行a=1這個(gè)賦值操作時(shí),Python自動做了如下三件事:創(chuàng)建一個(gè)對象,它的值為1創(chuàng)建一個(gè)變量a(如果它還沒有被創(chuàng)建)將變量a與對象1通過引用相連接,這里的引用關(guān)系由指針實(shí)現(xiàn)由此可見,變量和對象保存在內(nèi)存中的不同位置,經(jīng)過a=1這樣的賦值操作,我們稱變量a引用了對象1深入理解動態(tài)類型由于變量沒有類型,類型信息只存在于對象中,我們可以隨意地將不同類型的對象賦給同一個(gè)變量,每一次新的賦值僅僅是讓原先的變量引用了新的對象,上頁示例中將整型數(shù)1和字符串'spam'先后賦給同一個(gè)變量a,引用的變化如圖下圖:深入理解動態(tài)類型一個(gè)對象可以被多個(gè)變量所引用對象除了保存自己的類型信息外,還維護(hù)了一個(gè)引用計(jì)數(shù)器,用于記錄其被引用的次數(shù),Python會自動回收引用計(jì)數(shù)器為0的那些對象所占的內(nèi)存將一個(gè)變量賦給另一個(gè)變量,兩個(gè)變量會引用同一個(gè)對象,這一點(diǎn)可以通過內(nèi)置函數(shù)id()加以驗(yàn)證,左例中id(a)與id(b)的值相同,相關(guān)示意如右圖:深入理解動態(tài)類型在兩個(gè)變量共享一個(gè)對象引用的情況下,對其中一個(gè)變量賦新值,就會在內(nèi)存中創(chuàng)建新的對象,再用被賦值的變量引用這個(gè)新對象,而另一個(gè)變量仍引用原對象,左例演示了這種情況,相關(guān)示意如右圖:深入理解動態(tài)類型值得注意的是,像左例這樣對原本引用整數(shù)對象1的變量a做加法賦值運(yùn)算(a+=1,即a=a+1),也會在內(nèi)存中開辟新空間來生成新對象2,再用變量a引用對象2,而不是將原對象1的值更改為2,相關(guān)示意如右圖:深入理解動態(tài)類型整數(shù)作為不可變對象,一經(jīng)創(chuàng)建就無法更改,因此,給一個(gè)引用整數(shù)的變量賦新值并不是替換了原始的對象,而是生成一個(gè)新對象,再讓這個(gè)變量引用新對象對于像列表這樣支持原地修改的可變對象,情況有所不同如左例所示,變量x引用了一個(gè)包含整數(shù)1、2、3的列表對象,賦值語句y=x令變量y和變量x引用了相同的列表對象,接下來通過下標(biāo)索引操作在原地修改了x所引用的列表對象的第一個(gè)元素,即x[0]='spam',這時(shí)觀察變量y,它也一起發(fā)生了變化使用列表對象的append()方法也會產(chǎn)生類似的結(jié)果,如右例所示:深入理解動態(tài)類型當(dāng)多個(gè)變量引用同一個(gè)列表對象時(shí),通過一個(gè)變量對列表進(jìn)行原地
溫馨提示
- 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)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年神經(jīng)科手術(shù)器械項(xiàng)目可行性研究報(bào)告
- 2025年棉氨綸背心式健美服項(xiàng)目可行性研究報(bào)告
- 2025年無粉防靜電紅色指套項(xiàng)目可行性研究報(bào)告
- 2025年扁圓濾芯項(xiàng)目可行性研究報(bào)告
- 2025年固定式遙控插座項(xiàng)目可行性研究報(bào)告
- 2025年南方花柜項(xiàng)目可行性研究報(bào)告
- 2025年絲網(wǎng)鋁框項(xiàng)目可行性研究報(bào)告
- 2025年CWDM解決方案項(xiàng)目可行性研究報(bào)告
- 2025至2030年鎖花片項(xiàng)目投資價(jià)值分析報(bào)告
- 2025至2030年行走馬達(dá)油封項(xiàng)目投資價(jià)值分析報(bào)告
- 臟腑辨證與護(hù)理
- 虛擬化與云計(jì)算技術(shù)應(yīng)用實(shí)踐項(xiàng)目化教程 教案全套 第1-14周 虛擬化與云計(jì)算導(dǎo)論-騰訊云服務(wù)
- 甲基丙烯酸甲酯生產(chǎn)工藝畢業(yè)設(shè)計(jì)設(shè)備選型與布置模板
- 徐金桂行政法與行政訴訟法新講義
- 瀝青拌合設(shè)備結(jié)構(gòu)認(rèn)知
- 2023年北京高考政治真題試題及答案
- 復(fù)旦中華傳統(tǒng)體育課程講義05木蘭拳基本技術(shù)
- 北師大版五年級上冊數(shù)學(xué)教學(xué)課件第5課時(shí) 人民幣兌換
- 工程回訪記錄單
- 住房公積金投訴申請書
- 檢驗(yàn)科生物安全風(fēng)險(xiǎn)評估報(bào)告
評論
0/150
提交評論