Python程序設(shè)計-從基礎(chǔ)到應(yīng)用 課件 第5、6章 函數(shù)與模塊、類和對象_第1頁
Python程序設(shè)計-從基礎(chǔ)到應(yīng)用 課件 第5、6章 函數(shù)與模塊、類和對象_第2頁
Python程序設(shè)計-從基礎(chǔ)到應(yīng)用 課件 第5、6章 函數(shù)與模塊、類和對象_第3頁
Python程序設(shè)計-從基礎(chǔ)到應(yīng)用 課件 第5、6章 函數(shù)與模塊、類和對象_第4頁
Python程序設(shè)計-從基礎(chǔ)到應(yīng)用 課件 第5、6章 函數(shù)與模塊、類和對象_第5頁
已閱讀5頁,還剩115頁未讀 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

函數(shù)與模塊函數(shù)概述大問題問題1問題2……問題n函數(shù)函數(shù)的定義與調(diào)用函數(shù)的參數(shù)傳遞遞歸函數(shù)變量的作用域知識要點模塊函數(shù)的定義與調(diào)用“七樂彩”彩票中獎概率“七樂彩”,采用組合玩法,從01~30共30個號碼中選擇7個號碼,組合為一注投注號碼。根據(jù)中獎規(guī)則,各等獎的中獎概率如下:中獎級別中獎規(guī)則中獎概率一等獎7個基本號碼全中二等獎中6個基本號碼及特別號碼三等獎中6個基本號碼四等獎中5個基本號碼及特別號碼五等獎中5個基本號碼六等獎中4個基本號碼及特別號碼七等獎中4個基本號碼s1=1s2=1s3=1foriinrange(1,8):s1=s1*iforiinrange(1,24):s2=s2*iforiinrange(1,31):s3=s3*ip1=s1/(s1*1)*s2/(1*s2)/(s3/(s1*s2))print(p1)s1=1s2=1s3=1s4=1s5=1foriinrange(1,8):s1=s1*iforiinrange(1,7):s2=s2*iforiinrange(1,23):s3=s3*iforiinrange(1,31):s4=s4*iforiinrange(1,24):s5=s5*ip2=s1/(s2*1)*s3/(1*s3)*1/(s4/(s1*s5))print(p2)s1=1s2=1s3=1s4=1s5=1s6=1foriinrange(1,8):s1=s1*iforiinrange(1,7):s2=s2*iforiinrange(1,23):s3=s3*iforiinrange(1,22):s4=s4*iforiinrange(1,31):s5=s5*iforiinrange(1,24):s6=s6*ip3=s1/(s2*1)*s3/(1*s4)*1/(s5/(s1*s6))print(p3)s1=1s2=1s3=1s4=1s5=1s6=1s7=1foriinrange(1,8):s1=s1*iforiinrange(1,6):s2=s2*iforiinrange(1,3):s3=s3*iforiinrange(1,23):s4=s4*iforiinrange(1,22):s5=s5*iforiinrange(1,31):s6=s6*iforiinrange(1,24):s7=s7*ip4=s1/(s2*s3)*s4/(1*s5)*1/(s6/(s1*s7))print(p4)s1=1s2=1s3=1s4=1s5=1s6=1s7=1foriinrange(1,8):s1=s1*iforiinrange(1,6):s2=s2*iforiinrange(1,3):s3=s3*iforiinrange(1,23):s4=s4*iforiinrange(1,21):s5=s5*iforiinrange(1,31):s6=s6*iforiinrange(1,24):s7=s7*ip5=s1/(s2*s3)*s4/(s3*s5)*1/(s6/(s1*s7))print(p5)s1=1s2=1s3=1s4=1s5=1s6=1s7=1s8=1foriinrange(1,8):s1=s1*iforiinrange(1,5):s2=s2*iforiinrange(1,4):s3=s3*iforiinrange(1,23):s4=s4*iforiinrange(1,21):s5=s5*iforiinrange(1,3):s6=s6*iforiinrange(1,31):s7=s7*iforiinrange(1,24):s8=s8*ip6=s1/(s2*s3)*s4/(s5*s6)*1/(s7/(s1*s8))print(p6)s1=1s2=1s3=1s4=1s5=1s6=1s7=1foriinrange(1,8):s1=s1*iforiinrange(1,5):s2=s2*iforiinrange(1,4):s3=s3*iforiinrange(1,23):s4=s4*iforiinrange(1,20):s5=s5*iforiinrange(1,31):s6=s6*iforiinrange(1,24):s7=s7*ip7=s1/(s2*s3)*s4/(s5*s3)*1/(s6/(s1*s7))print(p7)“七樂彩”彩票中獎概率計算編程,計算并輸出“七樂彩”各等獎的中獎概率。

