上海交通大學(xué) python程序設(shè)計(jì)課程PPT Ch7 (1)_第1頁
上海交通大學(xué) python程序設(shè)計(jì)課程PPT Ch7 (1)_第2頁
上海交通大學(xué) python程序設(shè)計(jì)課程PPT Ch7 (1)_第3頁
上海交通大學(xué) python程序設(shè)計(jì)課程PPT Ch7 (1)_第4頁
上海交通大學(xué) python程序設(shè)計(jì)課程PPT Ch7 (1)_第5頁
已閱讀5頁,還剩63頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

1、面向?qū)ο笏枷牒途幊堂嫦驅(qū)ο笏枷牒途幊? 2 2回顧回顧 程序包括程序包括 數(shù)據(jù)數(shù)據(jù)數(shù)據(jù)類型數(shù)據(jù)類型,數(shù)據(jù)結(jié)構(gòu)數(shù)據(jù)結(jié)構(gòu) 處理過程處理過程算法算法 兩種程序設(shè)計(jì)思想兩種程序設(shè)計(jì)思想 面向過程面向過程:以操作為中心以操作為中心 面向?qū)ο竺嫦驅(qū)ο?以數(shù)據(jù)為中心以數(shù)據(jù)為中心3 3 3數(shù)據(jù)與操作數(shù)據(jù)與操作:面向過程觀點(diǎn)面向過程觀點(diǎn) 程序就是對數(shù)據(jù)進(jìn)行一系列的操作程序就是對數(shù)據(jù)進(jìn)行一系列的操作 先表示數(shù)據(jù)先表示數(shù)據(jù):常量常量,變量變量 再來處理數(shù)據(jù)再來處理數(shù)據(jù)x = 1y = 2z = x + yprint z 特點(diǎn)特點(diǎn):數(shù)據(jù)與操作分離數(shù)據(jù)與操作分離 數(shù)據(jù)是被動的數(shù)據(jù)是被動的,操作是主動的操作是主動的4 4

2、以過程為中心以過程為中心 準(zhǔn)備好數(shù)據(jù)之后準(zhǔn)備好數(shù)據(jù)之后,主要是進(jìn)行數(shù)據(jù)處理過主要是進(jìn)行數(shù)據(jù)處理過程的設(shè)計(jì)程的設(shè)計(jì),即算法設(shè)計(jì)即算法設(shè)計(jì). 這種設(shè)計(jì)方法中這種設(shè)計(jì)方法中,數(shù)據(jù)通常對整個處理過數(shù)據(jù)通常對整個處理過程都是公開的程都是公開的,不能隱藏數(shù)據(jù)不能隱藏數(shù)據(jù).x = 1y = 2z = x + yw = x y # 和上一行處理同樣的數(shù)據(jù)和上一行處理同樣的數(shù)據(jù)x,yz = z * w print z5 5復(fù)雜處理過程的設(shè)計(jì)復(fù)雜處理過程的設(shè)計(jì) 模塊化模塊化def op1(a,b): return a * a - b * b def op2(a,b): return a * b + b * a x

3、 = 1y = 2z = 3result1 = op1(x,y)result2 = op2(x,z)print result1 + result2 函數(shù)函數(shù)可以看作是更高可以看作是更高抽象級的操作抽象級的操作,與普通與普通操作似乎并無本質(zhì)差別操作似乎并無本質(zhì)差別.x = 1y = 2res = x + yprint res但函數(shù)有數(shù)據(jù)隱藏功能但函數(shù)有數(shù)據(jù)隱藏功能6 6函數(shù)與數(shù)據(jù)隱藏函數(shù)與數(shù)據(jù)隱藏 函數(shù)是功能黑箱函數(shù)是功能黑箱 使用者需要的只是函數(shù)的功能使用者需要的只是函數(shù)的功能,并不需要知并不需要知曉它內(nèi)部是如何實(shí)現(xiàn)功能的曉它內(nèi)部是如何實(shí)現(xiàn)功能的 函數(shù)內(nèi)部處理的數(shù)據(jù)不對函數(shù)外部開放函數(shù)內(nèi)部處理

