程序設(shè)計(jì)思想與方法——第五章_第1頁
程序設(shè)計(jì)思想與方法——第五章_第2頁
程序設(shè)計(jì)思想與方法——第五章_第3頁
程序設(shè)計(jì)思想與方法——第五章_第4頁
程序設(shè)計(jì)思想與方法——第五章_第5頁
已閱讀5頁,還剩41頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

1、模塊化編程模塊化編程 模塊化設(shè)計(jì)和建造模塊化設(shè)計(jì)和建造 在對產(chǎn)品進(jìn)行功能分析的基礎(chǔ)上在對產(chǎn)品進(jìn)行功能分析的基礎(chǔ)上,將產(chǎn)品將產(chǎn)品 分解成若干個功能模塊分解成若干個功能模塊,預(yù)制好的模塊再預(yù)制好的模塊再 進(jìn)行組裝進(jìn)行組裝,形成最終產(chǎn)品形成最終產(chǎn)品. 模塊模塊:提供特定功能的相對獨(dú)立的單元提供特定功能的相對獨(dú)立的單元. 標(biāo)準(zhǔn)化標(biāo)準(zhǔn)化:標(biāo)準(zhǔn)尺寸和標(biāo)準(zhǔn)接口標(biāo)準(zhǔn)尺寸和標(biāo)準(zhǔn)接口 可組裝可組裝:多個模塊可以方便靈活地組合多個模塊可以方便靈活地組合 可替換可替換:改變系統(tǒng)的局部功能改變系統(tǒng)的局部功能 可維護(hù)可維護(hù):對模塊進(jìn)行局部修改或設(shè)置對模塊進(jìn)行局部修改或設(shè)置 Lu Chaojun, SJTU 2 模塊化編程

2、模塊化編程 將程序分解為獨(dú)立的、可替換的、具有將程序分解為獨(dú)立的、可替換的、具有 預(yù)定功能的模塊預(yù)定功能的模塊,每個模塊實(shí)現(xiàn)一個功能每個模塊實(shí)現(xiàn)一個功能. 各模塊組合在一起形成最終程序各模塊組合在一起形成最終程序. 好處好處: 易設(shè)計(jì)易設(shè)計(jì):復(fù)雜問題化成簡單問題復(fù)雜問題化成簡單問題 易實(shí)現(xiàn)易實(shí)現(xiàn):可以團(tuán)隊(duì)開發(fā)可以團(tuán)隊(duì)開發(fā) 易測試易測試:可各自測試可各自測試 易維護(hù)易維護(hù):增加模塊增加模塊 可重用可重用:一個模塊可參與組合不同程序一個模塊可參與組合不同程序 Lu Chaojun, SJTU 3 分離關(guān)注點(diǎn)分離關(guān)注點(diǎn) 關(guān)注點(diǎn)關(guān)注點(diǎn):是指設(shè)計(jì)者關(guān)心的某個系統(tǒng)特性是指設(shè)計(jì)者關(guān)心的某個系統(tǒng)特性 或行為或

3、行為 分離關(guān)注點(diǎn)分離關(guān)注點(diǎn)(SoC):將系統(tǒng)分解為互不重將系統(tǒng)分解為互不重 疊的若干部分疊的若干部分,每個部分對應(yīng)于一個關(guān)注每個部分對應(yīng)于一個關(guān)注 點(diǎn)點(diǎn). 在模塊化編程中在模塊化編程中,以程序的各個功能作為以程序的各個功能作為 關(guān)注點(diǎn)關(guān)注點(diǎn),模塊劃分就是分離關(guān)注點(diǎn)的結(jié)果模塊劃分就是分離關(guān)注點(diǎn)的結(jié)果. Lu Chaojun, SJTU 4 編程語言中的模塊化構(gòu)造編程語言中的模塊化構(gòu)造 匯編語言匯編語言:子例程子例程,宏宏 高級語言高級語言:函數(shù)函數(shù),過程過程 有的語言不加區(qū)分有的語言不加區(qū)分,統(tǒng)稱為函數(shù)統(tǒng)稱為函數(shù). 包包,模塊模塊,函數(shù)庫函數(shù)庫,類庫類庫 Lu Chaojun, SJTU 5 P