…………143行代碼代碼冗余程序結(jié)構(gòu)不清晰“七樂彩”彩票中獎概率計算中獎級別中獎概率一等獎二等獎三等獎四等獎五等獎六等獎七等獎

程序構(gòu)件:組合

程序構(gòu)件:階乘“七樂彩”彩票中獎概率計算計算各等獎中獎概率

階乘運算??!n,mn函數(shù)是程序中實現(xiàn)一定功能的程序代碼,供其他代碼調(diào)用完成特定工作。

函數(shù)f,接受參數(shù)n,返回??!函數(shù)的定義——定義階乘函數(shù)python中,函數(shù)定義的一般形式如下:def

<函數(shù)名>(<形式參數(shù)表>):<函數(shù)體>[return<返回值列表>]

12345deff(n):s=1foriinrange(1,n+1):s*=ireturns函數(shù)的定義——定義階乘函數(shù)使用def

保留字進行函數(shù)的定義。def

<函數(shù)名>(<形式參數(shù)表>):<函數(shù)體>[return<返回值列表>]

12345deff(n):s=1foriinrange(1,n+1):s*=ireturns函數(shù)的定義——定義階乘函數(shù)函數(shù)名必須符合python標識符的命名規(guī)則。def

<函數(shù)名>(<形式參數(shù)表>):<函數(shù)體>[return<返回值列表>]

12345deff(n):s=1foriinrange(1,n+1):s*=ireturns函數(shù)的定義——定義階乘函數(shù)形式參數(shù)用于傳遞值。def

<函數(shù)名>(<形式參數(shù)表>):<函數(shù)體>[return<返回值列表>]

12345deff(n):s=1foriinrange(1,n+1):s*=ireturns函數(shù)的定義——定義階乘函數(shù)形式參數(shù)用圓括號括起來,注意括號后有冒號。def

<函數(shù)名>(<形式參數(shù)表>):<函數(shù)體>[return<返回值列表>]

12345deff(n):s=1foriinrange(1,n+1):s*=ireturns函數(shù)的定義——定義階乘函數(shù)函數(shù)體由一行或多行語句組成,要注意縮進。def

<函數(shù)名>(<形式參數(shù)表>):

<函數(shù)體>[return<返回值列表>]

12345deff(n):s=1

foriinrange(1,n+1):s*=ireturns函數(shù)的定義——定義階乘函數(shù)return語句,表示函數(shù)結(jié)束,并帶回返回值。def

<函數(shù)名>(<形式參數(shù)表>):<函數(shù)體>[return<返回值列表>]

12345deff(n):s=1foriinrange(1,n+1):s*=i

returns函數(shù)的調(diào)用——調(diào)用階乘函數(shù)定義后的函數(shù),需要經(jīng)過“調(diào)用”才能運行。函數(shù)調(diào)用的一般形式如下:<函數(shù)名>(<實際參數(shù)表>)12345deff(n):s=1foriinrange(1,n+1):s*=ireturnsprint(f(5))#函數(shù)調(diào)用6程序構(gòu)件:階乘

運行結(jié)果120函數(shù)的定義——定義組合函數(shù)功能計算公式

參數(shù)n,m返回

程序構(gòu)件:組合

定義組合函數(shù),需要調(diào)用“階乘”函數(shù)。678defC(n,m):s=f(n)/(f(m)*f(n-m))returns主程序——調(diào)用組合函數(shù)910111213p1=C(7,7)*C(22,0)*C(1,0)/C(30,7)p2=C(7,6)*C(22,0)*C(1,1)/C(30,7)p3=C(7,6)*C(22,1)*C(1,0)/C(30,7)p4=C(7,5)*C(22,1)*C(1,1)/C(30,7)p5=C(7,5)*C(22,2)*C(1,0)/C(30,7)p6=C(7,4)*C(22,2)*C(1,1)/C(30,7)p7=C(7,4)*C(22,3)*C(1,0)/C(30,7)#輸出各等獎中獎概率…141516…程序構(gòu)件:組合