4、的數(shù)據(jù)不對函數(shù)外部開放一個函數(shù)不能直接訪問另一個函數(shù)內(nèi)部的數(shù)據(jù)一個函數(shù)不能直接訪問另一個函數(shù)內(nèi)部的數(shù)據(jù)7 7小結(jié)小結(jié):面向過程設(shè)計(jì)面向過程設(shè)計(jì) 數(shù)據(jù)與操作分離數(shù)據(jù)與操作分離,以操作過程為中心以操作過程為中心 先表示數(shù)據(jù)先表示數(shù)據(jù) 主要精力放在設(shè)計(jì)數(shù)據(jù)操作及其流程控制主要精力放在設(shè)計(jì)數(shù)據(jù)操作及其流程控制 對復(fù)雜程序采用自頂向下設(shè)計(jì)和模塊化設(shè)計(jì)對復(fù)雜程序采用自頂向下設(shè)計(jì)和模塊化設(shè)計(jì)將使用低級別操作的復(fù)雜過程設(shè)計(jì)成使用高級將使用低級別操作的復(fù)雜過程設(shè)計(jì)成使用高級別操作的簡單過程別操作的簡單過程 不適合的應(yīng)用不適合的應(yīng)用:如如GUI程序程序 沒有明確的執(zhí)行流程沒有明確的執(zhí)行流程,由不可預(yù)知的事件驅(qū)由不

5、可預(yù)知的事件驅(qū)動處理過程動處理過程8 8數(shù)據(jù)與操作數(shù)據(jù)與操作:面向?qū)ο笥^點(diǎn)面向?qū)ο笥^點(diǎn) 數(shù)據(jù)與操作不可分離數(shù)據(jù)與操作不可分離 數(shù)據(jù)類型概念已經(jīng)提示我們數(shù)據(jù)類型概念已經(jīng)提示我們:特定數(shù)據(jù)值和特定數(shù)據(jù)值和特定操作是不可分割的兩件事情特定操作是不可分割的兩件事情Q:請問請問x+y是什么意思是什么意思?A:+對不同類型的對不同類型的x,y值有不同意義值有不同意義. 既然如此既然如此,何不將特定數(shù)據(jù)值何不將特定數(shù)據(jù)值與特定操作捆綁在一起與特定操作捆綁在一起,形成一形成一種新型種新型數(shù)據(jù)數(shù)據(jù)? 由此產(chǎn)生了對象概念由此產(chǎn)生了對象概念9 9對象對象 對象對象(Object):集數(shù)據(jù)與操作于一身集數(shù)據(jù)與操作于一

6、身. 對象擁有特定數(shù)據(jù)對象擁有特定數(shù)據(jù) 對象能對其數(shù)據(jù)進(jìn)行特定操作對象能對其數(shù)據(jù)進(jìn)行特定操作 計(jì)算計(jì)算:向?qū)ο蟀l(fā)操作請求消息向?qū)ο蟀l(fā)操作請求消息. 對象是主動的對象是主動的,自己掌控對其數(shù)據(jù)的操作自己掌控對其數(shù)據(jù)的操作 對象將自己能執(zhí)行的操作對外公開對象將自己能執(zhí)行的操作對外公開 面向?qū)ο竺嫦驅(qū)ο?Object-Oriented):軟件系統(tǒng)由各軟件系統(tǒng)由各種對象組成種對象組成,對象之間通過消息進(jìn)行交互對象之間通過消息進(jìn)行交互.1010對象例子對象例子 人人 數(shù)據(jù)數(shù)據(jù):姓名姓名,出生日期出生日期,身高身高,體重體重,. 操作操作:計(jì)算年齡計(jì)算年齡,判斷體重是否標(biāo)準(zhǔn)判斷體重是否標(biāo)準(zhǔn),. 電視機(jī)電視