4、ython函數(shù)函數(shù) 函數(shù)是一種程序構(gòu)件函數(shù)是一種程序構(gòu)件,是構(gòu)成大程序的小是構(gòu)成大程序的小 功能部件功能部件 function一詞本身就有一詞本身就有功能功能的含義的含義 我們已經(jīng)熟悉的函數(shù)我們已經(jīng)熟悉的函數(shù): Python內(nèi)建函數(shù)內(nèi)建函數(shù),如如abs() Python庫函數(shù)庫函數(shù),如如math.sqrt() 模塊化的程序是由許多函數(shù)組合而成的模塊化的程序是由許多函數(shù)組合而成的. Lu Chaojun, SJTU 6 為什么需要函數(shù)為什么需要函數(shù)? 編程更容易把握編程更容易把握 大程序分解成小功能部件大程序分解成小功能部件 代碼重用代碼重用,避免重復(fù)相同避免重復(fù)相同/相似代碼相似代碼 提高開發(fā)

5、效率提高開發(fā)效率 更易維護(hù)更易維護(hù) 程序更可讀程序更可讀,更易理解更易理解 代碼簡潔美觀代碼簡潔美觀 Lu Chaojun, SJTU 7 函數(shù)用途函數(shù)用途:減少重復(fù)代碼減少重復(fù)代碼 編程實(shí)例編程實(shí)例:畫一棵樹畫一棵樹 print * print * print * print * print * print * print * print * print # print # print # def treetop(): print * print * print * print * def tree(): treetop() treetop() print # print # print #

6、 tree() 重復(fù)代碼的弊端重復(fù)代碼的弊端 程序不必要地冗長程序不必要地冗長 代碼一致性維護(hù)麻煩代碼一致性維護(hù)麻煩:若修改一處代碼若修改一處代碼,則則 所有重復(fù)的地方都要一致地修改所有重復(fù)的地方都要一致地修改 程序看上去累贅不美觀程序看上去累贅不美觀 輸入大量重復(fù)代碼很單調(diào)乏味輸入大量重復(fù)代碼很單調(diào)乏味 函數(shù)用途函數(shù)用途:改善程序結(jié)構(gòu)改善程序結(jié)構(gòu)(1) 模塊化模塊化:將程序分解成多個較小的相對獨(dú)將程序分解成多個較小的相對獨(dú) 立的函數(shù)立的函數(shù),可使程序結(jié)構(gòu)清晰可使程序結(jié)構(gòu)清晰,容易理解容易理解. def treetop(): print * print * print * print * de

7、f tree(): treetop() treetop() print # print # print # tree() def treetop(): print * print * print * print * def treetrunk(): print # print # print # def main(): treetop() treetop() treetrunk() main() 函數(shù)用途函數(shù)用途:改善程序結(jié)構(gòu)改善程序結(jié)構(gòu)(2) def treetop(): print * print * print * print * def treetrunk(): print # pri

8、nt # print # def main(): treetop() treetop() treetrunk() main() def treetop1(): print * print * print * print * def treetop(): treetop1() treetop1() def treetrunk(): print # print # print # def main(): treetop() treetrunk() main() 主程序結(jié)構(gòu)清晰主程序結(jié)構(gòu)清晰 函數(shù)用途函數(shù)用途:提高程序通用性提高程序通用性 換用換用字符來畫樹字符來畫樹,以便比較美觀度以便比較美觀度.

9、 def treetop1(): print * print * print * print * def treetop2(): print print print print def star_treetop(): treetop1() treetop1() def caret_treetop(): treetop2() treetop2() . def treetop(ch): print %s % (ch) print %s % (3*ch) print %s % (5*ch) print %s % (7*ch) def star_treetop(): treetop(*) treeto