deff(n):s=1foriinrange(1,n+1):s=s*ireturnsdefC(n,m):s=f(n)/(f(m)*f(n-m))returnsp1=C(7,7)*C(23,0)/C(30,7)p2=C(7,6)*C(22,0)*C(1,1)/C(30,7)p3=C(7,6)*C(22,1)*C(1,0)/C(30,7)p4=C(7,5)*C(22,1)*C(1,1)/C(30,7)p5=C(7,5)*C(22,2)*C(1,0)/C(30,7)p6=C(7,4)*C(22,2)*C(1,1)/C(30,7)p7=C(7,4)*C(22,3)*C(1,0)/C(30,7)print("一等獎中獎概率:{:.10f}".format(p1))print("二等獎中獎概率:{:.10f}".format(p2))print("三等獎中獎概率:{:.10f}".format(p3))print("四等獎中獎概率:{:.10f}".format(p4))print("五等獎中獎概率:{:.10f}".format(p5))print("六等獎中獎概率:{:.10f}".format(p6))print("七等獎中獎概率:{:.10f}".format(p7))“七樂彩”彩票中獎概率計算910111213p1=C(7,7)*C(22,0)*C(1,0)/C(30,7)p2=C(7,6)*C(22,0)*C(1,1)/C(30,7)p3=C(7,6)*C(22,1)*C(1,0)/C(30,7)p4=C(7,5)*C(22,1)*C(1,1)/C(30,7)p5=C(7,5)*C(22,2)*C(1,0)/C(30,7)p6=C(7,4)*C(22,2)*C(1,1)/C(30,7)p7=C(7,4)*C(22,3)*C(1,0)/C(30,7)#輸出各等獎中獎概率…141516…22行代碼避免代碼重復程序結(jié)構(gòu)清晰“七樂彩”彩票中獎概率計算:運行結(jié)果一等獎中獎概率:0.0000004912二等獎中獎概率:0.0000034385三等獎中獎概率:0.0000756459四等獎中獎概率:0.0002269378五等獎中獎概率:0.0023828470六等獎中獎概率:0.0039714117七等獎中獎概率:0.0264760782>>>函數(shù)的調(diào)用處理函數(shù)的定義與調(diào)用定義一函數(shù),計算n!。

12345deff(n):#函數(shù)定義

s=1foriinrange(1,n+1):s*=ireturnsprint(f(5))#函數(shù)調(diào)用6函數(shù)的調(diào)用定義一函數(shù),計算n!。

12345deff(n):#n是形參

s=1foriinrange(1,n+1):s*=ireturnsprint(f(5))#5是實參61.參數(shù)傳遞通過函數(shù)名調(diào)用函數(shù)功能,將實參傳遞給對應(yīng)形參。函數(shù)的調(diào)用定義一函數(shù),計算n!。

12345deff(n):s=1foriinrange(1,n+1):s*=ireturnsprint(f(5))62.執(zhí)行函數(shù)體轉(zhuǎn)去執(zhí)行被調(diào)用的函數(shù),執(zhí)行函數(shù)體語句。函數(shù)的調(diào)用定義一函數(shù),計算n!。

12345deff(n):s=1foriinrange(1,n+1):s*=i

returnsprint(f(5))63.函數(shù)返回函數(shù)返回,釋放形參及被調(diào)用函數(shù)中變量所占用的內(nèi)存單元,返回主程序繼續(xù)執(zhí)行。120函數(shù)的返回值函數(shù)的返回值return語句用來結(jié)束函數(shù),同時可以將函數(shù)運算的結(jié)果返回給函數(shù)被調(diào)用處。12345deff(n):s=1foriinrange(1,n+1):s*=i

returnsprint(f(5))6120函數(shù)的返回值函數(shù)可以沒有return,此時函數(shù)并不返回值。>>>defprinthello(): print("HelloPython")

>>>printhello()HelloPython函數(shù)的返回值return語句可以返回多個值,多個返回值以元組的形式組織。 >>>deff2(a,b): return2*a,3*b>>>f2(3,4)(6,12)>>>x,y=f2(3,4)>>>print(x,y)612函數(shù)的定義與調(diào)用——實例解析實例解析輸出100~200之間所有的素數(shù),并統(tǒng)計個數(shù)實例解析素數(shù)是一個大于1的正整數(shù),除了1和它本身以外,不能被其他正整數(shù)整除。100101102…200…nj:234……n-1i:實例解析編寫函數(shù)prime(n),判別n是否是素數(shù)。12345defprime(n):ifn==1:returnFalseelifn==2:returnTrue678910else:foriinrange(2,n):ifn%i==0:returnFalsereturnTrue實例解析主程序,遍歷100~200之間的每個數(shù),調(diào)用prime()函數(shù),判別并統(tǒng)計素數(shù)個數(shù)。678910count=0forjinrange(100,201):ifprime(j)==True:print(j,end="")count=count+1print("\ncount=",count)11101103107109113127131137139149151157163167173179181191193197199count=21>>>函數(shù)的參數(shù)傳遞形式參數(shù)和實際參數(shù)函數(shù)定義時的參數(shù),稱為形式參數(shù)(形參)。1234deff(n):#n是形參

