中職電子與信息:《yhon小屋》3-3-1 基本語法_第1頁
中職電子與信息:《yhon小屋》3-3-1 基本語法_第2頁
中職電子與信息:《yhon小屋》3-3-1 基本語法_第3頁
中職電子與信息:《yhon小屋》3-3-1 基本語法_第4頁
全文預(yù)覽已結(jié)束

下載本文檔

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

文檔簡介

《Python小屋》之三程序控制結(jié)構(gòu)與函數(shù)設(shè)計3.3函數(shù)設(shè)計與使用大家在初中數(shù)學(xué)課程中就有學(xué)習(xí)過函數(shù)的概念,函數(shù)表示從自變量到因變量之間的一-種映射或?qū)?yīng)關(guān)系。軟件開發(fā)中的函數(shù)也具有相似的含義,也是把輸入經(jīng)過一定的變換和處理最后得到預(yù)訂的輸出。從外部看,函數(shù)就像一個黑盒子,不需要了解內(nèi)部原理,值需要了解其接口或使用方法即可。在軟件開發(fā)過程中,經(jīng)常有很多操作是完全相同或者是非常相似的,僅僅是要處理的數(shù)據(jù)不同而已,因此經(jīng)常在不同的代碼位置多次執(zhí)行相似或完全相同的代碼塊。很顯然,從軟件設(shè)計和代碼復(fù)用的角度來講,直接將該代碼塊復(fù)制到多個相應(yīng)位置然后進(jìn)行簡單修改絕對不是一個好主意。雖然這樣可以使得多份復(fù)制的買嗎可以彼此獨立的進(jìn)行修改,單這樣不僅增加了代碼最,也增加了代碼閱讀、理解和維護(hù)的難度,更重要的是為代碼測試和糾錯帶來了很大的困難。一旦被復(fù)制的代碼塊將來某天被發(fā)現(xiàn)存在問題而需要修改,則必須對所有的復(fù)制都做同樣正確的修改,這在實際中是很難完成的意向任務(wù)。由于代碼量的大幅度增加,導(dǎo)致代碼之間的關(guān)系更加復(fù)雜,很可能在修補(bǔ)就漏洞的同事又引入了新漏洞。因此,應(yīng)盡量減少使用直接復(fù)制代碼塊的方式來實現(xiàn)復(fù)用。解決這個問題的郵箱方法是設(shè)計函數(shù)(function)和類(class)。將可能反復(fù)執(zhí)行的代碼封裝為函數(shù),并在需要執(zhí)行該段代碼功能的地方進(jìn)行調(diào)用,這不僅可以實現(xiàn)代碼的復(fù)用,更重要的是可以保證代碼的一致性,只需要修改該函數(shù)代碼則所有調(diào)用位置均得到體現(xiàn)。同事,把大任務(wù)拆分成多個函數(shù)也是分治法的經(jīng)典應(yīng)用,復(fù)雜問題簡單化,使得軟件開發(fā)像搭積木一樣簡單。淡然,在實際開發(fā)中,需要對函數(shù)進(jìn)行良好的設(shè)計和優(yōu)化才能充分發(fā)揮其優(yōu)勢。在編寫函數(shù)時,有很多原則需要參考和遵守,例如,不要在用以函數(shù)中執(zhí)行太多的功能,盡量只讓其完成一個高度相關(guān)且大小合適的功能,以提高模塊的內(nèi)聚行。另外,盡量減少不同函數(shù)之間的隱式耦合,例如減少全局變量的使用,是的函數(shù)之間僅通過調(diào)用和參數(shù)傳遞來顯式體現(xiàn)其相互關(guān)系。基本語法在Python中,定義函數(shù)的語法如下:ldef函數(shù)名([參數(shù)列表]):“‘注釋"'函數(shù)體代碼塊在Python中使用def關(guān)鍵字來定義函數(shù),然后是一個空格和函數(shù)名稱,接下來是一對圓括號,在圓括號內(nèi)是形式參數(shù)列表,如果有多個參數(shù)則使用逗號分隔開,圓括號之后是一個冒號和換行,最后是必要的注釋和函數(shù)體代碼。定義函數(shù)時需要注意的問題:(1)函數(shù)參數(shù)不需要聲明其類型,也不需要指定函數(shù)返回值類型;(2)即使該函數(shù)不需要接受任何參數(shù),也必須保留一對空的圓括號;(3)括號后面的冒號必不可少;(4)函數(shù)體相對于def關(guān)鍵字必須保持一定的空格縮進(jìn)。小提示:注釋是軟件開發(fā)人員的筆記,對代碼測試人員和維護(hù)人員來說也非常重要。在Python中有兩種注釋方式:符號#后面的內(nèi)容表示注秤,不屬于任何語句的一對三引號也表示注釋。小技巧:不少程序員是編寫完代碼之后再添加適當(dāng)?shù)淖⑨?,我恰恰相反。我一般都是先寫注釋,以注釋的形式用自然語言把程序思路描述出來,然后再把這些注釋“翻譯”成程序語言,正所謂“代碼未動,注釋先行二下面的函數(shù)用來計算斐波那契數(shù)列中小于參數(shù)n的所有值:Ideffib(n):~#定義函數(shù),括號里的n是形式參數(shù)a,b=l,lwhilea<n:ifb<n:a,b=b,a+belse:print(a)breaklOfib(lOOO)#調(diào)用函數(shù),括號里的1000是實參1112#函數(shù)執(zhí)行結(jié)果:987代碼塊在定義函數(shù)時,開頭部分的注釋不是必須的,但是如果為函數(shù)的定義加上一段注釋的話,可以為用戶提供友好的提示和使用幫助。例如,把上面生成斐波那契的函數(shù)定義加上如下注釋:"'acceptanintegern.returnthenumberslessthanninFibonaccisequence.'"如此一來,可以使用內(nèi)置函數(shù)help。來查看函數(shù)的使用幫助,并且在調(diào)用該函數(shù)時輸入左側(cè)圓括號之后,立刻就會得到該函數(shù)的使用說明。print(fib._doc_)print('-,*30)help(fib)acceptanintegern.returnthenumberslessthanninFibonaccisequence.Helponfunctionfibinmodule_main_:llfib(n)acceptanintegern.returnthenumberslessthanninFibonaccisequence.代碼塊建議:如果代碼本身不能提供非常好的可讀性,那么最好加上適當(dāng)?shù)淖⑨寔碚f明,要不然,自己寫的代碼自己都看不懂了。很多程序員都有過這樣的經(jīng)歷。在Python中,定義函數(shù)時不需要聲明函數(shù)返回值的類型,而是使用return語句結(jié)束函數(shù)的執(zhí)行的同時返回任意類型的值,函數(shù)返回值類型與return語句返回表達(dá)式的類型一致。無論return語句出現(xiàn)在函數(shù)的任何位置,一旦得到執(zhí)行將直接結(jié)束函數(shù)的執(zhí)行。如果函數(shù)沒有return語句或者執(zhí)行了不返回任何值的return語句,Python將認(rèn)為該函數(shù)以returnNone結(jié)束,即返回空值。小提示:作為使用者,在調(diào)用函數(shù)時,一定要注意函數(shù)有沒有返回值,以及是否會對函數(shù)實參的值進(jìn)行修改。例如,前面介紹的列表方法sort()屬于原地操作,沒有返回值,而內(nèi)置函數(shù)sorted。則返回排序后的序列,并不對原列表做任何修改。1?>a=[1Z2,3A9,5,7]?>print(sorted(a))[1,2,3,4,5,7,9]?>?>a[1,2,3,4,9,5,7]#原列表內(nèi)容沒變7?>?>print(a.sort())#列表對象的sort()方法沒有返回值None?>?>print(a)口,2,3,4,5,7,9]?>代碼塊擴(kuò)展知識:函數(shù)屬于可調(diào)用對象。由于構(gòu)造函數(shù)的存在,類也是可調(diào)用的。另外,任何包含call()方法的類的對象都是可調(diào)用的。例如,下面的代碼演示了函數(shù)嵌套定義情況:deflinear(a,b):defresult(x):ttfF.Python41,函數(shù)是可以使用嵌套定義的returna*x+breturnresult6#下面的代碼演示了可調(diào)用對象類的定義:classlinear:def_init_(self,a,b):self.a=aself.b=bdef_call_(self,x):14returnself.a*x+self.b1516#使用上面的嵌套函數(shù)和類這兩種方式中任何一個,都可以通過以下的方式來定義一個可調(diào)用對象:1718taxes=linear(0.3,2)1920#然后通過下面的方式來調(diào)用該對象:2122taxes(5)2324#下面的代碼完整地演示了嵌套函數(shù)定義與使用的方法,有效利用了用戶名檢查功能的代碼,關(guān)于面向?qū)ο缶幊痰闹R請參考第4章。2526defcheck_permission(func):27defwrapper(*args,**kwargs):28ifkwargs.getCusername')!='admin':29raiseException('Sorry.Youarenotallowed.')30returnfunc(*args,**kwargs)31returnwrapper3233classReadWriteFile():3435@check_permission36defread(self,username,filename):37returnopen(filename,'r').read()3839defwrite(self,username,filename,content):40open(filename/a+').write(content)4142#把函數(shù)check_permission作為普通函數(shù)使用43write=check_permission(write)4445if_name_=='_main_46t=ReadWriteFilef)47print('Originally')48print(t.read(username=,admin'zfilename=r'd:\sample.txt,))49print('Now,trytowritetoafile...,)50t.write(username='admin,/filename=r,d:\sample.txt,,content=,\nhelloworld')

溫馨提示

  • 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)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論