7、機(jī) 數(shù)據(jù)數(shù)據(jù):型號型號,廠商廠商,尺寸尺寸,頻道數(shù)頻道數(shù),. 操作操作:開機(jī)開機(jī),關(guān)機(jī)關(guān)機(jī),調(diào)頻道調(diào)頻道,調(diào)音量調(diào)音量,. 室內(nèi)環(huán)境室內(nèi)環(huán)境 數(shù)據(jù)數(shù)據(jù):溫度溫度,濕度濕度,容積容積,. 操作操作:調(diào)節(jié)溫度調(diào)節(jié)溫度,調(diào)節(jié)濕度調(diào)節(jié)濕度,換算容積換算容積單位單位1111面向過程面向過程vs面向?qū)ο缶幊堂嫦驅(qū)ο缶幊?假設(shè)一個問題涉及數(shù)據(jù)假設(shè)一個問題涉及數(shù)據(jù)X和和Y,對對X要進(jìn)行要進(jìn)行的操作為的操作為f(),g(),對對Y的操作為的操作為h() 面向過程設(shè)計(jì)和面向?qū)ο蟮玫降某绦蚍謩e形面向過程設(shè)計(jì)和面向?qū)ο蟮玫降某绦蚍謩e形如如X = .Y = .f(X)g(X)h(Y)Xf()g()Yh()請求X執(zhí)行f(

8、)請求X執(zhí)行g(shù)()請求Y執(zhí)行h()121212復(fù)雜數(shù)據(jù)的表示復(fù)雜數(shù)據(jù)的表示 簡單數(shù)據(jù)可以用現(xiàn)成的數(shù)據(jù)類型表示簡單數(shù)據(jù)可以用現(xiàn)成的數(shù)據(jù)類型表示 每個數(shù)據(jù)類型都包括每個數(shù)據(jù)類型都包括 定義一個值的集合定義一個值的集合:如如int 定義一些對值的運(yùn)算定義一些對值的運(yùn)算(操作操作):如如+,-,*,/ 復(fù)雜數(shù)據(jù)如何表示復(fù)雜數(shù)據(jù)如何表示? 拆成簡單數(shù)據(jù)拆成簡單數(shù)據(jù)例如例如學(xué)生學(xué)生拆成拆成name,age,addr等簡單數(shù)據(jù)等簡單數(shù)據(jù) 定義新類型定義新類型例如定義類型例如定義類型S,其值是由其值是由name,age,addr等構(gòu)成等構(gòu)成的整體的整體131313自定義類型的值和操作自定義類型的值和操作 分離

9、分離 融為一體融為一體141414從類型到類從類型到類 類是類型概念的發(fā)展類是類型概念的發(fā)展 對象是廣義的對象是廣義的數(shù)據(jù)值數(shù)據(jù)值 對象所屬的數(shù)據(jù)類型就是對象所屬的數(shù)據(jù)類型就是類類 用于描述復(fù)雜數(shù)據(jù)的靜態(tài)和動態(tài)行為用于描述復(fù)雜數(shù)據(jù)的靜態(tài)和動態(tài)行為 類類(class):描述相似對象的共性描述相似對象的共性.包括包括 數(shù)據(jù)數(shù)據(jù) 操作操作:方法方法(method) 對象是類的對象是類的實(shí)例實(shí)例151515類與抽象類與抽象 類是對現(xiàn)實(shí)事物的抽象類是對現(xiàn)實(shí)事物的抽象 數(shù)據(jù)抽象數(shù)據(jù)抽象例如例如:從具體學(xué)生抽象出姓名從具體學(xué)生抽象出姓名,年齡年齡,地址等數(shù)據(jù)地址等數(shù)據(jù) 行為抽象行為抽象例如例如:從學(xué)生日常行