s=1foriinrange(1,n+1):s*=i函數(shù)調(diào)用時的參數(shù),稱為實際參數(shù)(實參)。567returnsa=5print(f(a))#a是實參引用和對象a1引用對象Python中引用和對象是分離的。a=1b2引用對象b=1b=“hello”引用和對象a1引用對象Python中引用和對象是分離的。a=1b2引用對象b=2b=“hello”‘hello’參數(shù)傳遞:函數(shù)調(diào)用,實參傳遞給形參。12345defchange(listB):listB=[4,5,6]listA=[1,2,3]change(listA)print(listA)組合數(shù)據(jù)類型listA[1,2,3]listB實參形參參數(shù)傳遞:形參重新賦值,引用新對象。12345defchange(listB):

listB=[4,5,6]listA=[1,2,3]change(listA)print(listA)形參引用新對象listA[1,2,3]listB實參形參形參引用了新對象![4,5,6]參數(shù)傳遞:調(diào)用結(jié)束后,實參仍然不變。12345defchange(listB):listB=[4,5,6]listA=[1,2,3]change(listA)print(listA)listA[1,2,3]實參[1,2,3]參數(shù)傳遞:函數(shù)調(diào)用,實參傳遞給形參。12345defchange(listB):listB[0]=4listA=[1,2,3]change(listA)print(listA)listA[1,2,3]listB實參形參參數(shù)傳遞:修改形參引用對象的值,形參不引用新對象。12345defchange(listB):listB[0]=4listA=[1,2,3]change(listA)print(listA)listA[4,2,3]listB實參形參形參不引用新對象形參直接修改對象值!參數(shù)傳遞:調(diào)用結(jié)束后,實參會發(fā)生改變。12345defchange(listB):listB[0]=4listA=[1,2,3]change(listA)print(listA)listA[4,2,3]實參形參不引用新對象[4,2,3]結(jié)論:如果函數(shù)體內(nèi),對形參的引用賦值,則形參引用了新的對象,實參不會發(fā)生改變。如果在函數(shù)體內(nèi),修改形參指向的對象的值,則形參沒有引用新的對象,實參會發(fā)生改變。不同類型的參數(shù)不同類型的參數(shù):位置參數(shù)函數(shù)按照參數(shù)位置傳遞參數(shù),即位置參數(shù)。函數(shù)調(diào)用時語法形式如下:>>>defbmi(weight,height):print(“{:.2f}”.format(weight/height**2))>>>bmi(60,1.58)24.03<函數(shù)名>(<參數(shù)名>)不同類型的參數(shù):關(guān)鍵字參數(shù)按照參數(shù)名稱方式傳遞參數(shù),即關(guān)鍵字參數(shù)。函數(shù)調(diào)用時語法形式如下:>>>defbmi(weight,height):print(“{:.2f}”.format(weight/height**2))>>>bmi(height=1.58,weight=60)>>>24.03<函數(shù)名>(<參數(shù)名>=<實際值>)不同類型的參數(shù):可選參數(shù)函數(shù)的參數(shù)在定義時可以指定默認值。函數(shù)定義時語法形式如下:>>>defmultiply(x,y=10):print(x*y)>>>multiply(99)990>>>multiply(99,2)198def<函數(shù)名>(<必選參數(shù)列表>,<可選參數(shù)>=<默認值>):形式參數(shù)和實際參數(shù)參數(shù)名前有一個*,是可變長位置參數(shù),允許接受多個參數(shù)。函數(shù)調(diào)用時,將多個參數(shù)構(gòu)成一個元組,作為參數(shù)傳遞到函數(shù)中。1234deff1(*b):s=1foriinb:

s=s*ireturns567print(f1(1,2,3))print(f1(1,2,3,4,5))6120>>>不同類型的參數(shù):可變長關(guān)鍵字參數(shù)參數(shù)名前有**,是可變長關(guān)鍵字參數(shù),允許接受多個含參數(shù)名的參數(shù)。函數(shù)調(diào)用時,將參數(shù)名和參數(shù)構(gòu)成一個字典,傳遞到函數(shù)中。1234deff2(**c):print(c)f2(NO=”001”,name=“Tom”)f2(NO=”002”,name=“Jerry”,sex=”male”){'NO':'001','name':'Tom'}{'NO':'002','name':'Jerry','sex':'male'}可變長關(guān)鍵字參數(shù)——實例解析實例解析學生信息注冊登記實例解析12345defregister(number,name,**other):print("學號:",number,"姓名:",name)print(other)register('101','Tom')other={'性別':'M','系部':'computer','年齡':21}register('102','Jack',**other)6編寫函數(shù),實現(xiàn)學生信息注冊登記,要求必須登記學號、姓名,其他如性別、系部、年齡等信息不強制登記。實例解析學號:101姓名:Tom{}學號:102姓名:Jack{'系部':'computer','性別':'M','年齡':21}編寫函數(shù),實現(xiàn)學生信息注冊登記,要求必須登記學號、姓名,其他如性別、系部、年齡等信息不強制登記。遞歸函數(shù)遞歸的定義老和尚講故事德羅斯特效應(yīng)遞歸函數(shù)函數(shù)之間可以相互調(diào)用,若一個函數(shù)直接或間接地調(diào)用了自己,這種調(diào)用稱為遞歸調(diào)用。f函數(shù)調(diào)用f函數(shù)直接調(diào)用f1函數(shù)調(diào)用f2f2函數(shù)調(diào)用f1函數(shù)間接調(diào)用遞歸函數(shù)遞歸算法的兩個基本特征:12遞推歸納:把問題轉(zhuǎn)化為比原問題規(guī)模小的同類問題遞歸終止:當問題小到一定規(guī)模,結(jié)束遞歸,逐層返回遞歸函數(shù)計算n!遞推歸納n!

(n-1)!

(n-2)!……遞歸終止

遞歸函數(shù)用遞歸的方法求階乘n!2412345deffac(n):ifn==1:return1else:returnfac(n-1)*nprint(fac(4))6遞歸函數(shù)遞歸調(diào)用過程:遞推、回歸fac(4)fac(4)4*fac(3)fac(3)fac(2)3*fac(2)2*fac(1)fac(1)16242實例解析字符串逆置實例解析字符串逆置,比如s='hello',逆置后s='olleh'處理過程:將首字符移動到末尾,剩余的字符串同樣處理。直至剩余字符串為空。遞推歸納reverse(s)=reverse(s[1:])+s[0]遞歸終止

實例解析用遞歸的方法進行字符串逆置olleh>>>12345defreverse(s):ifs[1:]=="":returns[0]else:returnreverse(s[1:])+s[0]print(reverse("hello"))6遞歸函數(shù)小結(jié)遞推歸納問題轉(zhuǎn)化為比原問題規(guī)模小的同類問題。遞歸終止

匿名函數(shù)匿名函數(shù)Lambda函數(shù),是一個匿名函數(shù)。語法如下:>>>lambdax,y:x+y<function<lambda>at0x035E00C0>>>>Lambda參數(shù)列表:表達式匿名函數(shù)綁定一個名字,語法如下:>>>f=lambdax,y:x+y>>>f(2,3)5>>><函數(shù)名>=Lambda參數(shù)列表:表達式等價于:def<函數(shù)名>(參數(shù)列表):return表達式實例解析匿名函數(shù)作為其他函數(shù)的參數(shù)實例解析列表ls=[(‘a(chǎn)’,3),(‘b’,9),(‘c’,6),(’d’,2)],根據(jù)每個元組的第二項數(shù)據(jù),即每個字符的頻次,降序排列輸出。>>>ls=[('a',3),('b',9),('c',6),('d',2)]>>>ls.sort(key=lambdax:x[1],reverse=True)>>>>>>print(ls)[('b',9),('c',6),('a',3),('d',2)]>>>變量的作用域變量的作用域根據(jù)程序中變量所在的位置和作用范圍,變量分為局部變量和全局變量。在一個函數(shù)內(nèi)定義的變量,稱為局部變量。在所有函數(shù)之外定義的變量,稱為全局變量。全局變量和局部變量n=30#全局變量deffun(x,y):n=x*y#局部變量