10、p(*) def caret_treetop(): treetop() treetop() . 利用函數(shù)參數(shù)利用函數(shù)參數(shù) 提高通用性提高通用性 小結(jié)小結(jié):函數(shù)的定義和調(diào)用函數(shù)的定義和調(diào)用 先定義先定義(define) 再通過函數(shù)名調(diào)用再通過函數(shù)名調(diào)用 調(diào)用時傳遞參數(shù)調(diào)用時傳遞參數(shù) 調(diào)用執(zhí)行的是函數(shù)體調(diào)用執(zhí)行的是函數(shù)體(語句序列語句序列) 調(diào)用產(chǎn)生返回值調(diào)用產(chǎn)生返回值 函數(shù)定義可置于程序中任何地方函數(shù)定義可置于程序中任何地方,但必須但必須 在調(diào)用之前在調(diào)用之前 Lu Chaojun, SJTU 13 def func(x): y = x * x return y a = func(2) 函數(shù)調(diào)用

11、過程函數(shù)調(diào)用過程 函數(shù)定義函數(shù)定義 def (): 函數(shù)調(diào)用函數(shù)調(diào)用 () 調(diào)用者暫停調(diào)用者暫停 函數(shù)形參被賦值為實(shí)參函數(shù)形參被賦值為實(shí)參 執(zhí)行函數(shù)體執(zhí)行函數(shù)體 控制返回調(diào)用者控制返回調(diào)用者(調(diào)用點(diǎn)的下一條語句調(diào)用點(diǎn)的下一條語句) 函數(shù)調(diào)用過程圖解函數(shù)調(diào)用過程圖解(1) 函數(shù)調(diào)用過程圖解函數(shù)調(diào)用過程圖解(2) 函數(shù)調(diào)用過程圖解函數(shù)調(diào)用過程圖解(3) 參數(shù)傳遞參數(shù)傳遞 對于函數(shù)定義對于函數(shù)定義 def f(x,y,z): . 按位置傳遞按位置傳遞 f(1,2,3) 按名傳遞按名傳遞:形參形參=實(shí)參實(shí)參 f(x=1,z=3,y=2) 實(shí)參可以是字面值實(shí)參可以是字面值,也可以是已賦值的變也可以是已賦

12、值的變 量量 f(1,a,b) 變量的作用域變量的作用域 變量具有變量具有作用域作用域(scope):即可以引用該變量的程序區(qū)域即可以引用該變量的程序區(qū)域. 不同作用域中的變量不同作用域中的變量,即使同名即使同名,也是不同的變量也是不同的變量! 作用域可以是局部作用域可以是局部,也可以是全局也可以是全局 函數(shù)中定義的變量是函數(shù)中定義的變量是局部的局部的:即作用域是函數(shù)體即作用域是函數(shù)體. 函數(shù)的形參可視為局部變量函數(shù)的形參可視為局部變量,只不過是在調(diào)用時才賦值只不過是在調(diào)用時才賦值. x,y = 0,0 def f(x): y = 1 print x,y f(x) print x,y 函數(shù)如何

13、使用外部數(shù)據(jù)函數(shù)如何使用外部數(shù)據(jù) Python中中,函數(shù)體可直接引用外部的變量函數(shù)體可直接引用外部的變量. x = 0 def f(y): z = 1 print x,y,z f(10) 但這用法很不好但這用法很不好!不符合模塊化要求不符合模塊化要求. 應(yīng)當(dāng)通過參數(shù)向函數(shù)傳遞數(shù)據(jù)應(yīng)當(dāng)通過參數(shù)向函數(shù)傳遞數(shù)據(jù) x = 0 def f(p,y): z = 1 print p,y,z f(x,10) f() x y,z x 全局變量全局變量 函數(shù)若需引用并修改外部變量函數(shù)若需引用并修改外部變量,可聲明可聲明全局變量全局變量 x = 1 def f(): print x #未定義變量視為全局變量未定義變