10、為抽象出選課從學(xué)生日常行為抽象出選課,加入社團(tuán)等操加入社團(tuán)等操作作 于是產(chǎn)生了類于是產(chǎn)生了類Student的定義的定義 抽象可以在多個層次上進(jìn)行抽象可以在多個層次上進(jìn)行 例如例如:學(xué)生學(xué)生-人人-動物動物-生物生物161616封裝封裝 封裝封裝:數(shù)據(jù)和操作結(jié)合成一個程序單元數(shù)據(jù)和操作結(jié)合成一個程序單元,對對外部隱藏內(nèi)部實(shí)現(xiàn)細(xì)節(jié)外部隱藏內(nèi)部實(shí)現(xiàn)細(xì)節(jié). 不允許用戶直接操作類中被隱藏的信息不允許用戶直接操作類中被隱藏的信息 用戶也無需了解隱藏的信息就能使用該類用戶也無需了解隱藏的信息就能使用該類 類對外公開方法名稱和調(diào)用格式類對外公開方法名稱和調(diào)用格式,即界面即界面. 外界向?qū)ο蟀l(fā)消息外界向?qū)ο蟀l(fā)消

11、息(方法名及參數(shù)方法名及參數(shù)) 對象響應(yīng)消息對象響應(yīng)消息,執(zhí)行相應(yīng)方法執(zhí)行相應(yīng)方法 外界只能按對象允許的方式來處理對象數(shù)據(jù)外界只能按對象允許的方式來處理對象數(shù)據(jù)171717封裝的好處封裝的好處 安全安全:對象自己的方法處理自己的數(shù)據(jù)對象自己的方法處理自己的數(shù)據(jù) 易用易用:使用者無需了解內(nèi)部實(shí)現(xiàn)細(xì)節(jié)使用者無需了解內(nèi)部實(shí)現(xiàn)細(xì)節(jié) 易維護(hù)易維護(hù):實(shí)現(xiàn)者修改內(nèi)部實(shí)現(xiàn)不會影響使實(shí)現(xiàn)者修改內(nèi)部實(shí)現(xiàn)不會影響使用者用者 標(biāo)準(zhǔn)化標(biāo)準(zhǔn)化:同類甚至不同類的對象對使用者同類甚至不同類的對象對使用者都呈現(xiàn)同樣的操作界面都呈現(xiàn)同樣的操作界面類的定義類的定義 類定義類定義class : 方法定義同函數(shù)定義方法定義同函數(shù)定義d

12、ef (): .方法是依附于類的函數(shù)方法是依附于類的函數(shù),普通函數(shù)則是獨(dú)立的普通函數(shù)則是獨(dú)立的.方法的第一個參數(shù)是專用的方法的第一個參數(shù)是專用的,習(xí)慣用名字習(xí)慣用名字self.具體含義見后具體含義見后.只能通過向?qū)ο蟀l(fā)消息來調(diào)用方法只能通過向?qū)ο蟀l(fā)消息來調(diào)用方法.18實(shí)例變量實(shí)例變量(1) 回憶回憶:對象是數(shù)據(jù)和操作的結(jié)合對象是數(shù)據(jù)和操作的結(jié)合. 類定義中類定義中,方法對應(yīng)于操作方法對應(yīng)于操作.數(shù)據(jù)呢數(shù)據(jù)呢? 對象的數(shù)據(jù)以實(shí)例變量形式定義對象的數(shù)據(jù)以實(shí)例變量形式定義. 實(shí)例變量實(shí)例變量self. 在方法中定義在方法中定義self. = 主要出現(xiàn)在主要出現(xiàn)在_init_()方法中方法中19實(shí)例變

13、量實(shí)例變量(2) 每個類實(shí)例每個類實(shí)例(對象對象)具有自己的實(shí)例變量副具有自己的實(shí)例變量副本本,用來存儲該對象自己的數(shù)據(jù)用來存儲該對象自己的數(shù)據(jù). 對實(shí)例變量的訪問對實(shí)例變量的訪問:. 實(shí)例變量與函數(shù)局部變量不同實(shí)例變量與函數(shù)局部變量不同! 同一個類的各個方法都可以訪問實(shí)例變量同一個類的各個方法都可以訪問實(shí)例變量. 類的方法中也可以定義局部變量類的方法中也可以定義局部變量,不能被其不能被其他方法訪問他方法訪問.20212121例例:類定義類定義 類類Person(可單獨(dú)保存為模塊可單獨(dú)保存為模塊person.py)class Person: def _init_(self,n,y): self