print("n=",n)fun(3,4)print("n=",n)123456n=12n=30>>>全局變量的聲明全局變量在函數(shù)內(nèi)部使用時,需要提前使用保留字global聲明,語法形式如下:global<全局變量>n=30#全局變量deffun(x,y):globaln#全局變量n=x*yprint("n=",n)fun(3,4)print("n=",n)1234567n=12n=12>>>全局變量若全局變量是組合數(shù)據(jù)類型ls=[1,2,3]#全局變量deffun():ls=[4,5,6]#給變量ls賦值,局部變量print(ls)fun()print(ls)123456[4,5,6][1,2,3]>>>全局變量若全局變量是組合數(shù)據(jù)類型ls=[1,2,3]#全局變量deffun():ls[0]=9#修改變量ls的元素值,全局變量print(ls)fun()print(ls)123456[9,2,3][9,2,3]>>>變量的作用域歸納對于簡單類型全局變量,函數(shù)體內(nèi)部若要使用該全局變量,必須用global聲明;否則函數(shù)體內(nèi)部使用的是局部變量。對于組合類型全局變量,若函數(shù)體內(nèi)部,真實創(chuàng)建了同名變量,則函數(shù)內(nèi)部的是局部變量;若函數(shù)體內(nèi)部沒有創(chuàng)建同名變量,則函數(shù)體內(nèi)部使用的是全局變量。模塊模塊在python中,可以把程序分割成許多單個文件,這些單個的文件稱為模塊。模塊將一些常用的功能單獨放置到一個文件中,方便其他文件來調(diào)用。導入模塊導入模塊的一般形式如下:import模塊#evensum.pydeffun(alist):s=0foriinalist:ifi%2==0:s=s+ireturns1234567#t.pyimportevensumls=[1,2,3,4,5,6,7,8,9]s=evensum.fun(ls)print("s=",s)12345s=20>>>導入模塊導入模塊中的函數(shù),一般形式為:from模塊import函數(shù)名#evensum.pydeffun(alist):s=0foriinalist:ifi%2==0:s=s+ireturns1234567#t.pyfromevensumimportfunls=[1,2,3,4,5,6,7,8,9]s=fun(ls)print("s=",s)12345s=20>>>導入模塊導入模塊中的所有函數(shù),不需要一一列舉函數(shù)名,一般形式為:from模塊import*#evensum.pydeffun(alist):s=0foriinalist:ifi%2==0:s=s+ireturns1234567#t.pyfromevensumimport*ls=[1,2,3,4,5,6,7,8,9]s=fun(ls)print("s=",s)12345s=20>>>單元小結(jié) 本單元我們學習了函數(shù)的定義和調(diào)用,進一步學習并理解了函數(shù)的參數(shù)傳遞,以及不同類型的形式參數(shù);學習了匿名函數(shù),理解遞歸算法的思想和遞歸調(diào)用處理過程,學習了全局變量、局部變量的使用,介紹了模塊導入方法,并通過多個實例解析,幫助大家掌握函數(shù)的使用。第6章類和對象面向?qū)ο蟮母拍铑惡蛯ο蟮母拍蠲嫦蜻^程程序設(shè)計把數(shù)據(jù)定義為不同的數(shù)據(jù)結(jié)構(gòu),用函數(shù)來實現(xiàn)功能,函數(shù)與數(shù)據(jù)是分離的。與之不同的,面向?qū)ο蟪绦蛟O(shè)計將數(shù)據(jù)和對數(shù)據(jù)的操作方法封裝在一起,構(gòu)成一個相互依存、不可分割的整體,稱之為對象,將相同類型的對象進行抽象形成類。面向?qū)ο蟮娜齻€基本特征封裝繼承多態(tài)封裝封裝是將對象的屬性和行為打包放在一起形成一個整體,其中,對象的屬性由若干數(shù)據(jù)組成,對象的行為由若干對數(shù)據(jù)的操作組成,這些操作采用函數(shù)形式實現(xiàn),稱為方法。繼承繼承是指將現(xiàn)有的類作為基類派生出新的類,基類是父類,派生類是子類。通過繼承,子類可以重用父類的部分屬性和行為,提高了軟件開發(fā)的效率和可靠性。多態(tài)多態(tài)是一個跟繼承相關(guān)的特性,在繼承時,多個派生類可以定義與基類方法名稱相同、但行為方式各不相同的方法。調(diào)用該名稱的方法時,同樣的消息會根據(jù)對象所屬的派生類的不同做出不同的響應(yīng),這一特性稱為多態(tài)。類的定義和對象的創(chuàng)建內(nèi)置的類創(chuàng)建對象內(nèi)置類創(chuàng)建對象的語法:<對象名>=<類名>(<形參列表>)調(diào)用對象的屬性和方法,格式:

<對象名>.<屬性名><對象名>.<方法名>(<實參列表>)類創(chuàng)建對象例6-1:創(chuàng)建一個復數(shù)對象

