版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
Python函數(shù)及模塊《智能車Python編程設(shè)計(jì)》函數(shù)的定義與調(diào)用函數(shù)的定義與調(diào)用函數(shù)的定義函數(shù)是一段具有特定功能的、可重用的語(yǔ)句組,用函數(shù)名來(lái)表示并通過(guò)函數(shù)名進(jìn)行完成功能調(diào)用。函數(shù)也可以看作是一段具有名字的子程序,可以在需要的地方調(diào)用執(zhí)行,不需要在每個(gè)執(zhí)行地方重復(fù)編寫(xiě)這些語(yǔ)句。每次使用函數(shù)可以提供不同的參數(shù)作為輸入,以實(shí)現(xiàn)對(duì)不同數(shù)據(jù)的處理;函數(shù)執(zhí)行后,還可以反饋相應(yīng)的處理結(jié)果。函數(shù)是一種功能抽象函數(shù)的定義與調(diào)用在Python中,函數(shù)聲明和函數(shù)定義是視為一體的。函數(shù)定義的基本形式如下: def <函數(shù)名>(<參數(shù)列表>):
<函數(shù)體> return表達(dá)式或者值函數(shù)的定義與調(diào)用說(shuō)明:在Python中采用def關(guān)鍵字進(jìn)行函數(shù)的定義,不用指定返回值的類型。函數(shù)參數(shù)可以是零個(gè)、一個(gè)或者多個(gè),同樣,函數(shù)參數(shù)也不用指定函數(shù)類型,因?yàn)樵赑ython中變量都是弱類型的,Python會(huì)自動(dòng)根據(jù)值來(lái)維護(hù)其類型。Python中函數(shù)的定義中縮進(jìn)部分是函數(shù)體。函數(shù)的返回值是通過(guò)函數(shù)中的return語(yǔ)句獲得的。return語(yǔ)句是可選的,它可以在函數(shù)體內(nèi)任何地方出現(xiàn),表示函數(shù)調(diào)用執(zhí)行到此結(jié)束;如果沒(méi)有return語(yǔ)句,會(huì)自動(dòng)返回None(空值),如果有return語(yǔ)句,但是return后面沒(méi)有接表達(dá)式或者值,也返回None。函數(shù)的定義與調(diào)用函數(shù)的定義與調(diào)用示例:過(guò)生日時(shí)要為朋友唱生日歌,歌詞為:Happybirthdaytoyou!Happybirthdaytoyou!Happybirthday,dear<名字>Happybirthdaytoyou!編寫(xiě)程序?yàn)镸ike和Lily輸出生日歌。函數(shù)的定義與調(diào)用最簡(jiǎn)單的實(shí)現(xiàn)方法是重復(fù)使用print()語(yǔ)句,如下:print("Happybirthdaytoyou!")print("Happybirthdaytoyou!")print("Happybirthday,dearMike!")print("Happybirthdaytoyou!")函數(shù)的定義與調(diào)用定義函數(shù)實(shí)現(xiàn),如下:defhappy():print("Happybirthdaytoyou!")defhappyB(name):happy()happy()print("Happybirthday,dear{}!".format(name))happy()函數(shù)的定義與調(diào)用函數(shù)的調(diào)用在定義了函數(shù)之后,就可以使用該函數(shù),但是在python中不允許使用前向引用,即在函數(shù)定義之前,不允許使用該函數(shù)。程序調(diào)用函數(shù)需要執(zhí)行以下四個(gè)步驟:調(diào)用程序在調(diào)用處暫停執(zhí)行;在調(diào)用時(shí)將實(shí)參復(fù)制給函數(shù)的形參;執(zhí)行函數(shù)體語(yǔ)句;函數(shù)調(diào)用結(jié)束給出返回值,程序回到調(diào)用前的暫停處繼續(xù)執(zhí)行。函數(shù)的定義與調(diào)用前示例中happyB()被調(diào)用的過(guò)程函數(shù)的定義與調(diào)用函數(shù)的定義與調(diào)用函數(shù)的定義與調(diào)用lambda函數(shù)Python的有33個(gè)保留字,其中一個(gè)是lambda,該保留字用于定義一種特殊的函數(shù)——匿名函數(shù),又稱lambda函數(shù)。匿名函數(shù)并非沒(méi)有名字,而是將函數(shù)名作為函數(shù)結(jié)果返回,如下:
<函數(shù)名>=lambda<參數(shù)列表>:<表達(dá)式>lambda函數(shù)與正常函數(shù)一樣,等價(jià)于下面形式:def<函數(shù)名>(<參數(shù)列表>):return<表達(dá)式>函數(shù)的定義與調(diào)用簡(jiǎn)單說(shuō),lambda函數(shù)用于定義簡(jiǎn)單的、能夠在一行內(nèi)表示的函數(shù),返回一個(gè)函數(shù)類型,實(shí)例如下。
>>>f=lambdax,y:x+y >>>type(f) <class'function’> >>>f(10,12) 22函數(shù)的定義與調(diào)用可以將lambda表達(dá)式作為列表的元素,從而實(shí)現(xiàn)跳轉(zhuǎn)表的功能,也就是函數(shù)的列表。定義方法如下:
列表名=[(lambda表達(dá)式1),(lambda表達(dá)式2),…]調(diào)用方法如下:
列表名[索引](lambda表達(dá)式的參數(shù)列表)示例:計(jì)算并打印2的平方、立方和四次方 L=[(lambdax:x**2),(lambdax:x**3),(lambdax:x**4)] print(L[0](2),L[1](2),L[2](2))函數(shù)的定義與調(diào)用函數(shù)的返回值return語(yǔ)句用來(lái)退出函數(shù)并將程序返回到函數(shù)被調(diào)用的位置繼續(xù)執(zhí)行。return語(yǔ)句同時(shí)可以將0個(gè)、1個(gè)或多個(gè)函數(shù)運(yùn)算完的結(jié)果返回給函數(shù)被調(diào)用處的變量,也可將lambda表達(dá)式作為函數(shù)的返回值。示例:>>>deffunc(a,b):returna*b>>>s=func("knock~",2)>>>print(s)knock~knock~函數(shù)的定義與調(diào)用函數(shù)可以沒(méi)有return,此時(shí)函數(shù)并不返回值,如前面示例中的happy()函數(shù)。函數(shù)也可以用return返回多個(gè)值,多個(gè)值以元組類型保存。示例: >>>deffunc(a,b): returnb,a >>>s=func("knock~",2) >>>print(s,type(s)) (2,'knock~')<class'tuple'>函數(shù)的定義與調(diào)用練習(xí):1.通過(guò)函數(shù)調(diào)用代碼實(shí)現(xiàn)求兩數(shù)的最大公約數(shù)和最小公倍數(shù)。2.成績(jī)管理系統(tǒng)(輸入成績(jī)輸出不合格、合格、良好、優(yōu)秀)3.打分系統(tǒng)(先輸入打分的人數(shù),輸入分?jǐn)?shù),去除最高分和最低分輸出平均值)函數(shù)的定義與調(diào)用1.函數(shù)的定義與調(diào)用2.公約數(shù)與公倍數(shù)(知識(shí)補(bǔ)充)公約數(shù)與最大公約數(shù)定義:幾個(gè)數(shù)公有的約數(shù),叫做這幾個(gè)數(shù)的公約數(shù);其中最大的一個(gè),叫做這幾個(gè)數(shù)的最大公約數(shù).例如:12的約數(shù)有:1,2,3,4,6,12;18的約數(shù)有:1,2,3,6,9,18.
12和18的公約數(shù)有:1,2,3,6.其中6是12和18的最大公約數(shù).公倍數(shù)與最小公倍數(shù)定義:幾個(gè)數(shù)公有的倍數(shù),叫做這幾個(gè)數(shù)的公倍數(shù);其中最小的一個(gè),叫做這幾個(gè)數(shù)的最小公倍數(shù).例如:12的倍數(shù)有:12,24,36,48,60,72,84,…
18的倍數(shù)有:18,36,54,72,90,…
12和18的公倍數(shù)有:36,72,….其中36是12和18的最小公倍數(shù).函數(shù)的定義與調(diào)用練習(xí):1.通過(guò)函數(shù)調(diào)用代碼實(shí)現(xiàn)求兩數(shù)的最大公約數(shù)和最小公倍數(shù)。2.成績(jī)管理系統(tǒng)(輸入成績(jī)輸出不合格、合格、良好、優(yōu)秀)3.打分系統(tǒng)(先輸入打分的人數(shù),輸入分?jǐn)?shù),去除最高分和最低分輸出平均值)參考答案a=int(input('請(qǐng)輸入一個(gè)數(shù):'))b=int(input('請(qǐng)輸入另一個(gè)數(shù):'))c=set()d=set()foriinrange(1,a+1):if(a%i==0):c1=int(a/i)c.add(c1)foriinrange(1,b+1):if(b%i==0):d1=int(b/i)d.add(d1)x=max(c&d)print('最大公約數(shù):{0}'.format(x))最小公倍數(shù)參考答案函數(shù)的定義與調(diào)用1.函數(shù)的定義與調(diào)用2.函數(shù)定義與調(diào)用3函數(shù)的參數(shù)函數(shù)的參數(shù)函數(shù)形參和實(shí)參區(qū)別形參全稱為形式參數(shù),在用def關(guān)鍵字時(shí)函數(shù)名后面括號(hào)里的變量稱作形式參數(shù)。實(shí)參全稱為實(shí)際參數(shù),在調(diào)用函數(shù)提供的值或者變量稱為實(shí)際參數(shù)。示例:函數(shù)的參數(shù)參數(shù)的傳遞在Python中,一切皆對(duì)象,變量中存放的是對(duì)象的引用。字符串常量、整型常量也是對(duì)象。示例:運(yùn)行結(jié)果id(object)函數(shù)是返回對(duì)象object的id標(biāo)識(shí)(在內(nèi)存中的地址)函數(shù)的參數(shù)上述x=2實(shí)際的處理過(guò)程:先申請(qǐng)一段內(nèi)存分配給一個(gè)整型對(duì)象來(lái)存儲(chǔ)整型值2,然后讓變量x去指向這個(gè)對(duì)象,實(shí)際上就是指向這段內(nèi)存。同理,y=2,變量y也指向這個(gè)整型對(duì)象2。函數(shù)的參數(shù)Python中參數(shù)傳遞采用的是值傳遞。在絕大多數(shù)情況下,在函數(shù)內(nèi)部直接修改形參的值不會(huì)影響實(shí)參。示例:函數(shù)的參數(shù)在有些情況下,可以通過(guò)特殊的方式在函數(shù)內(nèi)部修改實(shí)參的值。示例:運(yùn)行結(jié)果函數(shù)參數(shù)的類型函數(shù)參數(shù)的類型位置函數(shù)位置參數(shù)(positionalarguments)是比較常用的形式,調(diào)用函數(shù)時(shí)實(shí)參和形參的順序必須嚴(yán)格一致,并且實(shí)參和形參的數(shù)量必須相同。示例:函數(shù)參數(shù)的類型默認(rèn)值參數(shù)在調(diào)用帶有默認(rèn)值參數(shù)的函數(shù)時(shí),可以不用為設(shè)置了默認(rèn)值的形參進(jìn)行傳值,此時(shí)函數(shù)將會(huì)直接使用函數(shù)定義時(shí)設(shè)置的默認(rèn)值,當(dāng)然也可以通過(guò)顯式賦值來(lái)替換其默認(rèn)值。在調(diào)用函數(shù)時(shí)是否為默認(rèn)值參數(shù)傳遞實(shí)參是可選的。需要注意的是,在定義帶有默認(rèn)值參數(shù)的函數(shù)時(shí),任何一個(gè)默認(rèn)值參數(shù)右邊都不能再出現(xiàn)沒(méi)有默認(rèn)值的普通位置參數(shù),否則會(huì)提示語(yǔ)法錯(cuò)誤。函數(shù)參數(shù)的類型帶有默認(rèn)值參數(shù)的函數(shù)定義語(yǔ)法如下:def函數(shù)名(……,形參名=默認(rèn)值):
函數(shù)體示例:函數(shù)參數(shù)的類型關(guān)鍵參數(shù)關(guān)鍵參數(shù)主要指調(diào)用函數(shù)時(shí)的參數(shù)傳遞方式,與函數(shù)定義無(wú)關(guān)。通過(guò)關(guān)鍵參數(shù)可以按參數(shù)名字傳遞值,明確指定哪個(gè)值傳遞給哪個(gè)參數(shù),實(shí)參順序可以和形參順序不一致,但不影響參數(shù)值的傳遞結(jié)果,避免了用戶需要牢記參數(shù)位置和順序的麻煩,使得函數(shù)的調(diào)用和參數(shù)傳遞更加靈活方便。示例:函數(shù)參數(shù)的類型可變長(zhǎng)度參數(shù)可變長(zhǎng)度參數(shù)主要有兩種形式:在參數(shù)名前加1個(gè)*或2個(gè)***parameter用來(lái)接收多個(gè)位置參數(shù)并將其放在一個(gè)元組中**parameter接收多個(gè)關(guān)鍵參數(shù)并存放到字典中函數(shù)參數(shù)的類型*parameter的用法**parameter的用法函數(shù)參數(shù)的類型傳遞參數(shù)時(shí)的序列解包傳遞參數(shù)時(shí),可以通過(guò)在實(shí)參序列前加一個(gè)星號(hào)將其解包,然后傳遞給多個(gè)單變量形參。示例:函數(shù)參數(shù)的類型如果函數(shù)實(shí)參是字典,可以在前面加兩個(gè)星號(hào)進(jìn)行解包,等價(jià)于關(guān)鍵參數(shù)。示例:變量作用域變量作用域變量作用域變量起作用的代碼范圍稱為變量的作用域,不同作用域內(nèi)變量名可以相同,互不影響。在函數(shù)內(nèi)部定義的普通變量只在函數(shù)內(nèi)部起作用,稱為局部變量。當(dāng)函數(shù)執(zhí)行結(jié)束后,局部變量自動(dòng)刪除,不再可以使用。局部變量的引用比全局變量速度快,應(yīng)優(yōu)先考慮使用。變量作用域全局變量可以通過(guò)關(guān)鍵字global來(lái)定義。這分為兩種情況:一個(gè)變量已在函數(shù)外定義,如果在函數(shù)內(nèi)需要為這個(gè)變量賦值,并要將這個(gè)賦值結(jié)果反映到函數(shù)外,可以在函數(shù)內(nèi)使用global將其聲明為全局變量。如果一個(gè)變量在函數(shù)外沒(méi)有定義,在函數(shù)內(nèi)部也可以直接將一個(gè)變量定義為全局變量,該函數(shù)執(zhí)行后,將增加一個(gè)新的全局變量。變量作用域示例:變量作用域如果局部變量與全局變量具有相同的名字,那么該局部變量會(huì)在自己的作用域內(nèi)隱藏同名的全局變量。示例:生成器函數(shù)設(shè)計(jì)要點(diǎn)生成器函數(shù)設(shè)計(jì)要點(diǎn)生成器函數(shù)設(shè)計(jì)要點(diǎn)包含yield語(yǔ)句的函數(shù)可以用來(lái)創(chuàng)建生成器對(duì)象,這樣的函數(shù)也稱生成器函數(shù)。yield語(yǔ)句與return語(yǔ)句的作用相似,都是用來(lái)從函數(shù)中返回值。與return語(yǔ)句不同的是,return語(yǔ)句一旦執(zhí)行會(huì)立刻結(jié)束函數(shù)的運(yùn)行,而每次執(zhí)行到y(tǒng)ield語(yǔ)句并返回一個(gè)值之后會(huì)暫?;驋炱鸷竺娲a的執(zhí)行,下次通過(guò)生成器對(duì)象的__next__()方法、內(nèi)置函數(shù)next()、for循環(huán)遍歷生成器對(duì)象元素或其他方式顯式“索要”數(shù)據(jù)時(shí)恢復(fù)執(zhí)行。生成器具有惰性求值的特點(diǎn),適合大數(shù)據(jù)處理。生成器函數(shù)設(shè)計(jì)要點(diǎn)yield與return的區(qū)別return是函數(shù)返回值,當(dāng)執(zhí)行return時(shí),后續(xù)的邏輯代碼不在執(zhí)行。yield是創(chuàng)建迭代器,可以用for來(lái)遍歷,有點(diǎn)事件觸發(fā)的意思。函數(shù)里遇到return時(shí),控制權(quán)交給主線程,然后沒(méi)這個(gè)函數(shù)什么事了。如果遇到y(tǒng)ield,控制權(quán)只是暫時(shí)交給主線程,函數(shù)繼續(xù)在那等著。另外,函數(shù)里出現(xiàn)yield就自動(dòng)變成生成器。return是用來(lái)返回具體的某個(gè)值。yield一般與循環(huán)一起用,相當(dāng)于生成了一個(gè)容器(常見(jiàn)的就是字典),然后在這個(gè)容器里面存放了每次循環(huán)以后的值,并且就在那放著,不輸出,不返回,等你下次需要他的時(shí)候直接取出來(lái)用(調(diào)用)就行。生成器函數(shù)設(shè)計(jì)要點(diǎn)示例:編寫(xiě)并使用能夠生成斐波那契數(shù)列的生成器函數(shù)。生成器函數(shù)設(shè)計(jì)要點(diǎn)閉包和函數(shù)的遞歸調(diào)用閉包和函數(shù)的遞歸調(diào)用閉包在Python中,閉包指函數(shù)的嵌套??梢栽诤瘮?shù)內(nèi)部定義一個(gè)嵌套函數(shù),將嵌套函數(shù)視為一個(gè)對(duì)象,所以可以將嵌套函數(shù)作為定義它的函數(shù)的返回結(jié)果。示例:在函數(shù)func_lib()中定義一個(gè)嵌套函數(shù)add(x,y),并作為函數(shù)func_lib()的返回值。閉包和函數(shù)的遞歸調(diào)用函數(shù)的遞歸調(diào)用函數(shù)的遞歸調(diào)用是函數(shù)調(diào)用的一種特殊情況,函數(shù)調(diào)用自己,自己再調(diào)用自己,自己再調(diào)用自己,...,當(dāng)某個(gè)條件得到滿足的時(shí)候就不再調(diào)用了,然后再一層一層地返回直到該函數(shù)第一次調(diào)用的位置。閉包和函數(shù)的遞歸調(diào)用遞歸調(diào)用過(guò)程......函數(shù)A函數(shù)B函數(shù)B函數(shù)B函數(shù)B函數(shù)B調(diào)用返回調(diào)用返回調(diào)用返回調(diào)用返回調(diào)用返回調(diào)用返回閉包和函數(shù)的遞歸調(diào)用示例:練習(xí)1:從鍵盤(pán)輸入一個(gè)數(shù),求該數(shù)的階乘。練習(xí)2:使用遞歸實(shí)現(xiàn)輸出斐波拉契數(shù)列前n項(xiàng)。閉包和函數(shù)的遞歸調(diào)用練習(xí)3:印度有一個(gè)饒有趣味的故事。傳說(shuō)舍罕王打算重賞象棋的發(fā)明人、宰相西薩達(dá)依爾。國(guó)王問(wèn)他有何要求,這位聰明的大臣胃口看來(lái)并不大,他跪在國(guó)王面前說(shuō):"陛下,請(qǐng)您在這張棋盤(pán)的第一個(gè)小格內(nèi),賞給我一粒麥子,在第二個(gè)小格內(nèi)給兩粒,第三格內(nèi)給四粒,照這樣下去,每一個(gè)小格內(nèi)都比前一小格加一倍。陛下啊,把這樣擺滿棋盤(pán)上所有64格的麥粒,都賞給您的仆人罷。"國(guó)王一聽(tīng),認(rèn)為這區(qū)區(qū)賞金,微不足道。于是,滿口答應(yīng)道:"愛(ài)卿,你所求的并不多啊,你當(dāng)然會(huì)如愿以償。求64個(gè)格子的總的麥數(shù)。閉包和函數(shù)的遞歸調(diào)用練習(xí)1n!=n(n-1)!閉包和函數(shù)的遞歸調(diào)用練習(xí)2練習(xí)3字符串反轉(zhuǎn)defrvs(s):ifs=='':returnselse:returnrvs(s[1:])+s[0]遞歸的優(yōu)缺點(diǎn)Toiterateishuman,torecursedivine.
迭代者為人,遞歸者為神。–L.PeterDeutsch優(yōu)點(diǎn):遞歸使代碼看起來(lái)更加整潔、優(yōu)雅可以用遞歸將復(fù)雜任務(wù)分解成更簡(jiǎn)單的子問(wèn)題使用遞歸比使用一些嵌套迭代更容易缺點(diǎn):遞歸的邏輯很難調(diào)試、跟進(jìn)遞歸調(diào)用的代價(jià)高昂(效率低),因?yàn)檎加昧舜罅康膬?nèi)存和時(shí)間。閉包和函數(shù)的遞歸調(diào)用漢諾塔問(wèn)題基于遞歸算法的實(shí)現(xiàn)。據(jù)說(shuō)古代有一個(gè)梵塔,塔內(nèi)有三個(gè)底座A、B、C,A座上有64個(gè)盤(pán)子,盤(pán)子大小不等,大的在下,小的在上。有一個(gè)和尚想把這64個(gè)盤(pán)子從A座移到C座,但每次只能允許移動(dòng)一個(gè)盤(pán)子,在移動(dòng)盤(pán)子的過(guò)程中可以利用B座,但任何時(shí)刻3個(gè)座上的盤(pán)子都必須始終保持大盤(pán)在下、小盤(pán)在上的順序。如果只有一個(gè)盤(pán)子,則不需要利用B座,直接將盤(pán)子從A移動(dòng)到C即可。和尚想知道這項(xiàng)任務(wù)的詳細(xì)移動(dòng)步驟和順序。這實(shí)際上是一個(gè)非常巨大的工程,是一個(gè)不可能完成的任務(wù)。根據(jù)數(shù)學(xué)知識(shí)我們可以知道,移動(dòng)n個(gè)盤(pán)子需要2^n-1步,64個(gè)盤(pán)子需要18446744073709551615步。如果每步需要一秒鐘的話,那么就需要584942417355.072年。閉包和函數(shù)的遞歸調(diào)用分析:A柱只有一個(gè)盤(pán)子:A
CA柱有兩個(gè)盤(pán)子:小盤(pán)AB,大盤(pán)AC,小盤(pán)BCA柱有n個(gè)盤(pán)子:將此問(wèn)題轉(zhuǎn)化為上面n-1個(gè)盤(pán)子和最小面第n個(gè)盤(pán)子。n-1個(gè)盤(pán)子AB,第n個(gè)盤(pán)子AC,n-1個(gè)盤(pán)子BC。問(wèn)題轉(zhuǎn)化為移動(dòng)n-1個(gè)盤(pán)子,再將n-1個(gè)盤(pán)子看成上面n-2個(gè)盤(pán)子下面第n-1個(gè)盤(pán)子,以此類推。算法描述為:n-1個(gè)盤(pán)子AB,借助于C柱第n個(gè)盤(pán)子ACn-1個(gè)盤(pán)子BC,借助于A柱閉包和函數(shù)的遞歸調(diào)用參考程序內(nèi)置函數(shù)內(nèi)置函數(shù)常用Python內(nèi)置函數(shù)函數(shù)名功能help()用于查看函數(shù)或模塊用途的詳細(xì)說(shuō)明dir()不帶參數(shù)時(shí),返回當(dāng)前范圍內(nèi)的變量、方法和定義的類型列表;帶參數(shù)時(shí),返回參數(shù)的屬性、方法列表hex()用于將10進(jìn)制整數(shù)轉(zhuǎn)換成16進(jìn)制,以字符串形式表示next()返回迭代器的下一個(gè)項(xiàng)目divmod()把除數(shù)和余數(shù)運(yùn)算結(jié)果結(jié)合起來(lái),返回一個(gè)包含商和余數(shù)的元組(a//b,a%b)id()用于獲取對(duì)象的內(nèi)存地址str()將對(duì)象轉(zhuǎn)化為適于人閱讀的形式內(nèi)置函數(shù)常用Python內(nèi)置函數(shù)函數(shù)名功能sorted()對(duì)所有可迭代的對(duì)象進(jìn)行排序操作ascii()返回一個(gè)表示對(duì)象的字符串,但是對(duì)于字符串中的非ASCII字符則返回通過(guò)repr()函數(shù)使用\x,\u或\U編碼的字符oct()將一個(gè)整數(shù)轉(zhuǎn)換成8進(jìn)制字符串bin()返回一個(gè)整數(shù)int或者長(zhǎng)整數(shù)longint的二進(jìn)制表示divmod()把除數(shù)和余數(shù)運(yùn)算結(jié)果結(jié)合起來(lái),返回一個(gè)包含商和余數(shù)的元組(a//b,a%b)open()用于打開(kāi)一個(gè)文件sum()對(duì)序列進(jìn)行求和計(jì)算內(nèi)置函數(shù)常用Python內(nèi)置函數(shù)函數(shù)名功能filter()用于過(guò)濾序列,過(guò)濾掉不符合條件的元素,返回由符合條件元素組成的新列表format()格式化字符串len()返回對(duì)象(字符、列表、元組等)長(zhǎng)度或項(xiàng)目個(gè)數(shù)range()返回的是一個(gè)可迭代對(duì)象(類型是對(duì)象)zip()用于將可迭代的對(duì)象作為參數(shù),將對(duì)象中對(duì)應(yīng)的元素打包成一個(gè)個(gè)元組,然后返回由這些元組組成的對(duì)象compile()將一個(gè)字符串編譯為字節(jié)代碼內(nèi)置函數(shù)常用Python內(nèi)置函數(shù)函數(shù)名功能map()根據(jù)提供的函數(shù)對(duì)指定序列做映射reversed()返回一個(gè)反轉(zhuǎn)的迭代器round()返回浮點(diǎn)數(shù)x的四舍五入值模塊模塊模塊概述模塊就是一個(gè)保存了Python代碼的文件。模塊中可以定義函數(shù)、類和變量。使用模塊的優(yōu)點(diǎn)如下圖所示。模塊自定義模塊自定義模塊的兩個(gè)作用:規(guī)范代碼,讓代碼更易于閱讀方便其它程序使用已經(jīng)編好的代碼自定義模塊分為兩部分:創(chuàng)建模塊導(dǎo)入模塊模塊創(chuàng)建模塊創(chuàng)建模塊可以將模塊中相關(guān)的代碼(變量定義和函數(shù)定義等)編寫(xiě)在一個(gè)單獨(dú)的文件中,并命名為“模塊名+.py”的形式。創(chuàng)建模塊,實(shí)際上就是創(chuàng)建一個(gè).py文件。注意:創(chuàng)建模塊時(shí),設(shè)置的模塊名盡量不要與Python自帶的標(biāo)準(zhǔn)模塊名相同。模塊文件的擴(kuò)展名必須是“.py”。模塊使用import導(dǎo)入模塊創(chuàng)建模塊后,在其他的程序中就可以使用該模塊。使用前需要先以模塊的形式加載模塊中的代碼,可以使用import語(yǔ)句實(shí)現(xiàn)。import語(yǔ)句的基本語(yǔ)法:import模塊名[as別名]說(shuō)明:導(dǎo)入模塊后就可以使用該模塊中的變量、函數(shù)和類,使用時(shí)需要在該名稱前添加“模塊名.”作為前綴。為了使用時(shí)更加方便,可以使用as關(guān)鍵字為模塊名設(shè)置別名。后面就可通過(guò)別名調(diào)用模塊中的變量、函數(shù)和類。模塊使用import語(yǔ)句還可以一次導(dǎo)入多個(gè)模塊,每個(gè)模塊之間使用“,”進(jìn)行分割。示例:importtest,tips,time分別創(chuàng)建了test.py、tips.py和time.py3個(gè)模塊文件說(shuō)明:雖然可以一次性導(dǎo)入多個(gè)模塊,但是不建議使用這種方法模塊form…import語(yǔ)句導(dǎo)入模塊使用import導(dǎo)入模塊時(shí),每執(zhí)行一條import語(yǔ)句都會(huì)創(chuàng)建一個(gè)新的命名空間,并且在該命名空間執(zhí)行與.py文件相關(guān)的所有語(yǔ)句。
在執(zhí)行時(shí)都需要加上“模塊名.(py)”前綴。如果不想在每次導(dǎo)入模塊時(shí)都創(chuàng)建新的命名空間,而是將具體的定義導(dǎo)入到當(dāng)前的命名空間中,就可以使用from…import語(yǔ)句,可以直接訪問(wèn)變量、函數(shù)和類名,不需要再添加前綴。說(shuō)明:命名空間可以理解為記錄對(duì)象名字和對(duì)象之間對(duì)應(yīng)關(guān)系的空間。目前Python的命名空間大部分是通過(guò)字典實(shí)現(xiàn)的。key是標(biāo)識(shí)符,value是具體的對(duì)象。模塊from…import語(yǔ)法格式如下:frommodelnameimportmember說(shuō)明:modelname:
模塊名稱,區(qū)分大小寫(xiě)。member:用于指定要導(dǎo)入的變量、函數(shù)或者類等??梢酝瑫r(shí)導(dǎo)入多個(gè)定義,用“,”分隔。示例:模塊在導(dǎo)入模塊時(shí),如果想要導(dǎo)入全部定義,可以使用通配符“*”代替。示例:如果想要查看具體導(dǎo)入了哪些定義,可以通過(guò)顯示dir()函數(shù)來(lái)查看
執(zhí)行print(dir())模塊注意:在使用了from…import語(yǔ)句導(dǎo)入模塊中的定義時(shí),需要保證所導(dǎo)入的內(nèi)容在當(dāng)前的命名空間中是唯一的,否則將出現(xiàn)沖突,后導(dǎo)入的同名變量、函數(shù)或者類會(huì)覆蓋先前導(dǎo)入的。這時(shí)就需要使用import語(yǔ)句進(jìn)行導(dǎo)入。模塊模塊搜索目錄當(dāng)使用import語(yǔ)句導(dǎo)入模塊時(shí),默認(rèn)情況會(huì)按照以下順序進(jìn)行查找1.在當(dāng)前目錄(執(zhí)行的Python腳本文件所在目錄)下查找。2.到PYTHONPATH(環(huán)境變量)下的每個(gè)目錄中查找。3.到Python的默認(rèn)安裝目錄下查找。以上各個(gè)目錄的具體位置保存在標(biāo)準(zhǔn)模塊sys的sys.path變量中。可通過(guò)以下代碼輸出具體目錄。模塊執(zhí)行后的結(jié)果如果要導(dǎo)入的模塊不在上圖所示的目錄中,那么在導(dǎo)入模塊時(shí)就會(huì)報(bào)錯(cuò)。這時(shí),就可以通過(guò)以下3種方法添加指定的目錄到sys.path中。模塊1.臨時(shí)添加臨時(shí)添加即在導(dǎo)入模塊的Python文件中添加。例如,需要將“E:/Python/Code/demo”目錄添加到sys.path中,可以使用下面的代碼。模塊輸出sys.path的結(jié)果矩形框中就是新添加的目錄注意:通過(guò)該方法添加的目錄只在執(zhí)行當(dāng)前文件的窗口中有效,窗口關(guān)閉后即失效。模塊2.增加.pth文件在Python安裝目錄下的“Lib\site-packages”子目錄中創(chuàng)建一個(gè)擴(kuò)展名為.pth的文件,文件名任意。示例:創(chuàng)建一個(gè)mrpath.pth文件,在該文件中添加要導(dǎo)入模塊所在的目錄,如“E:/Python/Code/demo”。(注意反斜杠)創(chuàng)建.pth文件后,需要重新打開(kāi)要執(zhí)行的導(dǎo)入模塊的Python文件,否則新添加的目錄不起作用。通過(guò)該方法添加的目錄只在當(dāng)前版本的Python中有效。模塊3.在環(huán)境變量中添加打開(kāi)“環(huán)境變量”對(duì)話框,如果沒(méi)有PYTHONPATH系統(tǒng)環(huán)境變量,則需要先創(chuàng)建一個(gè),否則直接選中PYTHONPATH變量,單擊編輯,在彈出的對(duì)話框的“變量值”添加新的模塊目錄。示例:需要重新打開(kāi)要執(zhí)行的導(dǎo)入模塊的Python文件,否則新添加的目錄不起作用。通過(guò)該方法添加的目錄可以在不同版本的Python中共享以主程序的形式執(zhí)行以主程序的形式執(zhí)行先創(chuàng)建一個(gè)名稱為christmastree,在該模塊中,定義一個(gè)全局變量。如下執(zhí)行結(jié)果以主程序的形式執(zhí)行在與模塊同等級(jí)的目錄中,創(chuàng)建一個(gè)main.py的文件,在該文件中導(dǎo)入模塊。執(zhí)行結(jié)果導(dǎo)入模塊后,不僅輸出了全局變量的值,而且模塊中原有的代碼也被執(zhí)行了以主程序的形式執(zhí)行將christmastree模塊原有的測(cè)試代碼放在一個(gè)if語(yǔ)句中,如下執(zhí)行結(jié)果以主程序的形式執(zhí)行再次執(zhí)行導(dǎo)入模塊的main.py文件結(jié)果為說(shuō)明:在每次模塊中都包括一個(gè)記錄模塊名稱的變量__name__,程序可以檢查該變量,以確定它們?cè)谀膫€(gè)模塊中執(zhí)行。如果一個(gè)模塊不是被導(dǎo)入到其他程序中執(zhí)行,那么它可能在解釋器的頂級(jí)模塊中執(zhí)行。頂級(jí)模塊的__name__變量的值為_(kāi)_main__。Python中的包Python中的包Python程序中的包結(jié)構(gòu)包是一個(gè)分層次的目錄結(jié)構(gòu),它將一組功能相近的模塊組織在一個(gè)目錄下。既可以起到規(guī)范代碼的作用,又能避免模塊名重名引起的沖突。在實(shí)際應(yīng)用中,通常會(huì)創(chuàng)建多個(gè)包用于存放不同類的文件。先創(chuàng)建一個(gè)名稱為shop的項(xiàng)目,然后在該項(xiàng)目下創(chuàng)建了admin、home和templates3個(gè)包和一個(gè)manage.py的文件,最后在每個(gè)包中,又創(chuàng)建了相應(yīng)的模塊。Python中的包創(chuàng)建包創(chuàng)建包實(shí)際上就是創(chuàng)建一個(gè)文件夾,并且在該文件夾中必須存在一個(gè)名稱為“__init__.py”的Python文件。在__init__.py文件中,可以不編寫(xiě)任何代碼,也可以編寫(xiě)代碼,在__init__.py文件在所編寫(xiě)的代碼,在導(dǎo)入包時(shí)會(huì)自動(dòng)執(zhí)行。__init__.py文件是一個(gè)模塊文件,模塊名為對(duì)應(yīng)的包名。示例:在E盤(pán)根目錄下,創(chuàng)建一個(gè)名為project的的文件夾,作為工程名。在工程中創(chuàng)建一個(gè)名為settings的文件夾。Python中的包在IDLE中,創(chuàng)建一個(gè)名為“__init__.py”的文件,保存在settings文件夾中,并且該文件不寫(xiě)入任何內(nèi)容。名稱為settings的包就創(chuàng)建完畢了,之后就可以在該包中創(chuàng)建所需的模塊了。Python中的包使用包從包中加載模塊有以下三種方式:通過(guò)“import+完整包名+模塊名”形式加載指定模塊。示例:在settings包中創(chuàng)建一個(gè)size的模塊,并且該模塊定義兩個(gè)變量。如下Python中的包在主函數(shù)中進(jìn)行調(diào)用(若報(bào)錯(cuò)需使用前面的方法添加模塊所在的目錄)。注意:主函數(shù)應(yīng)與包在同一等級(jí)目錄下。使用該方法導(dǎo)入size模塊后,在調(diào)用模塊中的width和height變量時(shí),就需要在變量名前加入“settings.size.”前綴。Python中的包通過(guò)“from+完整包名+import+模塊名”形式加載指定模塊以上一個(gè)示例為例:使用該方法導(dǎo)入模塊,在使用時(shí)不需要帶包的前綴,但是需要帶模塊名的前綴Python中的包通過(guò)“from+完整包名.模塊名+import+定義名”形式加載指定模塊示例:通過(guò)該方法導(dǎo)入模塊的函數(shù)、變量或類后,在使用時(shí)直接使用其名就可以了,不需要再加前綴??赏瑫r(shí)導(dǎo)入該模塊下的多個(gè)定義若想導(dǎo)入模塊下的全部定義,可使用“*”代替定義名引用其他模塊模塊導(dǎo)入和使用標(biāo)準(zhǔn)模塊在Python中,自帶了很多模塊,稱為標(biāo)準(zhǔn)模塊。對(duì)于標(biāo)準(zhǔn)模塊可以直接使用import語(yǔ)句導(dǎo)入到Python文件中使用。導(dǎo)入標(biāo)準(zhǔn)模塊后,也可以使用as關(guān)鍵字為其指定別名。Python提供了大約200多個(gè)內(nèi)置的標(biāo)準(zhǔn)模塊,涵蓋了Python運(yùn)行時(shí)服務(wù)、文字模式匹配、操作系統(tǒng)接口、數(shù)學(xué)運(yùn)算、對(duì)象永久保存、網(wǎng)絡(luò)和Internet腳本和GUI建構(gòu)等方面。模塊Python常見(jiàn)的標(biāo)準(zhǔn)模塊及描述模塊名描述sys與Python解釋器及其環(huán)境操作相關(guān)time提供時(shí)間相關(guān)的各種函數(shù)os提供了訪問(wèn)操作系統(tǒng)服務(wù)功能calendar提供與日期相關(guān)的各種函數(shù)urllib用于讀取來(lái)自服務(wù)器的數(shù)據(jù)json用于使用JSON序列化對(duì)象re用于在字符串中執(zhí)行正則表達(dá)式匹配和替換math提供標(biāo)準(zhǔn)算術(shù)運(yùn)算函數(shù)decimal用于進(jìn)行精確控制運(yùn)算精度、有效位數(shù)和四舍五入操作的十進(jìn)制運(yùn)算logging提供了靈活的記錄事件、錯(cuò)誤、警告和調(diào)試信息等日志信息的功能tkinter使用Python進(jìn)行GUI編程模塊除了上述列舉出來(lái)的標(biāo)準(zhǔn)模塊外,其它模塊可以在幫助文檔中查看。具體操作如下:打開(kāi)Python安裝路徑下的Doc目錄在該目錄的擴(kuò)展名為.chm的文件即為幫助文檔。模塊第三方模塊的下載與安裝除了Python內(nèi)置的標(biāo)準(zhǔn)模塊外,還有很多第三方模塊可以使用。在使用第三方模塊時(shí),需要先下載并安裝該模塊,然后再進(jìn)行導(dǎo)入。下載安裝步驟:使用Python通過(guò)的pip命令實(shí)現(xiàn)pipinstall模塊名清華:/anaconda/cloud/msys2/豆瓣:/simple/第三方模塊實(shí)例在Python2中,PIL(PythonImagingLibrary)是一個(gè)非常好用的圖像處理庫(kù),但PIL不支持Python3,所以有人(AlexClark和Contributors)提供了Pillow,可以在Python3中使用。安裝pipinstallpillowPillow庫(kù)安裝成功后,導(dǎo)包時(shí)要用PIL來(lái)導(dǎo)入,而不能用pillow。importPILfromPILimportImage代碼測(cè)試fromPILimportImageimg_path=r'D:\Develop_soft\pycharm_edu_2021\Project\yuyin_test\1.png'image=Image.open(img_path)print(image.mode)image1=image.convert('1')print(image1.mode)image1.show()image_l=image.convert('L')print(image_l.mode)image_l.show()image_p=image.convert('P')print(image_p.mode)image_p.show()異常處理結(jié)構(gòu)異常處理結(jié)構(gòu)異常概述在程序運(yùn)行的過(guò)程中遇到的各種各樣的錯(cuò)誤統(tǒng)稱為“異?!薄S行╁e(cuò)誤是由于一時(shí)疏忽將關(guān)鍵字敲錯(cuò)導(dǎo)致的,這類錯(cuò)誤大多產(chǎn)生的是“SyntaxError:invalidsyntax”。這類異常是顯示的,很容易發(fā)現(xiàn)。還有一類隱式的錯(cuò)誤,通常和使用者的操作有關(guān)。示例:異常處理結(jié)構(gòu)運(yùn)行程序后,當(dāng)輸入的除數(shù)為0時(shí)會(huì)出現(xiàn)以下異常。產(chǎn)生ZeroDivsionError除數(shù)為0的錯(cuò)誤。除了ZeroDivsionError異常外,Python中還有很多常見(jiàn)的異常。異常處理結(jié)構(gòu)異常描述NameError嘗試訪問(wèn)一個(gè)沒(méi)有聲明的變量IndexError索引超出序列范圍IndentationError縮進(jìn)錯(cuò)誤valueError傳入的值錯(cuò)誤KeyError請(qǐng)求一個(gè)不存在的字典關(guān)鍵字IOError輸入輸出錯(cuò)誤(如要讀取的文件不存在)ImportError當(dāng)import語(yǔ)句無(wú)法找到模塊或from無(wú)法在模塊中找到對(duì)應(yīng)的名稱AttributeError嘗試訪問(wèn)未知的對(duì)象屬性TypeError類型不合適MemoryError內(nèi)存不足ZeroDivisionError除數(shù)為0異常處理語(yǔ)句異常處理語(yǔ)句try…except語(yǔ)句在Python中,提供了try…except語(yǔ)句捕獲并處理異常。使用時(shí),把可能產(chǎn)生異常的代碼放在try語(yǔ)句塊中,處理結(jié)果放在except語(yǔ)句塊中。當(dāng)try語(yǔ)句塊中的代碼出現(xiàn)錯(cuò)誤,就會(huì)執(zhí)行except語(yǔ)句塊中的代碼。如果try語(yǔ)句塊中的代碼沒(méi)有錯(cuò)誤,那么except語(yǔ)句塊就不會(huì)執(zhí)行。格式如下:try:
語(yǔ)句塊1except:
語(yǔ)句塊2異常處理語(yǔ)句使用該語(yǔ)句捕獲以此時(shí),會(huì)捕獲到全部異常。想要捕獲指定的異常可以在except后面加上要捕獲的異常名稱,可使用多個(gè)except指定捕獲多個(gè)異常。示例:捕獲全部異常有異常時(shí)會(huì)執(zhí)行except下的語(yǔ)句。異常處理語(yǔ)句捕獲指定異常異常處理語(yǔ)句(不能匹配錯(cuò)誤類型)異常處理語(yǔ)句try…except…else語(yǔ)句else代碼塊在try語(yǔ)句塊沒(méi)有異常的時(shí)候執(zhí)行,在有異常的時(shí)候不會(huì)執(zhí)行。示例:異常處理語(yǔ)句try…except…finally語(yǔ)句finally代碼塊無(wú)論try語(yǔ)句塊有無(wú)異常都會(huì)執(zhí)行。示例:異常處理語(yǔ)句說(shuō)明:使用except是為了允許處理異常。無(wú)論是否引發(fā)異常,finally語(yǔ)句塊都會(huì)執(zhí)行。如果分配了有限的資源(如打開(kāi)文件),則應(yīng)將釋放這些資源的代碼放置在finally。三種異常處理語(yǔ)句關(guān)系圖:Python文件《智能車Python編程設(shè)計(jì)》基本文件操作寫(xiě)入文件內(nèi)容4關(guān)閉文件2打開(kāi)文件時(shí)使用with語(yǔ)句3創(chuàng)建和打開(kāi)文件1讀取文件5文件概述二進(jìn)制文件直接由比特0和比特1組成,沒(méi)有統(tǒng)一字符編碼,文件內(nèi)部數(shù)據(jù)的組織格式與文件用途有關(guān)。二進(jìn)制文件和文本文件最主要的區(qū)別在于是否有統(tǒng)一的字符編碼無(wú)論文件創(chuàng)建為文本文件或者二進(jìn)制文件,都可以用“文本文件方式”和“二進(jìn)制文件方式”打開(kāi),打開(kāi)后的操作不同。文件概述微實(shí)例7.1:理解文本文件和二進(jìn)制文件的區(qū)別。微實(shí)例7.1m7.1DiffTextBin.py
123456textFile=open("7.1.txt","rt")#t表示文本文件方式print(textFile.readline())textFile.close()binFile=open("7-1.txt","rb")#r表示二進(jìn)制文件方式print(binFile.readline())binFile.close()
文件概述輸出結(jié)果為:>>>
中國(guó)是個(gè)偉大的國(guó)家!b'\xd6\xd0\xb9\xfa\xca\xc7\xb8\xf6\xce\xb0\xb4\xf3\xb5\xc4\xb9\xfa\xbc\xd2\xa3\xa1'采用文本方式讀入文件,文件經(jīng)過(guò)編碼形成字符串,打印出有含義的字符;采用二進(jìn)制方式打開(kāi)文件,文件被解析為字節(jié)(byte)流。由于存在編碼,字符串中的一個(gè)字符由2個(gè)字節(jié)表示。文本文件和二進(jìn)制文件文本文件是一種由若干行字符構(gòu)成的計(jì)算機(jī)文件,可以用文本編輯器進(jìn)行編輯。以txt、htm、py等等為后綴的文件都是文本文件。二進(jìn)制文件一般是指不能用文本編輯器編輯的文件,它們都有各自特定的格式。聲音、圖像、視頻都是二進(jìn)制文件,如果想要打開(kāi)以及修改這些文件,一般需要通過(guò)軟件進(jìn)行,比如用Photoshop可以編輯圖像文件。從本質(zhì)上講,文本文件也是二進(jìn)制文件,因?yàn)橛?jì)算機(jī)處理的全是二進(jìn)制數(shù)據(jù)。文件的打開(kāi)關(guān)閉Python對(duì)文本文件和二進(jìn)制文件采用統(tǒng)一的操作步驟,即“打開(kāi)-操作-關(guān)閉”文件的打開(kāi)關(guān)閉Python通過(guò)解釋器內(nèi)置的open()函數(shù)打開(kāi)一個(gè)文件,并實(shí)現(xiàn)該文件與一個(gè)程序變量的關(guān)聯(lián),open()函數(shù)格式如下:<變量名>=open(<文件名>,<打開(kāi)模式>)
open()函數(shù)有兩個(gè)參數(shù):文件名和打開(kāi)模式。文件名可以是文件的實(shí)際名字,也可以是包含完整路徑的名字文件的打開(kāi)關(guān)閉open()函數(shù)提供7種基本的打開(kāi)模式打開(kāi)模式含義'r'只讀模式,如果文件不存在,返回異常FileNotFoundError,默認(rèn)值'w'覆蓋寫(xiě)模式,文件不存在則創(chuàng)建,存在則完全覆蓋源文件'x'創(chuàng)建寫(xiě)模式,文件不存在則創(chuàng)建,存在則返回異常FileExistsError'a'追加寫(xiě)模式,文件不存在則創(chuàng)建,存在則在原文件最后追加內(nèi)容'b'二進(jìn)制文件模式't'文本文件模式,默認(rèn)值'+'與r/w/x/a一同使用,在原功能基礎(chǔ)上增加同時(shí)讀寫(xiě)功能mode參數(shù)的參數(shù)值r以只讀模式打開(kāi)文件。文件的指針將會(huì)放在文件的開(kāi)頭rb以二進(jìn)制格式打開(kāi)文件,并且采用只讀模式。文件的指針將會(huì)放在文件的開(kāi)頭。一般用于非文本文件,如圖片、聲音等r+打開(kāi)文件后,可以讀取文件內(nèi)容,也可以寫(xiě)入新的內(nèi)容覆蓋原有內(nèi)容(從文件開(kāi)頭進(jìn)行覆蓋)rb+以二進(jìn)制格式打開(kāi)文件,并且采用讀寫(xiě)模式。文件的指針將會(huì)放在文件的開(kāi)頭。一般用于非文本文件,如圖片、聲音等w以只寫(xiě)模式打開(kāi)文件wb以二進(jìn)制格式打開(kāi)文件,并且采用只寫(xiě)模式。一般用于非文本文件,如圖片、聲音等w+打開(kāi)文件后,先清空原有內(nèi)容,使其變?yōu)橐粋€(gè)空的文件,對(duì)這個(gè)空文件有讀寫(xiě)權(quán)限wb+以二進(jìn)制格式打開(kāi)文件,并且采用讀寫(xiě)模式。一般用于非文本文件,如圖片、聲音等a以追加模式打開(kāi)一個(gè)文件。如果該文件已經(jīng)存在,文件指針將放在文件的末尾(即新內(nèi)容會(huì)被寫(xiě)入到已有內(nèi)容之后),否則,創(chuàng)建新文件用于寫(xiě)入ab以二進(jìn)制格式打開(kāi)文件,并且采用追加模式。如果該文件已經(jīng)存在,文件指針將放在文件的末尾(即新內(nèi)容會(huì)被寫(xiě)入到已有內(nèi)容之后),否則,創(chuàng)建新文件用于寫(xiě)入a+以讀寫(xiě)模式打開(kāi)文件。如果該文件已經(jīng)存在,文件指針將放在文件的末尾(即新內(nèi)容會(huì)被寫(xiě)入到已有內(nèi)容之后),否則,創(chuàng)建新文件用于讀寫(xiě)ab+以二進(jìn)制格式打開(kāi)文件,并且采用追加模式。如果該文件已經(jīng)存在,文件指針將放在文件的末尾(即新內(nèi)容會(huì)被寫(xiě)入到已有內(nèi)容之后),否則,創(chuàng)建新文件用于讀寫(xiě)關(guān)于打開(kāi)方式的幾點(diǎn)說(shuō)明“+”號(hào)放在其他模式后面,添加該模式所沒(méi)有的讀文件或?qū)懳募墓δ堋1热纾篴+表示可讀寫(xiě),寫(xiě)入只能在文件末尾進(jìn)行w+表示可讀寫(xiě),該方式先清空文件,然后寫(xiě)入r+表示可讀寫(xiě),不清空原有內(nèi)容,可在文件任何位置寫(xiě)入,默認(rèn)位置為起始位置rb+、ab+、wb+與r+、a+、w+類似,只是前面三者打開(kāi)二進(jìn)制文件凡是帶r的打開(kāi)方式(包括r、r+、rb、rb+等)都是打開(kāi)已經(jīng)存在的文件,若文件不存在,則文件打開(kāi)失敗。凡是帶w和a的文件打開(kāi)方式(包括w、w+、wb、wb+、a、a+等),可以打開(kāi)已經(jīng)存在的文件;若文件不存在,則創(chuàng)建一個(gè)新文件。文件的讀寫(xiě)根據(jù)打開(kāi)方式不同可以對(duì)文件進(jìn)行相應(yīng)的讀寫(xiě)操作,Python提供4個(gè)常用的文件內(nèi)容讀取方法方法含義<file>.readall()讀入整個(gè)文件內(nèi)容,返回一個(gè)字符串或字節(jié)流*<file>.read(size=-1)從文件中讀入整個(gè)文件內(nèi)容,如果給出參數(shù),讀入前size長(zhǎng)度的字符串或字節(jié)流<file>.readline(size=-1)從文件中讀入一行內(nèi)容,如果給出參數(shù),讀入該行前size長(zhǎng)度的字符串或字節(jié)流<file>.readlines(hint=-1)從文件中讀入所有行,以每行為元素形成一個(gè)列表,如果給出參數(shù),讀入hint行
如果hint大于前n行的總字?jǐn)?shù)但小于前n+1行的總字?jǐn)?shù),則執(zhí)行函數(shù)會(huì)讀取文件的前n+1行文件的讀寫(xiě)微實(shí)例7.2:文本文件逐行打印微實(shí)例7.2m7.2PrintFilebyLines.py
12345fname=input("請(qǐng)輸入要打開(kāi)的文件:")fo=open(fname,"r")forlineinfo.readlines():print(line)fo.close()
文件的讀寫(xiě)遍歷文件的所有行可以直接這樣完成
12345fname=input("請(qǐng)輸入要打開(kāi)的文件:")fo=open(fname,"r")forlineinfo:print(line)fo.close()
文件的讀寫(xiě)如果程序需要逐行處理文件內(nèi)容,建議采用上述代碼格式:fo=open(fname,"r")forlineinfo:#處理一行數(shù)據(jù)fo.close()文件的讀寫(xiě)Python提供3個(gè)與文件內(nèi)容寫(xiě)入有關(guān)的方法,如表所示。方法含義<file>.write(s)向文件寫(xiě)入一個(gè)字符串或字節(jié)流<file>.writelines(lines)將一個(gè)元素為字符串的列表寫(xiě)入文件<file>.seek(offset)改變當(dāng)前文件操作指針的位置,offset的值:0:文件開(kāi)頭;1:當(dāng)前位置;2:文件結(jié)尾文件的讀寫(xiě)微實(shí)例7.3m7.3WriteListtoFile.py
1234567fname=input("請(qǐng)輸入要寫(xiě)入的文件:")
fo=open(fname,"w+")ls=["唐詩(shī)","宋詞","元曲"]fo.writelines(ls)fo.close()
程序執(zhí)行結(jié)果如下:>>>請(qǐng)輸入要寫(xiě)入的文件:test.txt>>>
當(dāng)用open()函數(shù)以讀文件的方式打開(kāi)一個(gè)文件時(shí),如果文件不存在,函數(shù)就會(huì)拋出一個(gè)異常錯(cuò)誤能否使程序遇到上面異常情形時(shí)也能以正常方式結(jié)束或執(zhí)行其他語(yǔ)句呢?這就要用到python的異常處理機(jī)制。 try: <body> except<EceptionType>: <handle>語(yǔ)句<body>是可能引起異常的部分,<EceptionType>指某種類型的異常,<handle>指處理異常的語(yǔ)句例如:try: f=open('readfile.txt','r')exceptFileNotFoundError: print('文件readfile.txt不存在')如何避免文件打開(kāi)異常每個(gè)打開(kāi)的文件都有一個(gè)隱含的文件指針用于標(biāo)記位置,它實(shí)質(zhì)上是一個(gè)從文件頭部開(kāi)始計(jì)算字節(jié)數(shù)的long型變量它指向的位置就是文件讀寫(xiě)操作的當(dāng)前位置文件打開(kāi)方式不同則指針的開(kāi)始位置也不同。比如以包含r或w的方式打開(kāi)則文件指針初始位置是指向文件頭部,以包含a的方式打開(kāi)則指針初始位置是指向文件尾部。每讀或?qū)懭舾蓚€(gè)字節(jié),指針就在文件中后移相同數(shù)量的字節(jié)。文件指針定位函數(shù)可以讓程序員了解指針的位置或自己指定讀寫(xiě)位置。文件指針的概念有時(shí)需要知道文件指針的位置,有時(shí)需要移動(dòng)文件指針
獲取文件指針的位置(文件對(duì)象為fp)L=fp.tell()
這里L(fēng)實(shí)際上是從文件頭部到當(dāng)前位置的字節(jié)數(shù)。移動(dòng)文件的指針
fp.seek(offset[,where])#[]表示其中參數(shù)可省略該函數(shù)把文件指針移動(dòng)到相對(duì)于where的offset位置。Whence:用于指定從什么位置開(kāi)始計(jì)算。0表示從頭開(kāi)始,1表示從當(dāng)前位置開(kāi)始,2表示從文件尾部開(kāi)始。文件指針定位函數(shù)defmain():#打開(kāi)文件用于寫(xiě)入
f=open("result.txt",'w')#寫(xiě)入三個(gè)字符串,沒(méi)有換行符
f.write("北京")f.write("上海")f.write("西安")#寫(xiě)入字符串,包含換行符
f.write("\n北京\n")f.write("上海\n西安\n")f.close()main()#執(zhí)行主函數(shù)【例1】利用write()函數(shù)寫(xiě)入字符串信息【例2】利用writelines()函數(shù)寫(xiě)入列表中的信息defmain(): #打開(kāi)文件用于寫(xiě)入f=open("result.txt",'w')#寫(xiě)入列表,其中每個(gè)元素都沒(méi)有換行符L1=["交通大學(xué)","長(zhǎng)安大學(xué)","西北大學(xué)"]f.writelines(L1)f.writelines("\n")#生成新列表,其中每個(gè)元素最后都是換行符newList=[line+'\n'forlineinL1]#寫(xiě)入新列表f.writelines(newList)f.close()main()#執(zhí)行主函數(shù)【例3】向例2生成的文件添加信息defmain():#打開(kāi)文件用于添加f=open("result.txt",'a')f.writelines("\n")str='這是新的一行'#添加一行字符串f.write(str)f.close()main()#執(zhí)行主函數(shù)【例4】讀文件中的若干字節(jié)、讀一行、讀多行、讀取全文、迭代讀取defmain():#先生成文件
f=open("result.txt",'w')f.writelines("西安交通大學(xué)\n")f.writelines("Xi'anJiaotongUniversity\n")f.close()ifile=open("result.txt",'r')print('[1]測(cè)試read(N):')s1=ifile.read(2)#讀取前兩個(gè)漢字
print(s1)ifile.seek(14,0)s1=ifile.read(5)#讀取第二行前兩5個(gè)字符
print(s1)ifile.close()[1]測(cè)試read(N):西安Xi'an
ifile=open("result.txt",'r')print('\n[2]測(cè)試readline():')s2=ifile.readline()#讀取第一行,注意有'\n'print(s2)ifile.close()
ifile=open("result.txt",'r')print('[3]測(cè)試readlines():')L=ifile.readlines()#讀取數(shù)據(jù)到列表Lprint(L)ifile.close()
[2]測(cè)試readline():西安交通大學(xué)[3]測(cè)試readlines():['西安交通大學(xué)\n',"Xi'anJiaotongUniversity\n"]
ifile=open("result.txt",'r')print('\n[4]測(cè)試read()讀取全文:')str1=ifile.read()#讀取全文到字符串str1print(str1)ifile.close()
print('[5]測(cè)試for循環(huán)迭代讀取全文:')ifile=open("result.txt",'r')i=1forlineinifile:print('第',str(i),'行:',line,end="")i=i+1 ifile.close()main()#執(zhí)行主函數(shù)[4]測(cè)試read()讀取全文:西安交通大學(xué)Xi'anJiaotongUniversity
[5]測(cè)試for循環(huán)迭代讀取全文:第1行:西安交通大學(xué)第2行:Xi'anJiaotongUniversity9讀寫(xiě)數(shù)字類型信息【例5】輸入學(xué)生成績(jī)生成文件,再讀取信息計(jì)算平均成績(jī)請(qǐng)輸入需要錄入成績(jī)的學(xué)生人數(shù):2姓名:戰(zhàn)三數(shù)學(xué):23英語(yǔ):35姓名:李四數(shù)學(xué):78英語(yǔ):90成績(jī)單----------------戰(zhàn)三233529.0李四789084.0defwrite_grade(n):fp=open("grade.txt",'w')foriinrange(n):name=input('姓名:')math=int(input('數(shù)學(xué):'))english=int(input('英語(yǔ):'))line=name+""+str(math)+""+str(english)+'\n'fp.write(line)fp.close()【例5】參考答案defread_grade():ifile=open("grade.txt",'r')print("成績(jī)單\n----------------")forlineinifile:L=line.split() #將字符串以空格分開(kāi)存入列表avg=(float(L[1])+float(L[2]))/2print(L[0],L[1],L[2],avg)ifile.close()if__name__=='__main__':n=int(input('請(qǐng)輸入需要錄入成績(jī)的學(xué)生人數(shù):'))write_grade(n)read_grade()【運(yùn)行結(jié)果】姓名:李四數(shù)學(xué):89英語(yǔ):85姓名:王五數(shù)學(xué):90英語(yǔ):80成績(jī)單----------------李四898587.0王五908085.0
目錄操作創(chuàng)建目錄4路徑2判斷目錄是否存在3os和os.path模塊1刪除目錄5遍歷目錄6
os模塊提供的與目錄相關(guān)的函數(shù)getcwd()返回當(dāng)前的工作目錄listdir(path)返回指定路徑下的文件和目錄信息mkdir(path[,mode])創(chuàng)建目錄makedirs(path1/path2…[,mode])創(chuàng)建多級(jí)目錄rmdir(path)刪除目錄removedirs(path1/path2……)刪除多級(jí)目錄chdir(path)把path設(shè)置為當(dāng)前工作目錄walk(top[,topdown[,onerror]])遍歷目錄樹(shù),該方法返回一個(gè)元組,包括所有路徑名、所有目錄列表和文件列表3個(gè)元素
os.path模塊提供的與目錄相關(guān)的函數(shù)abspath(path)用于獲取文件或目錄的絕對(duì)路徑exists(path)用于判斷目錄或者文件是否存在,如果存在則返回True,否則返回Falsejoin(path,name)將目錄與目錄或者文件名拼接起來(lái)splitext()分離文件名和擴(kuò)展名basename(path)從一個(gè)目錄中提取文件名dirname(path)從一個(gè)路徑中提取文件路徑,不包括文件名isdir(path)用于判斷是否為路徑路徑1.絕對(duì)路徑2.相對(duì)路徑對(duì)于路徑的操作,指定路徑時(shí)需要對(duì)路徑分割符進(jìn)行轉(zhuǎn)義。即‘\’替換為‘\\’或‘\’替換為‘/’。也可以在字符串前加字符r或R,原樣輸出。例:os.path.isdir(r'D:\Develop_soft\python3.7.2\ch5')os.path.abspath(path)獲取一個(gè)文件的絕對(duì)路徑。path可以是文件或目錄。os.path.join(path1[,path2[,……]])兩個(gè)或多個(gè)路徑拼接為一個(gè)新的路徑。多個(gè)路徑用逗號(hào)分割拼接是不會(huì)檢測(cè)路徑是否真實(shí)存在。os.path.exists(path)判斷path的文件或文件夾是否存在。存在返回True,否則返回Falseos.path.isfile(path)判斷path的文件是否存在。存在返回True,否則返回Falseos.path.isdir(path)判斷path的文件夾是否存在。存在返回True,否則返回Falseos.mkdir(name,mode=0o777)創(chuàng)建一級(jí)目錄Path:指定創(chuàng)建目錄的路徑Mode:指定數(shù)值模式,默認(rèn)值0o777,在非UNIX系統(tǒng)上無(wú)效。注意:創(chuàng)建目錄如果已經(jīng)存在,則拋出異常FileExistsError。>>>os.mkdir('D:\\Develop_soft\\python3.7.2\\ch5')Traceback(mostrecentcalllast):File"<pyshell#2>",line1,in<module>os.mkdir('D:\\Develop_soft\\python3.7.2\\ch5')FileExistsError:[WinError183]當(dāng)文件已存在時(shí),無(wú)法創(chuàng)建該文件。:'D:\\Develop_soft\\python3.7.2\\ch5'os.makedirs(name,mode=0o777)創(chuàng)建多級(jí)目錄Name:指定創(chuàng)建的路徑例:os.makedirs(R'D:\Develop_soft\ch8')注意:當(dāng)目錄不存在時(shí)會(huì),自動(dòng)創(chuàng)建;可以創(chuàng)建多個(gè)子目錄。目錄存在時(shí),同樣會(huì)拋出異常。解決創(chuàng)建文件夾存在時(shí)的問(wèn)題importospath='C:\\demo'ifnotos.path.exists(path):os.makedirs(path)print('目錄創(chuàng)建成功')else:print('目錄已存在!')os.rmdir(path)刪除目錄Path:刪除的路徑(絕對(duì)或相對(duì)路徑)注意:只能刪除空目錄刪除非空目錄(shutil模塊)importshutilshutil.rmtree(R'D:\python3.7.2\ch5')列出目錄內(nèi)容os.listdir(path)返回文件及目錄名字的字符串列表。importoss=os.listdir('D:\\Develop_soft\\1')print(s)查看文件大小os.path.getsize(path)path:文件及路徑importostotalsize=os.path.getsize(r'D:\python3.7\1.txt')print(totalsize)統(tǒng)計(jì)文件夾中文件大小importostotalsize=0os.chdir(r'D:\Develop_soft\python3.7.2\1')forfilenameinos.listdir(os.getcwd()):totalsize+=os.path.getsize(filename)print(totalsize)os.walk(top[,topdown][,onerror][,followlinks])遍歷目錄Top:指定遍歷內(nèi)容的根目錄Topdown:指定遍歷順序,默認(rèn)從根目錄開(kāi)始返回值3個(gè):(dirpath,dirnames,filenames)字符串列表列表遍歷指定目錄importostuples=os.walk('D:\\Develop_soft\\python3.7.2\\1')fortuple1intuples:print(tuple1)運(yùn)行結(jié)果('D:\\Develop_soft\\python3.7.2\\1',['3'],['1.txt','2.txt'])('D:\\Develop_soft\\python3.7.2\\1\\3',[],[])高級(jí)文件操作刪除文件1重命名文件和目錄2獲取文件基本信息3os.remove(path)刪除文件Path:刪除文件路徑注意:刪除文件不存在時(shí),拋出異常。os.rename(src,dst)重命名文件和函數(shù)Src:指定進(jìn)行重命名的目錄或文件Dst:指定重命名后的目錄或文件注意:重命名時(shí),只能修改最后一級(jí)目錄名稱,否則拋出異常。os.stat(path)獲取文件的基本信息屬性說(shuō)明ST_MODE獲取文件模式ST_SIZE文件大小,字節(jié)ST_MTIME文件最后修改時(shí)間ST_ATIME文件最后訪問(wèn)時(shí)間ST_CTIME文件創(chuàng)建時(shí)間獲取文件基本信息-實(shí)例importosimporttimeifos.path.exists('123.txt'):f=os.stat('123.txt')print('文件完整的路徑:',os.path.abspath('123.txt'))print('文件大?。?,f.st_size,'字節(jié)')print('最后一次修改時(shí)間:',f.st_mtime)續(xù)--獲取具體時(shí)間#利用localtime()轉(zhuǎn)換為時(shí)間元組,然后格式化為需要的格式
timeS=f.st_mtimetimeA=time.localtime(timeS)print(timeA)otherStyleTime=time.strftime("%Y-%m-%d%H:%M:%S",timeA)print(otherStyleTime)作業(yè)3-(4)f=open('123.txt','r’)fstr=f.readlines()print(fstr)a=[]s=len(fstr)foriinrange(s):x=len(fstr[i])a.append(x)print(a.index(max(a))+1)print(a.index(min(a))+1)f.close()Python異常處理《智能車Python編程設(shè)計(jì)》課程大綱1.常見(jiàn)異常2.異常處理語(yǔ)句try…except語(yǔ)句try…except…else語(yǔ)句try…except…finally語(yǔ)句raise語(yǔ)句3.自定義異常4.斷言與上下文管理器斷言上下文管理器常見(jiàn)的異常及其描述常見(jiàn)的異常異常及描述如果輸入的數(shù)據(jù)不符合程序要求,就會(huì)拋出異常并停止運(yùn)行。這時(shí),就需要在開(kāi)發(fā)程序時(shí)對(duì)可能出現(xiàn)異常的情況進(jìn)行處理。NameError:嘗試訪問(wèn)一個(gè)沒(méi)有聲明的變量時(shí)引發(fā)的錯(cuò)誤IndexError:索引超出序列范圍時(shí)引發(fā)的錯(cuò)誤IndentationError:
縮進(jìn)錯(cuò)誤ValueError:傳入的值錯(cuò)誤KeyError:請(qǐng)求一個(gè)不存在的字典關(guān)鍵字時(shí)引發(fā)的錯(cuò)誤IOError:輸入/輸出錯(cuò)誤ImportError:當(dāng)import語(yǔ)句無(wú)法找到模塊或者from無(wú)法在模塊中找到相應(yīng)的名稱時(shí)引發(fā)的錯(cuò)誤AttibuteError:嘗試訪問(wèn)未知的對(duì)象屬性時(shí)引發(fā)的錯(cuò)誤TypeError:類型不合適時(shí)引發(fā)的錯(cuò)誤MemoryError:內(nèi)存不足ZeroDivisionError:除數(shù)為0時(shí)引發(fā)的錯(cuò)誤異常處理語(yǔ)句異常處理語(yǔ)句try…except語(yǔ)句:把可能產(chǎn)生異常的代碼放在try語(yǔ)句塊中,把處理結(jié)果放在except語(yǔ)句塊中當(dāng)try語(yǔ)句塊中的代碼出現(xiàn)錯(cuò)誤時(shí),就會(huì)執(zhí)行except語(yǔ)句塊中的代碼;如果try語(yǔ)句塊中的代碼沒(méi)有報(bào)錯(cuò),那么except語(yǔ)句塊將不會(huì)執(zhí)行。try: block1except[ExceptionName[asalias]]: block2異常處理語(yǔ)句try…except…else語(yǔ)句:在try...except語(yǔ)句的基礎(chǔ)上再添加一個(gè)else子句,用于指定當(dāng)try語(yǔ)句模塊中沒(méi)有出現(xiàn)異常時(shí)要執(zhí)行的語(yǔ)句塊。該語(yǔ)句塊中的內(nèi)容在try語(yǔ)句中出現(xiàn)異常時(shí),將不被執(zhí)行。try: result=20/int(input('請(qǐng)輸入除數(shù):
‘)) print(result)exceptValueError: print('必須輸入整數(shù)')exceptArithmeticError: print('算術(shù)錯(cuò)誤,除數(shù)不能為0')else: print('沒(méi)有出現(xiàn)異常')print("繼續(xù)執(zhí)行")異常處理語(yǔ)句try…except…finally語(yǔ)句:完整的異常處理語(yǔ)句應(yīng)包含finally代碼模塊。通常情況下,無(wú)論程序中有無(wú)異常產(chǎn)生,finally代碼模塊中的代碼都會(huì)被執(zhí)行try: block1except[ExceptionName[asalias]]: block2finally: block3異常處理語(yǔ)句raise語(yǔ)句拋出異常:其中,ExceptionName[(reason)]為可選參數(shù),用于指定異常的名稱,以及異常信息的相關(guān)描述。如果省略,就會(huì)把當(dāng)前信息的錯(cuò)誤原樣拋出。raise語(yǔ)法格式:raise[ExceptionName[(reason)]]示例:x=10
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2026安徽淮南市壽縣職業(yè)中專學(xué)校機(jī)電專業(yè)職教高考教師招聘2人考試參考試題及答案解析
- 2026年安康市漢濱區(qū)第一醫(yī)院招聘(17人)考試參考試題及答案解析
- 2026江蘇揚(yáng)州錦耀置業(yè)有限公司招聘專業(yè)工作人員1人考試參考題庫(kù)及答案解析
- 2026鞍鋼工程發(fā)展公司高校畢業(yè)生招聘(遼寧)考試備考題庫(kù)及答案解析
- 2026日照銀行見(jiàn)習(xí)人員招聘10人考試備考試題及答案解析
- 2026浙江臺(tái)州恩澤醫(yī)療中心(集團(tuán))招聘高層次衛(wèi)技人員51人考試參考題庫(kù)及答案解析
- 北京市豐臺(tái)區(qū)東鐵匠營(yíng)街道蒲黃榆社區(qū)衛(wèi)生服務(wù)中心招聘1人考試參考試題及答案解析
- 2026云南保山市昌寧縣融媒體中心招聘公益性崗位人員1人考試參考題庫(kù)及答案解析
- 2026福建福州市閩侯縣教育局研究生招聘44人考試參考試題及答案解析
- 2026年安徽醫(yī)科大學(xué)臨床醫(yī)學(xué)院人才招聘124名考試參考題庫(kù)及答案解析
- 2026秋招:澳森特鋼集團(tuán)試題及答案
- 哲學(xué)史重要名詞解析大全
- 2026年寧夏黃河農(nóng)村商業(yè)銀行科技人員社會(huì)招聘?jìng)淇碱}庫(kù)及答案詳解(易錯(cuò)題)
- 銀行借款抵押合同范本
- DB37-T4975-2025分布式光伏直采直控技術(shù)規(guī)范
- 兒童糖尿病的發(fā)病機(jī)制與個(gè)體化治療策略
- 脫硫廢水零排放項(xiàng)目施工方案
- 2026年海南衛(wèi)生健康職業(yè)學(xué)院?jiǎn)握芯C合素質(zhì)考試題庫(kù)參考答案詳解
- 水泥產(chǎn)品生產(chǎn)許可證實(shí)施細(xì)則2025
- 急性心梗合并急性心衰護(hù)理
- 專業(yè)技術(shù)人員繼續(xù)教育學(xué)時(shí)認(rèn)定登記匯總表
評(píng)論
0/150
提交評(píng)論