Python程序設(shè)計基礎(chǔ) 課件 第五章 函數(shù)與模塊_第1頁
Python程序設(shè)計基礎(chǔ) 課件 第五章 函數(shù)與模塊_第2頁
Python程序設(shè)計基礎(chǔ) 課件 第五章 函數(shù)與模塊_第3頁
Python程序設(shè)計基礎(chǔ) 課件 第五章 函數(shù)與模塊_第4頁
Python程序設(shè)計基礎(chǔ) 課件 第五章 函數(shù)與模塊_第5頁
已閱讀5頁,還剩104頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

第五章函數(shù)與模塊Contents常用內(nèi)置函數(shù)自定義函數(shù)遞歸函數(shù)包與模塊本章小結(jié)復(fù)合函數(shù)計算機程序設(shè)計的一個重要方法是“模塊”化編程方法,這種程序設(shè)計方法是將實現(xiàn)的功能細(xì)分為基本的功能單元,這些功能單元用“函數(shù)”實現(xiàn),稱為“模塊”。在Python語言中,模塊有特別的含義,Python語言的模塊專用于指包含了Python代碼的文件。本章將首先介紹Python語言常用的內(nèi)置函數(shù)。接著介紹自定義函數(shù)和遞歸函數(shù)的創(chuàng)建與調(diào)用方法,最后介紹Python語言中常用的模塊及包。01常用內(nèi)置函數(shù)5.1常用內(nèi)置函數(shù)在Python語言中,調(diào)用一個函數(shù)前,需要先定義該函數(shù),或者裝載該函數(shù)所在的模塊(或包),也就是說,函數(shù)必須先定義后使用。調(diào)用Python內(nèi)置函數(shù)同樣遵循先定義后使用的規(guī)則,但是無需為內(nèi)置函數(shù)裝載包或聲明,Python語言“解釋器”自動識別內(nèi)置函數(shù)并完成內(nèi)置函數(shù)的執(zhí)行。這里僅討論最常用的53個內(nèi)置函數(shù)。5.1常用內(nèi)置函數(shù)常用Python內(nèi)置函數(shù)序號函數(shù)名含義典型用法1abs求整數(shù)或浮點數(shù)的絕對值或求復(fù)數(shù)的模abs(-4+3j)返回5.02all全稱謂詞,當(dāng)其參數(shù)全為真時,返回真;否則返回假all((3,0,1)返回Flase;all(['a',3,7])返回True;參數(shù)為空列表或空元組時,返回真3any存在謂詞,當(dāng)其參數(shù)全為假時,返回假;否則返回真any((3,0,1))返回真;any參數(shù)為空列表或空元組時返回假4bin求一個整數(shù)的二進制字符串bin(-35)返回-0b1000115.1常用內(nèi)置函數(shù)5bool返回邏輯值真或假:非零參數(shù)返回真;0或空返回假bool('a')返回True;bool()返回False6chr將整數(shù)(作為Unicode碼)轉(zhuǎn)化為字符chr(65)返回“A”7@classmethod聲明其后的方法為類方法(使用類名調(diào)用的方法,而不是對象調(diào)用的方法),類方法又稱靜態(tài)方法,對象調(diào)用的方法使用動態(tài)方法(因為對象創(chuàng)建后,才創(chuàng)建對象調(diào)用的方法)classmyMath:@classmethoddefmax(cls,a,b):returnaifa>belseb調(diào)用時:myMath.max(3,5)返回58complex返回復(fù)數(shù)complex(3,5)返回3+5j,也可以直接輸入3+5j(注意,只能用j)5.1常用內(nèi)置函數(shù)9delattr刪除對象的屬性delattr(obj,'x

')相當(dāng)于delobj.x,這里obj為對象,x為obj對象的屬性(類相關(guān)內(nèi)容見第6章)10dict生成字典見第4.3節(jié)11dir無參數(shù)時,返回局部標(biāo)簽列表;對象名或類名為參數(shù)時,返回對象或類的方法列表dir(list)返回列表的內(nèi)置方法12divmoddivmod(a,b)得到元組(a//b,a%b)divmod(33,9)得到(3,6)13enumerateenumerate(迭代器對象,start=0),start為枚舉起始值,返回一個枚舉對象enumerate(['a','b','c','d'],start=3)返回一個枚舉對象,轉(zhuǎn)化為列表為:[(3,'a'),(4,'b'),(5,'c'),(6,'d')]14eval執(zhí)行字符串表達式x=3y=eval('pow(x,2)')#得到y(tǒng)=95.1常用內(nèi)置函數(shù)15filterfilter(謂詞函數(shù),迭代器)返回使“謂詞函數(shù)”為真的“迭代器”中的元素組成的新迭代器filter(lambdax:x%2==0,range(1,10+1))轉(zhuǎn)化為列表為[2,4,6,8,10]16float將整數(shù)或字符串轉(zhuǎn)化為浮點數(shù),這里的“字符串”只能為數(shù)字0~9,可以帶有前導(dǎo)的正、負(fù)號float('-5.1')返回浮點數(shù)-5.117format格式化字符串見第2.5節(jié)18getattrgetattr(obj,

'x')返回對象obj的屬性x的值類相關(guān)內(nèi)容見第6章19globals返回包含當(dāng)前所有全局變量的字典5.1常用內(nèi)置函數(shù)20hasattrhasattr(obj,'x')判斷對象obj是否具有屬性x見第6章21hex返回一個整數(shù)的十六進制字符串hex(185)得到字符串“0xb9”22idid(x)獲取x的內(nèi)存地址23input標(biāo)準(zhǔn)輸入函數(shù)見第2.1節(jié)24int將數(shù)值或字符串轉(zhuǎn)化為整數(shù)int(-3.4)返回-3int('0xF2',16)返回24225isinstanceisinstance(obj,類型)判斷對象obj是否為該“類型”,若是,返回True;否則,返回Falseisinstance(3,int)返回True5.1常用內(nèi)置函數(shù)26issubclassissubclass(sclass,pclass)判斷sclass是否為pclass的子類,若是,返回True;否則,返回False27iter創(chuàng)建一個迭代器對象,具有兩個參數(shù),第2個參數(shù)為可選參數(shù)。若無第2個參數(shù),第1個參數(shù)應(yīng)為可迭代對象;若有第2個參數(shù),第1個參數(shù)還需要具有next方法,如果遍歷第1個參數(shù)遇到等于第2個參數(shù)的對象時,觸發(fā)StopIteration異常(停止迭代)classA:def__init__(self,a):self.x=aself.idx=0def__next__(self):cur=self.x[self.idx]self.idx+=1returncurdef__call__(self,*args,**kwargs):returnself.__next__()if__name__=='__main__':o=A([1,2,3,4,5,6,7])foreiniter(o,5):print(e,end='')將輸出“1234”(類的內(nèi)容見第6章)28len返回對象的元素個數(shù)len((3,4,5))得到329list列表函數(shù)見第2.4節(jié)30locals返回包含當(dāng)前局部變量的字典31map映射函數(shù)map(函數(shù),迭代器對象),將函數(shù)作用于迭代器對象的每個元素上map(lambdax,y:x+y,[1,2,3],[4,5,6])返回結(jié)果轉(zhuǎn)化為列表為[5,7,9]5.1常用內(nèi)置函數(shù)32max返回可迭代器對象中的最大值元素max([3,11,10,7])返回1133min返回可迭代器對象中的最小值元素max([3,11,10,7])返回334nextnext(迭代器)返回“迭代器”的當(dāng)前元素,當(dāng)“迭代器”遍歷完后,繼續(xù)調(diào)用next將觸發(fā)StopIteration異常;next(迭代器,def)與“next(迭代器)”含義相同,但是當(dāng)“迭代器”遍歷完后,繼續(xù)調(diào)用next將輸出“def”而不觸發(fā)StopIteration異常it=iter([4,5,6])print(next(it,5))print(next(it,5))print(next(it,5))print(next(it,5))上述將輸出:4#第一次調(diào)用next輸出值5#第二次調(diào)用next輸出值6#第三次調(diào)用next輸出值5#迭代器已遍歷完后的輸出值35open創(chuàng)建文件對象見第7章5.1常用內(nèi)置函數(shù)36ordord(字符)返回“字符”的Unicode碼,為函數(shù)chr的反作用函數(shù)ord('a')返回9737powpow(x,y)返回xy;pow(x,y,z)返回xy%zpow(5,2,7)得到438print標(biāo)準(zhǔn)輸出函數(shù)見2.1節(jié)39property用于指定類的set方法、get方法、del方法(刪除屬性)和doc方法(屬性說明)或使用如下形式:classA:def__init__(self):self.x=0@propertydefxp(self):returnself.x@xp.setterdefxp(self,v):self.x=v@xp.deleterdefxp(self):delself.xif__name__=='__main__':a=A()a.xp=3classA:def__init__(self):self.x=0defgetX(self):returnself.xdefsetX(self,v):self.x=vdefdelX(self):delself.xxp=property(getX,setX,delX,"x'sproperty.")if__name__=='__main__':a=A()a.xp=3上述a.xp=3將自動執(zhí)行setX方法,設(shè)置對象a的x為3(好處在于保護了內(nèi)部的x),而讀a.xp將調(diào)用getX方法,dela.xp將執(zhí)行delX方法(類的內(nèi)容見第6章)5.1常用內(nèi)置函數(shù)40rangerange(i,j,k)生成一個整數(shù)序列,從i至j-1,步長為ki可省略,缺省為0;k可省略,缺省為1list(range(5))返回[0,1,2,3,4]41reversedreversed(對象)將可迭代的對象逆序排列l(wèi)ist(reversed([3,5,8,2]))返回[2,8,5,3]42round四舍五入函數(shù)。round(數(shù)值)返回與“數(shù)值”最近的整數(shù);round(數(shù)值,n)返回與“數(shù)值”最近的保留n位小數(shù)的數(shù)值round(3.8756,2)返回3.8843setattrsetattr(obj,

'x',v)將對象obj的屬性x設(shè)置為v(x必須為對象obj的屬性)setattr(obj,'x',3)等價于obj.x=3,這里obj為對象這里承接第39號的表格,例如:setattr(a,'xp',5)等價于a.xp=55.1常用內(nèi)置函數(shù)44set集合函數(shù)見第4.2節(jié)45sliceslice(a,b,c)等價于a:b:c(注:從a按步長c遞增到b-1)46sorted對可迭代對象排序,具有關(guān)鍵字參數(shù)reverse,reverse=True表示降序排列;reverse=False為缺省值,表示升序排列sorted([8,3,11,4,12,9],reverse=True)返回[12,11,9,8,4,3]47@staticmethod指示創(chuàng)建靜態(tài)方法注意:與@classmethod的區(qū)別classmyMath:@staticmethoddefmax(a,b):returnaifa>belseb調(diào)用時:myMath.max(3,5)返回548str字符串函數(shù)見第2.5節(jié)5.1常用內(nèi)置函數(shù)49sumsum(obj,start=0)對對象求和,關(guān)鍵字參數(shù)start=0可省略,表示從索引0開始累加sum(range(0,10+1),start=3)返回5850super類的子類中使用,用于指代父類對象類相關(guān)內(nèi)容見第6章51tuple元組函數(shù)見4.1節(jié)52typetype(obj)返回對象obj的類型53zipzip(obj1,obj2,…,objn)為多個具有相同長度的對象建立相同位置的元素間的關(guān)聯(lián),結(jié)果為zip對象,其中的每個元素以元組形式存在a=zip([1,3,5],[2,4,6],[13,15,17])foreina:print(e)上述代碼得到:(1,2,13)(3,4,15)(5,6,17)5.1常用內(nèi)置函數(shù)Python內(nèi)置函數(shù)直接調(diào)用演示實例:1if__name__=='__main__':2a=[6,4,9,10,13,2,8,5]3b=sorted(a)4print(f'Original:{a}')5print(f'Sorted:')6c=reversed(b)5.1常用內(nèi)置函數(shù)7print(f'Reversed:{list(c)}')8print(f'Lengthofa:{len(a)}')9d=list(zip(a,b))10print(f'Listofzip(a,b):\n3iw16gd')11u=list(map(lambdax:sum(x),d))12print(f'Sumofeachtuple:{u}')5.1常用內(nèi)置函數(shù)程序執(zhí)行結(jié)果:模塊zym0501運行結(jié)果02自定義函數(shù)5.2自定義函數(shù)內(nèi)置函數(shù)主要實現(xiàn)通用數(shù)據(jù)處理功能或數(shù)學(xué)計算等,類似于其他計算機語言,Python語言也提供了自定義函數(shù)。自定義函數(shù)在三個方面具有內(nèi)置函數(shù)不可替換的作用:(1)即使使用內(nèi)置函數(shù)或引用包或模塊中的函數(shù)可以實現(xiàn)所需要的功能,也需要自定義函數(shù)“包裝”這些代碼以增強程序的可讀性;(2)在實際問題中總有一些專用的任務(wù),需要手動編寫自定義函數(shù)以解決這類問題;5.2自定義函數(shù)(3)Python語言程序文件的標(biāo)準(zhǔn)結(jié)構(gòu):自定義類1……自定義類m自定義函數(shù)1……自定義函數(shù)nif__name__=='__main__':語句1……語句k5.2自定義函數(shù)盡管可以直接在文件書寫語句,但實際上Python語言程序具有上述的標(biāo)準(zhǔn)結(jié)構(gòu),即在“if__name__=='__main__':”上面只應(yīng)定義“自定義類”和“自定義函數(shù)”,而在“if__name__=='__main__':”內(nèi)部才可寫執(zhí)行語句??梢姡远x函數(shù)幾乎會出現(xiàn)在每一個Python程序中,用于將實現(xiàn)基本功能單位的代碼組織在一起,以增強程序代碼的可讀性。5.2.1函數(shù)定義與調(diào)用定義三個簡單的自定義函數(shù),介紹函數(shù)的定義與調(diào)用方法:1defmyf():2print("Welcome.")3defmyprint(s):4print(f'Output:{s}')5defmysum(a,b):6returna+b5.2.1函數(shù)定義與調(diào)用7if__name__=='__main__':8myf()9myprint('Helloworld.')10a=mysum(3,5)11myprint(a)5.2.1函數(shù)定義與調(diào)用定義三個函數(shù),其一為無參數(shù)無返回值的函數(shù)myf;其二為帶有一個參數(shù)但無返回值的函數(shù)myprint;其三為有參數(shù)有返回值的函數(shù)mysum,執(zhí)行結(jié)果:模塊zym0502執(zhí)行結(jié)果5.2.1函數(shù)定義與調(diào)用定義函數(shù)頭的語法為:“def函數(shù)名(參數(shù)列表)”,函數(shù)頭下所有縮進的語句均屬于該函數(shù)。參數(shù)列表可以為空,也可以為多個參數(shù),定義函數(shù)頭時的參數(shù)稱為形式參數(shù),簡稱形參;調(diào)用函數(shù)時傳遞給形參的參數(shù)值,稱為實際參數(shù),簡稱實參。函數(shù)的返回值借助于return語句實現(xiàn)。5.2.1函數(shù)定義與調(diào)用函數(shù)的標(biāo)準(zhǔn)形式如下:def函數(shù)名(形式參數(shù)):語句1…語句nreturn表達式5.2.1函數(shù)定義與調(diào)用實現(xiàn)了一元二次方程求根運算:1importmath2defmysqrt(a):3ifa<0:4returnmath.sqrt(-a)*1j5else:6returnmath.sqrt(a)5.2.1函數(shù)定義與調(diào)用7defmyequ(a,b,c):8ifabs(a)<10e-8:9print('Notaquadraticequation.')10x1=011x2=012else:13t=mysqrt(b**2-4*a*c)5.2.1函數(shù)定義與調(diào)用14x1=(-b+t)/(2*a)15x2=(-b-t)/(2*a)16return(x1,x2)17if__name__=='__main__':18(a,b,c)=(3,-4,2)19so=myequ(a,b,c)20print(f'Solutionof{a}x^2{b:+}x{c:+}:\n(x1,x2)=({so[0]:.4f},{so[1]:.4f})')5.2.1函數(shù)定義與調(diào)用執(zhí)行結(jié)果:模塊zym0503執(zhí)行結(jié)果5.2.1函數(shù)定義與調(diào)用三條結(jié)論:(1)自定義函數(shù)可以嵌套調(diào)用其他的自定義函數(shù)。當(dāng)一個函數(shù)直接或間接調(diào)用其本身時,稱之為遞歸調(diào)用函數(shù)。(2)每個“變量”都有作用域和生存期兩類特征。作用域是指該“標(biāo)簽”可以被訪問的范圍。這類“標(biāo)簽”可以稱之為局部標(biāo)簽,上述的兩個“a”因其作用域不同,互不影響。生存期是指標(biāo)簽產(chǎn)生后直到標(biāo)簽消失的生命期。函數(shù)中的局部標(biāo)簽的生存期一般為創(chuàng)建該標(biāo)簽至函數(shù)結(jié)束運行的這段時間,Python語言內(nèi)建了內(nèi)存管理機制,可以不用考慮標(biāo)簽的生存期。5.2.1函數(shù)定義與調(diào)用(3)函數(shù)的返回值,可以借助于元組等數(shù)據(jù)結(jié)構(gòu)返回多個值。在Python中沒有C++語言的“指針”和“引用”,也無法借助于參數(shù)返回值,但是可以借助于元組、列表和字典等返回函數(shù)內(nèi)部任意數(shù)量的計算結(jié)果。5.2.2可變參數(shù)函數(shù)函數(shù)可以有0個或多個參數(shù),在調(diào)用函數(shù)時,實際參數(shù)的個數(shù)要與形式參數(shù)的個數(shù)相同。但有兩種情況,實際參數(shù)的個數(shù)可以與形式參數(shù)的個數(shù)不同,即帶默認(rèn)參數(shù)的情況和不定長參數(shù)的情況。下面首先介紹默認(rèn)參數(shù)的情況。在程序段實現(xiàn)兩個數(shù)的求和函數(shù),帶有三個參數(shù),其中一個參數(shù)具有默認(rèn)值。5.2.2可變參數(shù)函數(shù)參數(shù)帶默認(rèn)值的程序?qū)嵗?defmysum(a,b=0,c=True):2ifc:3d=a+b4else:5d=abs(a)+abs(b)6returnd5.2.2可變參數(shù)函數(shù)7if__name__=='__main__':8(a,b)=(3,-5)9u1=mysum(a,b)10print(f'u1={u1}')11u2=mysum(a,b,False)12print(f'u2={u2}')13u3=mysum(c=True,a=-3)14print(f'u3={u3}')15u4=mysum(c=False,b=12,a=-3)16print(f'u4={u4}')5.2.2可變參數(shù)函數(shù)執(zhí)行結(jié)果:模塊zym0504執(zhí)行結(jié)果5.2.2可變參數(shù)函數(shù)注意:(1)默認(rèn)值參數(shù)只能在非默認(rèn)值參數(shù)的右邊,即默認(rèn)值參數(shù)的右邊不能出現(xiàn)非默認(rèn)值參數(shù)。默認(rèn)值參數(shù)可以有多個,甚至可以將全部參數(shù)設(shè)為默認(rèn)值參數(shù)。在調(diào)用函數(shù)時,如果不指定默認(rèn)值參數(shù),將使用默認(rèn)值參數(shù)定義時的默認(rèn)值。(2)在調(diào)用函數(shù)時,不指定義參數(shù)名(即不指定“參數(shù)名=”這種形式)時,實參和形參是靠位置對應(yīng)關(guān)系進行傳遞的,即處于第n個位置的實參將傳遞給第n個位置的形參。例如,mysum(3,-5)將3傳遞給a,將-5傳遞給b。5.2.2可變參數(shù)函數(shù)(3)在給定關(guān)鍵字參數(shù)時,關(guān)鍵字參數(shù)前的參數(shù)仍然靠位置對應(yīng)關(guān)系傳遞,關(guān)鍵字參數(shù)之后的參數(shù)必須均為關(guān)鍵字參數(shù)。(4)在給定關(guān)鍵字參數(shù)時,關(guān)鍵字參數(shù)不受參數(shù)位置的限制,但是關(guān)鍵字參數(shù)出現(xiàn)后的后續(xù)參數(shù)必須均為關(guān)鍵字參數(shù)。注意:上述實例中,關(guān)鍵字參數(shù)不是必須使用的,但是有種特殊情況下,關(guān)鍵字參數(shù)是必須使用的。5.2.2可變參數(shù)函數(shù)不定長參數(shù)情況。此時,實參的個數(shù)可以為任意多個:在不定長參數(shù)的情況下,使用“*形式參數(shù)名”作為參數(shù)可將輸入的多個參數(shù)“打包”為一個元組,使用“**形式參數(shù)名”作為參數(shù)可將輸入的多個參數(shù)“打包”為一個字典。這樣,使用不定義長參數(shù)的函數(shù)頭的語法為:def函數(shù)名(普通參數(shù)表1,*可變長參數(shù),普通參數(shù)表2)def函數(shù)名(普通參數(shù)表1,**可變長參數(shù))5.2.2可變參數(shù)函數(shù)可變長參數(shù)的設(shè)計方法:1defmysum1(*n):2print('n=',n)3print('Thenumbers:')4foreinn:5print(e,end='')6print()5.2.2可變參數(shù)函數(shù)7print('havesum:',end='')8print(sum(n))9defmysum2(a,*n,b):10ifb:11c=sum(n)12else:13c=a*sum(n)14returnc5.2.2可變參數(shù)函數(shù)15defmysum3(h,**n):16print('n=',n)17s=018foreinn.values():19ifh:20s+=e21else:22s+=2*e23returns5.2.2可變參數(shù)函數(shù)24if__name__=='__main__':25mysum1(1,2,3,4,5,6,7,8,9,10)26c1=mysum2(2,1,2,3,4,5,6,7,8,9,10,b=False)27print(f'c1={c1}')28c2=mysum2(2,*(1,2,3,4,5,6,7,8,9,10),b=False)29print(f'c2={c2}')5.2.2可變參數(shù)函數(shù)30c3=mysum3(False,a=1,b=2,c=3,d=4)31print(f'c3={c3}')32c4=mysum3(False,**{'a':1,'b':2,'c':3,'d':4})33print(f'c4={c4}')5.2.2可變參數(shù)函數(shù)執(zhí)行結(jié)果:模塊zym0504執(zhí)行結(jié)果5.2.2可變參數(shù)函數(shù)除了借助于形如“*n”和“**n”的形式參數(shù)實現(xiàn)函數(shù)可變參數(shù)輸入外,可以通過列表的形式實現(xiàn)函數(shù)可變輸入數(shù)據(jù),借助于元組和字典實現(xiàn)函數(shù)的可變輸入數(shù)據(jù)(這種情況下,函數(shù)的參數(shù)個數(shù)不變,只是參數(shù)中的數(shù)據(jù)個數(shù)可變)。5.2.3函數(shù)返回值與變量作用域函數(shù)的三個要素為:函數(shù)名、輸入?yún)?shù)和返回值。函數(shù)內(nèi)部的處理過程就是普通的語句和算法。在前述內(nèi)容中,已經(jīng)體現(xiàn)了函數(shù)返回值的實現(xiàn)方法。這里再次強調(diào),借助于列表、元組和字典等可以實現(xiàn)函數(shù)返回多個數(shù)值。本節(jié)中,將表示數(shù)據(jù)的“標(biāo)簽”稱為“變量”,變量有兩個需要關(guān)心的特征,即作用域和生存期。5.2.3函數(shù)返回值與變量作用域變量的作用域,主要有以下規(guī)律:(1)形參變量的作用域為函數(shù)本身,也就是說形參只在函數(shù)內(nèi)部是可見的,可以使用,在其他地方不可使用。例如:defmysqr(a):returna**2這里的“a”的作用域為mysqr函數(shù)本身。5.2.3函數(shù)返回值與變量作用域(2)Python程序按照縮進關(guān)系確定程序段間的歸屬關(guān)系,在上一層次定義的變量,可以在本層或其下層次中的語句中使用,即上一層的變量在本層和其低級的層次中是可見的。但是,其低級中定義的同名變量,將“覆蓋”上一層級的同名變量的可見性,即低級中有與上一級同名的變量,在這一低范圍的語句中優(yōu)先使用。(3)在低級中出現(xiàn)的變量,盡可能不應(yīng)在上一級直接使用。如果低級中出現(xiàn)的變量,需要在其上一級中使用,就在上一級中定義同名變量5.2.3函數(shù)返回值與變量作用域分析同名變量的作用域:1defmysum(v):2defmysqr(a):3returna**24defmycub(a):5returna**36s1=s2=s3=05.2.3函數(shù)返回值與變量作用域7forainv:8s1+=a9s2+=mysqr(a)10s3+=mycub(a)11return(s1,s2,s3)12if__name__=='__main__':5.2.3函數(shù)返回值與變量作用域13a=[1,2,3,4,5]14v=mysum(a)15print(f'v={v}')第1~11行定義函數(shù)mysum,在其中,第2~3行定義函數(shù)mysqr,計算其參數(shù)的平方值;第4~5行定義函數(shù)mycub,計算其參數(shù)的立方值。5.2.3函數(shù)返回值與變量作用域第6行“s1=s2=s3=0”將s1、s2和s3均初始化為0。第7~10行為一個for結(jié)構(gòu),其中調(diào)用了函數(shù)mysqr和mycub,循環(huán)結(jié)構(gòu)將v的全部元素的和賦給s1,將v的各個元素的平方和賦給s2,將v的各個元素的立方和賦給s3。第11行“return(s1,s2,s3)”以元組的形式返回計算結(jié)果。第13行“a=[1,2,3,4,5]”定義列表a;第14行“v=mysum(a)”調(diào)用mysum將計算結(jié)果賦給v;第15行“print(f'v={v}')”輸出v,得到“v=(15,55,225)”。5.2.4函數(shù)閉包與裝飾器函數(shù)內(nèi)部可以嵌套新的函數(shù)定義。有一種特殊函數(shù)嵌套定義方式,如下所示:def函數(shù)名1(參數(shù)表1)