14、量視為全局變量 x = 2 #賦值引入局部變量賦值引入局部變量,則前行出錯則前行出錯! f() def h(): global x print x x = 2 #此賦值是針對全局變量的此賦值是針對全局變量的 print x h() f() x h() x x 全局變量的用途全局變量的用途 多個函數(shù)處理共享數(shù)據(jù)多個函數(shù)處理共享數(shù)據(jù) def f(): global x x = x + 1 print x def g(): global x x = x 1 print x x = 0 f() g() 函數(shù)的返回值函數(shù)的返回值 函數(shù)與調(diào)用者之間的信息交互函數(shù)與調(diào)用者之間的信息交互: 通過形參從調(diào)用者輸

15、入值通過形參從調(diào)用者輸入值 通過通過返回值返回值向調(diào)用者輸出值向調(diào)用者輸出值 定義定義 def (): return return計(jì)算各表達(dá)式計(jì)算各表達(dá)式,將結(jié)果返回調(diào)用者將結(jié)果返回調(diào)用者,退退 出函數(shù)出函數(shù) 函數(shù)返回值的使用函數(shù)返回值的使用 如果沒有或者用不上函數(shù)返回值如果沒有或者用不上函數(shù)返回值,則函數(shù)調(diào)用可則函數(shù)調(diào)用可 以直接當(dāng)成一條語句以直接當(dāng)成一條語句 f(3) 相當(dāng)于某些語言中的相當(dāng)于某些語言中的過程調(diào)用過程調(diào)用 如果想使用函數(shù)返回值如果想使用函數(shù)返回值,則有兩種用法則有兩種用法 用變量接收返回值用變量接收返回值,如如 x = f(3) print 2 + x * 4 直接用在表達(dá)

16、式中直接用在表達(dá)式中,如如 print 2 + f(3) * 4 忘記接收函數(shù)返回值是忘記接收函數(shù)返回值是Python初學(xué)者的常見錯初學(xué)者的常見錯 誤誤 函數(shù)返回值使用例函數(shù)返回值使用例(1) def sq(x): return x * x sq(2) 4 print sq(3) + 1 10 a = 4 b = sq(a) print b 16 函數(shù)返回值使用例函數(shù)返回值使用例(2) 求兩點(diǎn)距離的函數(shù)求兩點(diǎn)距離的函數(shù) from math import sqrt def sq(x): return x * x def dist(u,v): d = sqrt(sq(v0-u0)+sq(v1-u1

17、) return d 用一個函數(shù)輔助定義另一個函數(shù)用一個函數(shù)輔助定義另一個函數(shù),這是化繁為這是化繁為 簡的常用做法簡的常用做法. 函數(shù)返回值使用例函數(shù)返回值使用例(3) 多個返回值的接收多個返回值的接收 def headtail(list): return list0,listlen(list)-1 用多個變量用多個變量 h,t = headtail(1,2,3,4,5) print h,t 1 5 用一個變量用一個變量,接受的值是元組接受的值是元組. v = headtail(1,2,3,4,5) v (1, 5) 關(guān)于關(guān)于return return通常出現(xiàn)在函數(shù)末尾通常出現(xiàn)在函數(shù)末尾,因?yàn)楹瘮?shù)一般都是因?yàn)楹瘮?shù)一般都是 執(zhí)行完所有步驟之后才能得出計(jì)算結(jié)果并返回執(zhí)行完所有步驟之后才能得出計(jì)算結(jié)果并返回. 有時在函數(shù)到達(dá)末尾之前就終止執(zhí)行并返回有時在函數(shù)到達(dá)末尾之前就終止執(zhí)行并返回. def f(x): if x from moduletest import days days(1900

溫馨提示

  • 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

提交評論