#創(chuàng)建值為1+2i的復數(shù)對象c1,輸出c1的復數(shù)表示形式及其實部、虛部和模c1=complex(1,2)print('c1:',c1)print('c1的實部:',c1.real)print('c1的虛部:',c1.imag)print('c1的模:',c1.__abs__())#計算c1的共軛復數(shù)c2,輸出c2的復數(shù)表示形式及其實部、虛部和模c2=c1.conjugate()print('c2:',c2)print('c2的實部:',c2.real)print('c2的虛部:',c2.imag)print('c2的模:',c2.__abs__())類創(chuàng)建對象例6-1:創(chuàng)建一個復數(shù)對象自定義類類的定義:

class<類名>: <屬性定義><方法定義>類的屬性定義:

<類變量名>=<初始值>類的方法定義:def<方法名>(self,[形參列表]): <函數(shù)體> [return<返回值列表>]自定義類實例屬性的定義和初始化在__init__方法中完成,語法形式如下:

def__init__(self,<形參列表>):self.<實例變量名>=初始值

__init__方法是一種類的特殊方法,稱為構(gòu)造函數(shù),在創(chuàng)建對象時系統(tǒng)會自動調(diào)用該函數(shù),用于初始化對象屬性。自定義類例6-2:創(chuàng)建一個類似complex對象

classComplex2:#類屬性定義

count=0

def__init__(self,real,imag=0):#類的構(gòu)造函數(shù),初始化對象屬性

self.real=real

self.imag=imagComplex2.count+=1

defconjugate(self):#求共軛復數(shù)

returnComplex2(self.real,-self.imag)

def__abs__(self):#計算模

return(self.real**2+self.imag**2)**0.5

def__str__(self):#返回對象的描述信息,調(diào)用print()打印實例化對象時會調(diào)用該方法

ifstr(self.imag)[:1]=='-':return'('+str(self.real)+str(self.imag)+'i'+')'else:return'('+str(self.real)+'+'+str(self.imag)+'i'+')'自定義類創(chuàng)建對象例6-3:利用自定義的Complex2類創(chuàng)建一個對象

#創(chuàng)建Complex2類的實例對象c1,輸出c1及其實部、虛部和模c1=Complex2(1,2)print('c1:',c1)print('c1的實部:',c1.real)print('c1的虛部:',c1.imag)print('c1的模:',c1.__abs__())#利用conjugate方法生成Complex2類的實例對象c2,輸出c2及其實部、虛部和模c2=c1.conjugate()print('c2:',c2)print('c2的實部:',c2.real)print('c2的虛部:',c2.imag)print('c2的模:',c2.__abs__())自定義類創(chuàng)建對象例6-3:利用自定義類創(chuàng)建對象

#創(chuàng)建Complex2類的實例對象c1c1=Complex2(1,2)#調(diào)用Complex2類的count屬性并輸出print('當前已創(chuàng)建的Complex2類的對象總數(shù):',Complex2.count)#調(diào)用c1對象的real屬性和imag屬性并輸出print('c1的real屬性:',c1.real)print('c1的imag屬性:',c1.imag)#用conjugate方法生成Complex2類的實例對象c2c2=c1.conjugate()#調(diào)用Complex2類的count屬性并輸出print('當前已創(chuàng)建的Complex2類的對象總數(shù):',c2.count)#調(diào)用c2對象的real屬性和imag屬性并輸出print('c2的real屬性:',c2.real)print('c2的imag屬性:',c2.imag)類屬性和類實例屬性例6-4利用自定義的Complex2類創(chuàng)建一個對象c1,并利用conjugate方法生成對象c2,然后分別調(diào)用類屬性和實例屬性,比較其差別。

類的特殊方法類有很多的內(nèi)置的特殊方法,它們通常使用雙下劃綫“__”開頭和結(jié)尾。特殊方法說明系統(tǒng)調(diào)用形式__init__(self,…)構(gòu)造函數(shù),創(chuàng)建對象時調(diào)用類名(實參列表)__del__(self)析構(gòu)函數(shù),釋放對象時調(diào)用del對象名__str__(self)返回對象描述信息,使用print語句時被調(diào)用print(對象名)__len__(self)返回對象的長度len(對象名)__abs__(self)計算模長abs(對象名)__add__(self,other)加運算對象名1+對象名2__sub__(self,other)減運算對象名1-對象名2__mul__(self,other)乘運算對象名1*對象名2__div__(self,other)除運算對象名1/對象名2

classComplex2:……

def__add__(self,other):#加運算

returnComplex2(self.real+other.real,self.imag+other.imag)

def__mul__(self,other):#乘運算

newreal=self.real*other.real-self.imag*other.imag

newimag=self.real*other.imag+self.imag*other.realreturnComplex2(newreal,newimag)……類的特殊方法例6-5定義Complex2類的加運算和乘運算,并通過運算符形式調(diào)用進行相應(yīng)的計算。