14、.name = n self.year = y def whatName(self): print My name is, def howOld(self,y): age = y self.year if age 0: print My age in,y,is,age else: print I was born in,self.year 實(shí)例創(chuàng)建實(shí)例創(chuàng)建(1) 類與實(shí)例類與實(shí)例:抽象與具體抽象與具體. 人人是類是類,張三張三是人的實(shí)例是人的實(shí)例 一個類可以創(chuàng)建任意多個實(shí)例一個類可以創(chuàng)建任意多個實(shí)例各實(shí)例具有相同的行為各實(shí)例具有相同的行為:由方法決定由方法決定但具有不同的數(shù)據(jù)

15、但具有不同的數(shù)據(jù):由實(shí)例變量決定由實(shí)例變量決定 實(shí)例創(chuàng)建實(shí)例創(chuàng)建 = () 這里這里相當(dāng)于一個函數(shù)相當(dāng)于一個函數(shù),稱為構(gòu)造器稱為構(gòu)造器,用用來構(gòu)造實(shí)例來構(gòu)造實(shí)例.22實(shí)例創(chuàng)建實(shí)例創(chuàng)建(2) 創(chuàng)建時對實(shí)例進(jìn)行初始化創(chuàng)建時對實(shí)例進(jìn)行初始化 用構(gòu)造器創(chuàng)建實(shí)例時用構(gòu)造器創(chuàng)建實(shí)例時,系統(tǒng)會自動調(diào)用系統(tǒng)會自動調(diào)用_init_方法方法通常在此方法中執(zhí)行一些初始化操作通常在此方法中執(zhí)行一些初始化操作_init_所需的參數(shù)由構(gòu)造器提供所需的參數(shù)由構(gòu)造器提供. 例如例如: from person import Person p1 = Person(Lucy,2005) 23例例:實(shí)例創(chuàng)建實(shí)例創(chuàng)建(1) 創(chuàng)建一個創(chuàng)

16、建一個Person實(shí)例實(shí)例 from person import Person p1 = Person(Lucy,2005) 24例例:實(shí)例創(chuàng)建實(shí)例創(chuàng)建(2) 創(chuàng)建兩個創(chuàng)建兩個Person實(shí)例實(shí)例 from person import Person p1 = Person(Lucy,2005) p2 = Person(Tom,1990) 25方法調(diào)用方法調(diào)用 類似函數(shù)調(diào)用類似函數(shù)調(diào)用,但需指明實(shí)例但需指明實(shí)例(對象對象).() 就是與形參就是與形參self對應(yīng)的實(shí)參對應(yīng)的實(shí)參. 例如例如 p1.whatName()My name is Lucy p2.whatName()My name is

17、Tom p2.howOld(2013)My age in 2013 is 23 26方法調(diào)用圖示方法調(diào)用圖示 p1.whatName() p2.howOld(2013)27編程案例編程案例:模擬炮彈飛行模擬炮彈飛行(1) 程序規(guī)格程序規(guī)格 輸入輸入:炮彈的發(fā)射角度炮彈的發(fā)射角度,初速和高度初速和高度 輸出輸出:炮彈的射程炮彈的射程 解決方法解決方法:模擬炮彈飛行過程模擬炮彈飛行過程,即計(jì)算每一即計(jì)算每一時刻炮彈的位置時刻炮彈的位置. 連續(xù)運(yùn)動的離散化連續(xù)運(yùn)動的離散化時間時間:t, t+ t, t+2 t, t+3 t, .軌跡軌跡: (xt,yt), (xt+ t,yt+ t), .28編程案

18、例編程案例:模擬炮彈飛行模擬炮彈飛行(2) 算法算法:輸入角度輸入角度angle(度度),初速初速v(米米/秒秒),高度高度h0(米米),間隔間隔t(秒秒)將將angle換算成弧度單位的換算成弧度單位的thetaxv = v * cos(theta)yv = v * sin(theta)初始位置初始位置(xpos,ypos) = (0,h0)當(dāng)炮彈還未落地當(dāng)炮彈還未落地(即即ypos = 0.0): 更新炮彈位置更新炮彈位置(xpos,ypos) 更新更新yv 輸出輸出xpos 29編程案例編程案例:模擬炮彈飛行模擬炮彈飛行(3) 核心代碼核心代碼:位置更新位置更新 水平方向水平方向xpos