語句1

語句2

……

語句m5.2.4函數(shù)閉包與裝飾器def函數(shù)名2(參數(shù)表2)

語句t1

語句t2

……

語句tk

語句m+1

語句m+2

……

語句nreturn函數(shù)名25.2.4函數(shù)閉包與裝飾器上述函數(shù)定義是“奇怪”的,因為外層函數(shù)的返回值是內(nèi)層函數(shù),同時要求內(nèi)層函數(shù)中使用外層函數(shù)的參數(shù)或變量。這種形式的函數(shù)使用函數(shù)閉包。上述的“語句1”至“語句m”和“語句m+1”至“語句n”是可選的,但是需保證內(nèi)層函數(shù)中使用了外層函數(shù)的參數(shù)或變量。如果“參數(shù)表1”為空,那么“語句1”至“語句m”不能為空。5.2.4函數(shù)閉包與裝飾器函數(shù)閉包實例:1defmysum(v,h):2t=13ifh:4t=25defmys(u):6s=07foreinv:8s+=u*t*e9returns10returnmys5.2.4函數(shù)閉包與裝飾器11if__name__=='__main__':12v=[1,2,3,4,5]13u=314s=mysum(v,True)(u)15print(f's={s}')第1~10行定義函數(shù)mysum,具有兩個參數(shù)v和h;第2行“t=1”令t為1;第3~4行為一個if結(jié)構(gòu),如果h為真,則賦t為2。5.2.4函數(shù)閉包與裝飾器第5~9行為閉包函數(shù)mys,具有一個參數(shù)u。其中,第6行“s=0”設(shè)s為0;第7~8行為一個for結(jié)構(gòu),將v的每個元素倍乘u*t后累加到s中。第9行“returns”。第10行“returnmys”表示外層函數(shù)mysum返回內(nèi)層的函數(shù)mys,從而構(gòu)成了函數(shù)閉包。第12行“v=[1,2,3,4,5]”定義v;第13行“u=3”定義u。第14行“s=mysum(v,True)(u)”為函數(shù)閉包的調(diào)用。第15行“print(f's={s}')”輸出結(jié)果“s=90”。5.2.4函數(shù)閉包與裝飾器作為裝飾器的閉包函數(shù)的形式為:defmysumex(f):def函數(shù)名(參數(shù)表)#注意,“函數(shù)名”可隨意取為合法的名稱,但是“參數(shù)表”#必須與mysum函數(shù)相同