c1=Complex2(1,3)c2=Complex2(3,-1)c3=c1+c2c4=c1*c2print('c1:',c1)print('c2:',c2)print('c1+c2:',c3)print('c1*c2:',c4)例6-5定義Complex2類的加運算和乘運算,并通過運算符形式調(diào)用進行相應(yīng)的計算。

類的特殊方法類的繼承和多態(tài)類的繼承類繼承的語法形式如下:

class<派生類名>(<基類名>): <派生類屬性定義> <派生類方法定義>在派生類中,定義實例屬性并初始化的語法形式如下:

def__init__(self,<派生類屬性列表>): <調(diào)用基類構(gòu)造函數(shù)初始化基類屬性> <新增屬性初始化定義>類的繼承調(diào)用基類構(gòu)造函數(shù)的語法形式有如下兩種:形式1:<基類名>.__init__(self,<基類屬性列表>)形式2:super(<派生類名>,self).__init__(<基類屬性列表>)在派生類方法定義時,調(diào)用基類方法的語法形式也有如下兩種:形式1:<基類名>.<基類方法名>(self,<實際參數(shù)列表>)形式2:super(<派生類名>,self).<基類方法名>(<實際參數(shù)列表>)類的繼承例6-6:創(chuàng)建基類Person類,并根據(jù)Person派生出Student類,

#定義基類Person類classPerson:

def__init__(self,name,sex,age,idcard):=name

self.age=age

self.sex=sex

self.idcard=idcard

defshow(self):print('姓名:',,'年齡:',self.age,'性別:',self.sex)print('身份證號碼:',self.idcard)

#定義派生類classStudent(Person):#派生類構(gòu)造函數(shù)

def__init__(self,stdnum,name,sex,major,age,idcard):#調(diào)用基類構(gòu)造函數(shù)

super(Student,self).__init__(name,sex,age,idcard)#派生類新增屬性初始化

self.stdnum=stdnum

self.major=major

def

showStudent(self):print('學號:',self.stdnum,'專業(yè):',self.major)#調(diào)用基類方法

super(Student,self).show()類的繼承例6-6:分別創(chuàng)建Person類和Student類的對象,調(diào)用類的方法輸出所創(chuàng)建對象的屬性。

#創(chuàng)建Person類對象per1=Person('張成','男',40,)print("調(diào)用Person類的show方法輸出張成的個人信息如下:")per1.show()#創(chuàng)建Student類對象stu1=Student('202101101','李玉','女','計算機',20,)print("調(diào)用派生類Student類的showStudent方法輸出李玉的個人信息如下:")stu1.showStudent()print("調(diào)用基類Person類的show方法輸出李玉的個人信息如下:")stu1.show()類的繼承例6-6:創(chuàng)建基類Person類,并根據(jù)Person派生出Student類。多態(tài)與方法重載多態(tài)是基類的一個方法在不同派生類中有不同的行為。Python通過方法重載來實現(xiàn)多態(tài)。方法重載是在派生類中使用與基類完全相同的方法名,而對方法的內(nèi)容進行改寫,從而實現(xiàn)對基類方法的重新定義。利用派生類創(chuàng)建的對象調(diào)用該方法,將調(diào)用派生類中的方法,而不再調(diào)用基類的方法。一個基類的多個派生類創(chuàng)建的不同對象調(diào)用同樣的方法會產(chǎn)生不同的調(diào)用結(jié)果,這就是多態(tài)性。多態(tài)與方法重載例6-7加法運算符重載應(yīng)用。

#定義一個新的數(shù)據(jù)類型對“+”運算符重載classNumber:

def__init__(self,x,y):

self.x=x

self.y=y

def__add__(self,other):returnNumber(self.x+other.x,self.y+other.y)#不同數(shù)據(jù)類型中“+”實現(xiàn)的功能舉例a1=2a2=3a=a1+a2print("兩個整數(shù)a1與a2相加的結(jié)果:",a)

b1=complex(2,3)b2=complex(3,-1)b=b1+b2print("兩個復數(shù)b1與b2相加的結(jié)果:",b)c1='hello'c2='world!'c=c1+c2print("兩個字符串c1與c2相連的結(jié)果:",c)d1=Number(1,10)d2=Number(2,20)d=d1+d2print("兩個Number類型對象d1和d2進行加運算的結(jié)果:",d.x,d.y)多態(tài)與方法重載例6-7加法運算符重載應(yīng)用。多態(tài)與方法重載

#定義基類AnimalclassAnimal:

def__init__(self,name

溫馨提示

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

評論

0/150

提交評論