19、= xpos + xv * t 垂直方向垂直方向yv1 = yv - 9.8 * typos = ypos + (yv + yv1) / 2.0 * t30from math import pi, sin, cosdef main(): angle = input(Enter the launch angle: ) vel = input(Enter the initial velocity: ) h0 = input(Enter the initial height : ) time = input(Enter the time interval : ) radians = (angle *

20、 pi)/180.0 xpos = 0 ypos = h0 xvel = vel * cos(radians) yvel = vel * sin(radians) while ypos = 0: xpos = xpos + time * xvel yvel1 = yvel - 9.8 * time ypos = ypos + time * (yvel + yvel1)/2.0 yvel = yvel1 print nDistance traveled: %0.1f meters. % (xpos)main()這個版本是流水帳式的,沒有章法結(jié)構(gòu).程序不長,倒有10個變量,為理解程序需要跟蹤這10

21、個數(shù)據(jù)的變化.編程案例編程案例:模擬炮彈飛行模擬炮彈飛行(4) 模塊化版本模塊化版本cball2.py 主程序主程序(主函數(shù)主函數(shù))非常簡潔非常簡潔,易理解易理解.def main():angle, v, h0, t = getInputs()xv, yv = getXY(v,angle)xpos = 0ypos = h0while ypos = 0:xpos,ypos,yv = update(t,xpos,ypos,xv,yv)print 射程射程: %0.1f 米米. % (xpos) 將輔助性變量將輔助性變量(theta和和yv1)隱藏在輔助函數(shù)中隱藏在輔助函數(shù)中. 仍然不夠好仍然不夠好