語句1

……

語句m#語句1至語句m是可選的f(參數(shù)表)

語句m+1

……

語句n#語句m+1至語句n是可選的return函數(shù)名5.2.4函數(shù)閉包與裝飾器@mysumex#使用“@”符號加上閉包函數(shù)名defmysum(參數(shù)表)

語句1

……

語句k注意:上述代碼中,(1)閉包函數(shù)的外層函數(shù)名“mysumex”必須和“@mysumex”處的“裝飾器”聲明處的名稱相同;5.2.4函數(shù)閉包與裝飾器(2)閉包函數(shù)的內(nèi)層“函數(shù)名”和“return函數(shù)名”處的“函數(shù)名”必須相同,以構(gòu)成閉包,這個“函數(shù)名”稱可以取為任意合法的標(biāo)識符;(3)裝飾器mysumex只能有一個參數(shù),這個參數(shù)將傳遞被“裝飾”的函數(shù)mysum;(4)閉包函數(shù)的內(nèi)層函數(shù)的“參數(shù)表”必須與被“裝飾”的函數(shù)相同;5.2.4函數(shù)閉包與裝飾器(5)調(diào)用裝飾器時,仍然調(diào)用被“裝飾”的函數(shù)mysum,但是會執(zhí)行作為裝飾器的閉包函數(shù)mysumex,相當(dāng)于給被“裝飾”的mysum函數(shù)添加了新的功能;(5)閉包函數(shù)mysumex中的“語句1”至“語句m”和“語句m+1”至“語句n”在遇到“@mysumex”時被執(zhí)行,而不是調(diào)用被“裝飾”的函數(shù)時才執(zhí)行。5.2.4函數(shù)閉包與裝飾器裝飾器用法實例:1defmysumex(f):2print('Thisisbeginofmysumex.')3defmydef(v,h):4print(f'v={v}')5print(f'h={h}')6s=f(v,h)7print(f's={s}')8returns9print('Thisisendofmysumex.')10returnmydef5.2.4函數(shù)閉包與裝飾器11@mysumex12defmysum(v,h):13s=sum(v)14ifh:15s=2*s16returns17if__name__=='__main__':18s=mysum([1,2,3,4,5],True)19print(f'Inmainprogram,s={s}')5.2.4函數(shù)閉包與裝飾器執(zhí)行結(jié)果:模塊zym0510執(zhí)行結(jié)果5.2.4函數(shù)閉包與裝飾器第1~10行定義了一個閉包函數(shù),函數(shù)名為mysumex,具有一個參數(shù)f。第11行將第12行的mysum定義為裝飾器。第12~16行定義函數(shù)mysum,具有兩個參數(shù)v和h。在第12~16行的函數(shù)mysum中,第13行“s=sum(v)”計算v中全部元素的和,賦給s;第14~15行為一個if結(jié)構(gòu),如果h為真,則第15行“s=2*s”將s的值翻倍。第16行“returns”返回s。5.2.4函數(shù)閉包與裝飾器注意:程序段5-10在執(zhí)行時,第1~10行為函數(shù)定義,不執(zhí)行;第12~16行為函數(shù)定義,不執(zhí)行,但是第11行“@mysumex”定義裝飾器,將執(zhí)行裝飾器函數(shù)mysumex,此時輸出提示信息:“Thisisbeginofmysumex.”和“Thisisendofmysumex.”。后執(zhí)行第17~19行。5.2.4函數(shù)閉包與裝飾器第18行“s=mysum([1,2,3,4,5],True)”調(diào)用mysum函數(shù)時,將調(diào)用裝飾器函數(shù)mysumex中的mydef,而不再執(zhí)行函數(shù)mydef外部的任何語句。接著,第4行“print(f'v={v}')”輸出“v=[1,2,3,4,5]”;第5行“print(f'h={h}')”輸出“h=True”;第6行“s=f(v,h)”用被裝飾的函數(shù)mysum替換f,即執(zhí)行真實的函數(shù)mysum(第12~16行)的代碼,得到s;5.2.4函數(shù)閉包與裝飾器第7行“print(f's={s}')”輸出“s=30”,從被調(diào)函數(shù)中返回。最后,第19行“print(f'Inmainprogram,s={s}')”輸出“Inmainprogram,s=30”。該程序段是典型的裝飾器的用法。一個裝飾器可以“裝飾”多個函數(shù),要求所有被“裝飾”的函數(shù)必須具有裝飾器函數(shù)閉包中內(nèi)層函數(shù)相同的參數(shù)表。03遞歸函數(shù)5.3遞歸函數(shù)Python語言支持遞歸函數(shù)。所謂遞歸函數(shù)是指可以直接或間接調(diào)用函數(shù)本身的函數(shù)。下面以求階乘為例介紹遞歸函數(shù)的設(shè)計方法:階乘的定義為:n!=n×(n-1)×…×2×1=n×(n-1)!。若定義階乘函數(shù)為myfac,則求n的階乘的計算方式為myfac(n)=n*myfac(n-1),即myfac將調(diào)用myfac函數(shù),這稱之為遞歸調(diào)用。遞歸調(diào)用必須有終止條件,對于階乘而言,其終止條件為0!=1或1!=1,即myfac(0)=myfac(1)=1。5.3遞歸函數(shù)設(shè)計遞歸函數(shù)的方法為:(1)首先使用if結(jié)構(gòu)編寫遞歸函數(shù)的終止條件;(2)編寫遞歸調(diào)用算法。5.3遞歸函數(shù)例1:實現(xiàn)階乘的遞歸函數(shù)1defmyfac(n):2ifn==0orn==1:3return14returnn*myfac(n-1)5if__name__=='__main__':6n=int(input('Pleaseinputaninteger(n>=0):'))7m=myfac(n)8print(f'n!={m}')5.3遞歸函數(shù)第1~4行定義了階乘函數(shù)myfac。第1行“defmyfac(n):”為函數(shù)頭,具有一個參數(shù)n。第2~3行為遞歸函數(shù)myfac的終止條件,即當(dāng)n等于0或1時,返回1。第4行“returnn*myfac(n-1)”為遞歸算法,返回遞歸調(diào)用后的值。第6行“n=int(input('Pleaseinputaninteger(n>=0):'))”輸入非負(fù)整數(shù)n。第7行“m=myfac(n)”調(diào)用myfac函數(shù),計算n的階乘,結(jié)果賦給m。第8行“print(f'n!={m}')”輸出n!的值。5.3遞歸函數(shù)執(zhí)行結(jié)果:模塊zym0512執(zhí)行結(jié)果5.3遞歸函數(shù)遞歸函數(shù)的設(shè)計要旨如下:(1)設(shè)計終止條件。例如,上一段程序段中的求階乘函數(shù)myfac的第2~3行,表示其終止條件為n等于0或1時,返回1。(2)設(shè)計遞歸調(diào)用。例如,在程序段中,求階乘的遞歸調(diào)用為“returnn*myfac(n-1)”,即返回遞歸調(diào)用后的值。遞歸調(diào)用過程中將出現(xiàn)大量的局部變量,需要占用較多的??臻g。5.3遞歸函數(shù)例2:利用遞歸函數(shù)求Fibonacci數(shù)的第n項1defmyfib(n):2ifn==1orn==2:3return14returnmyfib(n-1)+myfib(n-2)5if__name__=='__main__':6n=int(input('Pleaseinputaninteger(n>0):'))7m=myfib(n)8print(f'Fibonacci({n})={m}.')5.3遞歸函數(shù)第1~4行為遞歸函數(shù)myfib,具有一個參數(shù)n。第2~3行為該遞歸函數(shù)的終止條件,即當(dāng)n等于1或2時,返回1。第4行“returnmyfib(n-1)+myfib(n-2)”為遞歸算法,返回myfib(n-1)與myfib(n-2)的和。第6行“n=int(input('Pleaseinputaninteger(n>0):'))”輸出正整數(shù)n。第7行“m=myfib(n)”調(diào)用myfib函數(shù),將計算結(jié)果賦給m。第8行“print(f'Fibonacci({n})={m}.')”輸出第n個Fibonacci數(shù)。5.3遞歸函數(shù)執(zhí)行結(jié)果:模塊zym0513執(zhí)行結(jié)果04復(fù)合函數(shù)5.4復(fù)合函數(shù)Python語言中,有map和filter函數(shù),可執(zhí)行類似于數(shù)學(xué)中復(fù)合函數(shù)的作用。map函數(shù)的語法為:map(函數(shù),可迭代對象1,可迭代對象2,……,可迭代對象n)。這里至少要有一個“可迭代對象”,盡可能使全部可迭代對象中的元素個數(shù)相同。map函數(shù)執(zhí)行的功能為將“函數(shù)”作用于“可迭代對象”的每個元素上,如果有多個可迭代對象,則“函數(shù)”將平行地作用于多個“可迭代對象”的每個元素上。5.4復(fù)合函數(shù)list(map(lambdax,y,z:x+y+z,[1,2,3],[4,5,6],[7,8,9]))將返回[12,15,18]這里的“l(fā)ambdax,y,z:x+y+z”為lambda函數(shù),也稱為匿名函數(shù),語法為:lambda參數(shù)列表(可為空):表達式例如,f1=lambda:5+3print(f1())#得到8f2=lambdax:x**2print(f2(3))#得到9f3=lambdax,y,z:x+y+zprint(f3(1,2,3))#得到65.4復(fù)合函數(shù)filter函數(shù)的語法為:filter(謂詞函數(shù),可迭代對象)。所謂的謂詞函數(shù)是指返回值為邏輯值的函數(shù)。filter函數(shù)將“謂詞函數(shù)”作用于“可迭代對象”的每個元素,返回使得“謂詞函數(shù)”為真的元素,“過濾”掉那些使“謂詞函數(shù)”為假的元素。例如:list(filter(lambdax:x>0,[3,10,-5,-7,2,0,12]))#得到[3,10,2,12]這里filter函數(shù)將“l(fā)ambdax:x>0”映射到列表“[3,10,-5,-7,2,0,12]”的每個元素上,“過濾”掉x小于等于0的元素,返回一個filter對象,轉(zhuǎn)化為列表為“[3,10,2,12]”。5.4復(fù)合函數(shù)比較map和filter函數(shù),例如:list(map(lambdax:x%2==0,[1,2,3,4,5,6,7,8,9,10]))#得到[False,True,False,True,False,True,#False,True,False,True]list(filter(lambdax:x%2==0,[1,2,3,4,5,6,7,8,9,10]))#得到[2,4,6,8,10]