22、:update函數(shù)界面太復(fù)雜函數(shù)界面太復(fù)雜.32編程案例編程案例:模擬炮彈飛行模擬炮彈飛行(5) 面向?qū)ο蟀姹久嫦驅(qū)ο蟀姹綾ball3.py炮彈是現(xiàn)實(shí)實(shí)體炮彈是現(xiàn)實(shí)實(shí)體, ,用用xpos,ypos,xv和和yv四個分離的數(shù)四個分離的數(shù)據(jù)來描述它是據(jù)來描述它是“只見樹木不見森林只見樹木不見森林”. . OOP:將炮彈的信息和行為都封裝在類中將炮彈的信息和行為都封裝在類中,并創(chuàng)建一并創(chuàng)建一個炮彈對象個炮彈對象,程序會更加簡潔易理解程序會更加簡潔易理解.def main(): angle, vel, h0, time = getInputs() cball = Projectile(angle, v

23、el, h0) while cball.getY() = 0: cball.update(time) print 射程射程: %0.1f 米米. % (cball.getX()所有復(fù)雜性都隱藏在類中了所有復(fù)雜性都隱藏在類中了33from math import pi, sin, cosclass Projectile:def _init_(self, angle, velocity, height): self.xpos = 0.0 self.ypos = height theta = pi * angle / 180.0 self.xvel = velocity * cos(theta) s

24、elf.yvel = velocity * sin(theta)def update(self, time):self.xpos = self.xpos + time * self.xvel yvel1 = self.yvel - 9.8 * time self.ypos = self.ypos + time * (self.yvel + yvel1) / 2.0 self.yvel = yvel1def getY(self): return self.yposdef getX(self): return self.xpos編程案例編程案例:模擬炮彈飛行模擬炮彈飛行(6) 三個版本體現(xiàn)的思想變

25、遷三個版本體現(xiàn)的思想變遷35類與模塊化類與模塊化 復(fù)雜程序的模塊化設(shè)計(jì)復(fù)雜程序的模塊化設(shè)計(jì) 功能分解功能分解:利用子程序利用子程序(如函數(shù)如函數(shù))概念概念,以過程以過程為中心設(shè)計(jì)功能模塊為中心設(shè)計(jì)功能模塊 數(shù)據(jù)分解數(shù)據(jù)分解:利用類的概念利用類的概念,以數(shù)據(jù)為中心設(shè)計(jì)以數(shù)據(jù)為中心設(shè)計(jì)數(shù)據(jù)模塊數(shù)據(jù)模塊 功能模塊不太適合復(fù)雜數(shù)據(jù)的處理功能模塊不太適合復(fù)雜數(shù)據(jù)的處理 類模塊獨(dú)立性更高類模塊獨(dú)立性更高,可重用性更好可重用性更好 類定義可以提供給任何程序使用類定義可以提供給任何程序使用 很多很多OO語言都提供類庫語言都提供類庫36例例:學(xué)生信息處理系統(tǒng)學(xué)生信息處理系統(tǒng) 功能分解功能分解 課程注冊模塊課程注

26、冊模塊,修改學(xué)生信息模塊修改學(xué)生信息模塊,成績登錄成績登錄模塊等模塊等 每個模塊每個模塊(函數(shù)函數(shù))都需要了解都需要了解”學(xué)生學(xué)生”數(shù)據(jù)的細(xì)數(shù)據(jù)的細(xì)節(jié)節(jié) 數(shù)據(jù)分解數(shù)據(jù)分解 創(chuàng)建創(chuàng)建”學(xué)生學(xué)生”類類S,隱藏數(shù)據(jù)和操作實(shí)現(xiàn)細(xì)節(jié)隱藏數(shù)據(jù)和操作實(shí)現(xiàn)細(xì)節(jié),使使用者無需了解內(nèi)部細(xì)節(jié)就能執(zhí)行操作用者無需了解內(nèi)部細(xì)節(jié)就能執(zhí)行操作 其他數(shù)據(jù)模塊包括其他數(shù)據(jù)模塊包括”課程課程”類類,”教師教師”類等類等37如何表示任意復(fù)雜的數(shù)據(jù)如何表示任意復(fù)雜的數(shù)據(jù) 數(shù)據(jù)的復(fù)雜性表現(xiàn)在數(shù)據(jù)的復(fù)雜性表現(xiàn)在 數(shù)量大數(shù)量大:用集合體數(shù)據(jù)類型來表示用集合體數(shù)據(jù)類型來表示 有內(nèi)部深層結(jié)構(gòu)有內(nèi)部深層結(jié)構(gòu):用類來表示用類來表示 兩種復(fù)雜性混合

27、兩種復(fù)雜性混合:用用對象的集合對象的集合來刻畫來刻畫 people = p1, p2 for p in people: p.whatName() p.howOld(2013) 38393939超類與子類超類與子類* 子類子類 繼承繼承 覆寫覆寫 多態(tài)多態(tài)404040面向?qū)ο笤O(shè)計(jì)面向?qū)ο笤O(shè)計(jì)* OOD:對給定問題找出并定義一組有用的對給定問題找出并定義一組有用的類的過程類的過程. 基于詞性分析的一種方法基于詞性分析的一種方法 問題描述問題描述 描述中的名詞描述中的名詞(事物事物) 問題描述中的動詞問題描述中的動詞(對象行為對象行為)41EndFunctions that Modify Param

28、etersnReturn values are the main way to send information from a function back to the caller.nSometimes, we can communicate back to the caller by making changes to the function parameters.nUnderstanding when and how this is possible requires the mastery of some subtle details about how assignment wor

29、ks and the relationship between actual and formal parameters.Functions that Modify ParametersnSuppose you are writing a program that manages bank accounts. One function we would need to do is to accumulate interest on the account. Lets look at a first-cut at the function.ndef addInterest(balance, ra

30、te): newBalance = balance * (1 + rate) balance = newBalanceFunctions that Modify ParametersnThe intent is to set the balance of the account to a new value that includes the interest amount.nLets write a main program to test this:def test(): amount = 1000 rate = 0.05 addInterest(amount, rate) print a

31、mountFunctions that Modify ParametersnWe hope that that the 5% will be added to the amount, returning 1050.n test()1000nWhat went wrong? Nothing!Functions that Modify ParametersnThe first two lines of the test function create two local variables called amount and rate which are given the initial val

32、ues of 1000 and 0.05, respectively.def addInterest(balance, rate): newBalance = balance * (1 + rate) balance = newBalancedef test(): amount = 1000 rate = 0.05 addInterest(amount, rate) print amountFunctions that Modify ParametersnControl then transfers to the addInterest function.nThe formal paramet

33、ers balance and rate are assigned the values of the actual parameters amount and rate.nEven though rate appears in both, they are separate variables (because of scope rules).def addInterest(balance, rate): newBalance = balance * (1 + rate) balance = newBalancedef test(): amount = 1000 rate = 0.05 ad

34、dInterest(amount, rate) print amountFunctions that Modify ParametersnThe assignment of the parameters causes the variables balance and rate in addInterest to refer to the values of the actual parameters!def addInterest(balance, rate): newBalance = balance * (1 + rate) balance = newBalancedef test():

35、 amount = 1000 rate = 0.05 addInterest(amount, rate) print amountFunctions that Modify ParametersFunctions that Modify ParametersnExecuting the first line of addInterest creates a new variable, newBalance.nbalance is then assigned the value of newBalance.def addInterest(balance, rate): newBalance =

36、balance * (1 + rate) balance = newBalancedef test(): amount = 1000 rate = 0.05 addInterest(amount, rate) print amountFunctions that Modify Parametersnbalance now refers to the same value as newBalance, but this had no effect on amount in the test function.def addInterest(balance, rate): newBalance =

37、 balance * (1 + rate) balance = newBalancedef test(): amount = 1000 rate = 0.05 addInterest(amount, rate) print amountFunctions that Modify ParametersFunctions that Modify ParametersnExecution of addInterest has completed and control returns to test.nThe local variables, including the parameters, in

38、 addInterest go away, but amount and rate in the test function still refer to their initial values!def addInterest(balance, rate): newBalance = balance * (1 + rate) balance = newBalancedef test(): amount = 1000 rate = 0.05 addInterest(amount, rate) print amountFunctions that Modify ParametersnTo sum

39、marize: the formal parameters of a function only receive the values of the actual parameters. The function does not have access to the variable that holds the actual parameter.nPython is said to pass all parameters by value.Functions that Modify ParametersnSome programming languages (C+, Ada, and ma

40、ny more) do allow variables themselves to be sent as parameters to a function. This mechanism is said to pass parameters by reference.nWhen a new value is assigned to the formal parameter, the value of the variable in the calling program actually changes.Functions that Modify ParametersnSince Python

41、 doesnt have this capability, one alternative would be to change the addInterest function so that it returns the newBalance.Functions that Modify Parametersdef addInterest(balance, rate): newBalance = balance * (1 + rate) return newBalancedef test(): amount = 1000 rate = 0.05 amount = addInterest(am

42、ount, rate) print amounttest()Functions that Modify ParametersnInstead of looking at a single account, say we are writing a program for a bank that deals with many accounts. We could store the account balances in a list, then add the accrued interest to each of the balances in the list.nWe could upd

43、ate the first balance in the list with code like:balances0 = balances0 * (1 + rate)Functions that Modify ParametersnThis code says, “multiply the value in the 0th position of the list by (1 + rate) and store the result back into the 0th position of the list.”nA more general way to do this would be w

44、ith a loop that goes through positions 0, 1, , length 1.Functions that Modify Parametersdef addInterest(balances, rate): for i in range(len(balances): balancesi = balancesi * (1+rate)def test(): amounts = 1000, 2200, 800, 360 rate = 0.05 addInterest(amounts, rate) print amountstest()Functions that M

45、odify ParametersnRemember, our original code had these values:1000, 2200, 800, 360n The program returns:1050.0, 2310.0, 840.0, 378.0nWhat happened? Python passes parameters by value, but it looks like amounts has been changed!Functions that Modify ParametersnThe first two lines of test create the variables amounts and rate.nThe value of the variable amounts is a list object that contains four int values.def addInterest(balances, rate): for i in range(l

溫馨提示

  • 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

提交評論