上述map和filter均將同一個謂詞函數(shù)“l(fā)ambdax:x%2==0”作用于列表“[1,2,3,4,5,6,7,8,9,10]”,根據(jù)它們返回的結(jié)果可知,map函數(shù)返回“謂詞函數(shù)”作用列表中的每一項的結(jié)果,而filter函數(shù)返回列表中使“謂詞函數(shù)”為真的元素。05包與模塊5.5包與模塊Python語言中有兩種包,一種為常規(guī)包,另一種稱為命名空間包。這里僅介紹常規(guī)包。在PyCharm主界面,單擊菜單“文件|新建|Python軟件包”,輸入“MyPacks”,將在當(dāng)前項目所在目錄下創(chuàng)建一個子目錄MyPacks,其中包括一個文件“__init__.py”(內(nèi)容為空)。這個子目錄MyPacks可以稱為包。5.5包與模塊一般地,可以認(rèn)為“包”是指包括了很多模塊(即文件)的目錄(或文件夾),“包”將功能上相關(guān)聯(lián)的一組模塊“包”起來?,F(xiàn)在在剛剛創(chuàng)建的MyPacks包中放入四個模塊,模塊即文件,分別為zym0518.py、zym0519.py、zym0520.py和zym0521.py。5.5包與模塊文件zym0518.py:定義函數(shù)mywelcome1defmywelcome(str):2print(f'Welcome,{str}.')3if__name__=='__main__':4mywelcome('Dr.Zhang')5.5包與模塊文件zym0519.py1importMyPacks.zym05182if__name__=='__main__':3MyPacks.zym0518.mywelcome('Dr.Wang')5.5包與模塊引用其他模塊中定義的函數(shù)的第一種方法:第1行“importMyPacks.zym0518”,用import關(guān)鍵字,其后添加“包名.模塊名”。這種方法要求,在引用外部模塊中的函數(shù)時,要用完整的“包名.模塊名”調(diào)用其中的函數(shù),例如第3行“MyPacks.zym0518.mywelcome('Dr.Wang')”,必須使用形如“包名.模塊名.函數(shù)名”的形式引用外部模塊中的函數(shù)。5.5包與模塊文件zym0520.py1importMyPacks.zym0518asmywel2if__name__=='__main__':3mywel.mywelcome('Dr.Wang')5.5包與模塊引用其他模塊中定義的函數(shù)的第二種方法:第1行“importMyPacks.zym0518asmywel”,此時,import關(guān)鍵字給“MyPacks.zym0518”一個別名,即“mywel”,此時可以通過這個“別名.函數(shù)名”的形式調(diào)用函數(shù)。注意:原來的“MyPacks.zym0518”不能再使用。在第3行中“mywel.mywelcome('Dr.Wang')”使用形如“別名.函數(shù)名”的形式調(diào)用外部模塊中的函數(shù)。5.5包與模塊文件zym0521.py1fromMyPacks.zym0518importmywelcome2if__name__=='__main__':3mywelcome('Dr.Wang')5.5包與模塊引用其他模塊中定義的函數(shù)的第三種方法:第1行“fromMyPacks.zym0518importmywelcome”表示從“MyPacks.zym0518”中裝載“mywelcome”,

溫馨提示

  • 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)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論