版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
第5章用函數(shù)實(shí)現(xiàn)模塊化程序設(shè)計(jì)前面我們已經(jīng)介紹了數(shù)值、賦值語句、輸入/輸出、選擇結(jié)構(gòu)、循環(huán)結(jié)構(gòu)以及列表等內(nèi)容,這些編程方法只適合于解決簡單的問題。在解決比較復(fù)雜的問題時(shí),經(jīng)常需要在程序中多次執(zhí)行同一項(xiàng)任務(wù),顯然,反復(fù)編寫或復(fù)制多份完成該任務(wù)的代碼并不是好的方法,這會(huì)使程序變得冗長且難以維護(hù)。各種高級語言都提供了代碼復(fù)用的機(jī)制,Python可以使用函數(shù)和類實(shí)現(xiàn)代碼復(fù)用,本章學(xué)習(xí)函數(shù)。5.1函數(shù)調(diào)用函數(shù)是一個(gè)“子程序”,也就是程序里面的一段代碼。函數(shù)實(shí)現(xiàn)代碼復(fù)用的基本思想是給一個(gè)語句序列(代碼塊)取一個(gè)名字(函數(shù)名),然后在程序的任何位置可以通過引用函數(shù)名稱,來執(zhí)行這些語句。也可以說,函數(shù)是有名稱的代碼塊。Python提供了很多內(nèi)置函數(shù),如前面程序中一直在使用的print()、input()、len()等函數(shù),也允許用戶自己定義函數(shù)。通過函數(shù)名執(zhí)行內(nèi)置函數(shù)或自定義函數(shù)的語句序列,稱為“調(diào)用”函數(shù)。5.1.1函數(shù)調(diào)用函數(shù)調(diào)用的一般格式為函數(shù)名(實(shí)參表列)例如,內(nèi)置函數(shù)pow(x,y)的功能是計(jì)算x**y,即x的y次方。調(diào)用pow函數(shù)>>>pow(2,5)32其中,pow是函數(shù)名,x和y是形參(形式參數(shù)),表達(dá)式2和5是傳遞給pow的實(shí)參(實(shí)際參數(shù))。各個(gè)形參或?qū)崊㈤g用逗號分隔。32是函數(shù)計(jì)算以后的得到的結(jié)果,稱為返回值,因此我們說pow(2,5)返回32。5.1.1函數(shù)調(diào)用如果在表達(dá)式中調(diào)用函數(shù)時(shí),Python將函數(shù)調(diào)用替換為其返回值,例如,表達(dá)式pow(2,5)+8與32+8等價(jià),結(jié)果為40。5.1.1函數(shù)調(diào)用即使函數(shù)不接任何參數(shù),也要在函數(shù)名后使用()。()讓Python調(diào)用指定的函數(shù),如果不接(),將輸出錯(cuò)誤。例如,只輸入print時(shí),Python并不執(zhí)行函數(shù),輸出空行,而是提示print指向一個(gè)函數(shù)。>>>print<built-infunctionprint>5.1.1函數(shù)調(diào)用有些函數(shù)的部分形參會(huì)使用默認(rèn)值。在函數(shù)調(diào)用時(shí)這些參數(shù)即可以傳實(shí)參,也可以不傳實(shí)參而使用默認(rèn)值。前面章節(jié)使用print函數(shù)中的end參數(shù)就設(shè)置了默認(rèn)參數(shù)值,end表示結(jié)束字符串,默認(rèn)值為換行符'\n'。在輸出時(shí),print將要輸出的字符串(或其他類型對象轉(zhuǎn)換的字符串)與end參數(shù)連接在一起,然后輸出。例如:print('hello')實(shí)際輸出的是'hello'+end,也就是輸出'hello\n';print('hello',end='\t')實(shí)際輸出的是'hello\t'。5.1.1函數(shù)調(diào)用有默認(rèn)值的形參在傳實(shí)參時(shí)一般要使用參數(shù)名,并且應(yīng)該放在沒有默認(rèn)值的參數(shù)后面,如print('hello',end='\t')。5.1.1函數(shù)調(diào)用函數(shù)參數(shù)表可以包含任意數(shù)量的參數(shù),參數(shù)數(shù)量與函數(shù)定義有關(guān),例如>>>abs(-4)#abs函數(shù)用于計(jì)算一個(gè)數(shù)的絕對值4>>>max(6,-2)#max函數(shù)和min函數(shù)分別用于求一組數(shù)的最大值和最小值6>>>min(2,-4,6,26.5)-45.1.2不返回值的函數(shù)有些函數(shù)無返回值(如print),Python在執(zhí)行無返回值的函數(shù)時(shí)返回一個(gè)特殊值None,表示無返回值。>>>print('hello')hello>>>x=print('hello')hello>>>print(x)NoneNone即不是字符串,也不是數(shù)字,不能用它做任何有意義的計(jì)算。5.2.1函數(shù)定義的一般形式在Python中,函數(shù)定義的一般形式為def函數(shù)名([形式參數(shù)1,形式參數(shù)2,…]):
語句塊例5.1定義maxVal函數(shù)求兩個(gè)數(shù)的最大值defmaxVal(x,y):ifx>y:returnxelse:returny5.2.1函數(shù)定義的一般形式函數(shù)定義以def關(guān)鍵詞開頭,后接函數(shù)名稱和圓括號(),括號里面是函數(shù)的參數(shù),參數(shù)可以是0個(gè)或多個(gè),各個(gè)參數(shù)間用逗號分隔,冒號后面對應(yīng)縮進(jìn)的代碼塊是函數(shù)體。函數(shù)體可以是任何一段Python代碼。函數(shù)如果需要有返回的計(jì)算結(jié)果,利用return關(guān)鍵字作返回。return關(guān)鍵字后面可以是數(shù)值或其他類型的數(shù)據(jù)(如字符串、列表、元組等),也可以是變量或表達(dá)式。在執(zhí)行到return語句時(shí)會(huì)結(jié)束對函數(shù)的調(diào)用,一個(gè)函數(shù)可能會(huì)有多個(gè)return語句。5.2.1函數(shù)定義的一般形式函數(shù)定義時(shí)并不會(huì)執(zhí)行,函數(shù)定義中的語句只有在被調(diào)用時(shí)才會(huì)執(zhí)行。例如,下面的函數(shù)調(diào)用maxVal(3,4)執(zhí)行時(shí),將3傳給x,4傳給y。在執(zhí)行if語句時(shí),條件為假,轉(zhuǎn)else部分,返回4,函數(shù)結(jié)束。defmaxVal(x,y):ifx>y:returnxelse:returny5.2.1函數(shù)定義的一般形式當(dāng)函數(shù)被調(diào)用時(shí),會(huì)執(zhí)行如下過程:(1)求實(shí)參表達(dá)式的值,將求值結(jié)果傳給函數(shù)的形參。例如,調(diào)用maxVal(3+4,z)會(huì)在解釋器求值后將7傳給形參x,將變量z的值傳給形參y。(2)執(zhí)行函數(shù)體的第一條語句。(3)執(zhí)行函數(shù)體中的代碼,直至遇到return語句。return后面的表達(dá)式的值就是函數(shù)調(diào)用的值;如果沒有語句可以繼續(xù)執(zhí)行,函數(shù)返回的值為None;如果return后面沒有表達(dá)式,函數(shù)返回的值也為None。5.2.1函數(shù)定義的一般形式例5.2定義函數(shù),根據(jù)半徑計(jì)算圓面積。5.2.1函數(shù)定義的一般形式例5.2定義函數(shù),根據(jù)半徑計(jì)算圓面積。defcalCircleArea(r):return3.14159*r*rr=float(input("pleaseinputradius:"))area=calCircleArea(r)print("area=",area)由于函數(shù)定義時(shí)并不會(huì)執(zhí)行,所以程序執(zhí)行的第一條語句是輸入語句,獲得半徑r,然后將r當(dāng)作參數(shù)調(diào)用函數(shù)calCircleArea,函數(shù)執(zhí)行完成后,返回值賦值給area變量,最后輸出。5.2.1函數(shù)定義的一般形式例5.3定義函數(shù),對列表求和。5.2.1函數(shù)定義的一般形式例5.3定義函數(shù),對列表求和。defadd_list(list):sum=0foriinlist:sum=sum+ireturnsumarray=[1,2,3,4,5,6]s=add_list(array)print("sum=",s)函數(shù)add_list的參數(shù)是列表,在函數(shù)體中,利用for語句遍歷列表元素求和,最后將和作為返回值。add_list函數(shù)的功能與sum()相同。5.2.1函數(shù)定義的一般形式如果實(shí)參不是列表,在執(zhí)行for語句時(shí)會(huì)產(chǎn)生錯(cuò)誤,為了避免產(chǎn)生這樣的錯(cuò)誤,可以在函數(shù)中添加參數(shù)類型判斷。使用type()函數(shù)求列表變量的類型為<class'list'>,使用str()函數(shù)將其轉(zhuǎn)換為字符串后,如果字符串中包含'list',則為列表,否則直接做return。修改后的函數(shù)add_list在參數(shù)為非列表類型時(shí),返回None。5.2.1函數(shù)定義的一般形式defadd_list(list):ifnot'list'instr(type(list)):#list不是列表時(shí)為真
return#結(jié)束函數(shù)調(diào)用,返回Nonesum=0foriinlist:sum=sum+ireturnsum5.2.2傳遞參數(shù)方式1.按位置傳參數(shù)最常用的傳參數(shù)方法是按位置傳參數(shù),傳入?yún)?shù)的值是按照順序依次復(fù)制過去的。例如,函數(shù)定義為maxVal(x,y),調(diào)用時(shí)maxVal(3,4)的第1個(gè)實(shí)參3傳給第1個(gè)形參x,第2個(gè)實(shí)參4傳給第2個(gè)形參y。按位置傳參數(shù)必須熟記每個(gè)位置參數(shù)的含義,這在參數(shù)個(gè)數(shù)很多時(shí)并不容易。5.2.2傳遞參數(shù)方式2.指定參數(shù)名稱為了避免按位置傳參數(shù)帶來的難以記憶,調(diào)用函數(shù)時(shí)可以指定對應(yīng)形式參數(shù)的名字,甚至可以采用與函數(shù)定義不同的順序傳遞參數(shù)。5.2.2傳遞參數(shù)方式例5.4使用函數(shù)將十進(jìn)制數(shù)轉(zhuǎn)換成其他進(jìn)制數(shù)。defconvert(n,base):digits=[]whilen>0:digits.append(n%base)n=n//basereturndigitsdefprintConvert(digits):p=len(digits)-1#逆序輸出
whilep>=0:print(digits[p],end="")p=p-1printConvert(convert(base=2,n=24))5.2.2傳遞參數(shù)方式3.指定默認(rèn)參數(shù)值定義函數(shù)時(shí),可以為參數(shù)指定默認(rèn)的參數(shù)值。調(diào)用函數(shù)時(shí),如果參數(shù)表中沒有該參數(shù),那么該參數(shù)使用默認(rèn)值。5.2.2傳遞參數(shù)方式例5.5使用默認(rèn)參數(shù)值。defgreet(name,greeting='hello',end="!"):print(greeting,name+end)greet("wangming")greet("wangming","Goodmorning")greet("wangming",greeting="Hi")程序運(yùn)行結(jié)果為hellowangming!Goodmorningwangming!Hiwangming!函數(shù)可以根據(jù)需要使用任意數(shù)量的默認(rèn)參數(shù),但是帶默認(rèn)值的參數(shù)不能位于沒有默認(rèn)值的參數(shù)的前面。5.2.2傳遞參數(shù)方式4.可變數(shù)量參數(shù)函數(shù)形參變量名前加*表示不限定參數(shù)數(shù)量,實(shí)參以元組形式傳遞給形參。5.2.2傳遞參數(shù)方式例5.6按位置傳不限數(shù)量參數(shù)。defgreet(*name,greeting='hello',end="!"):print(name)names=""forninname:names=names+n+""print(greeting,names+end)greet("wangming")greet("wangming","liping","Goodmorning")greet("wangming","liping","zhangling",greeting="Hi")5.2.2傳遞參數(shù)方式例5.6按位置傳不限數(shù)量參數(shù)。程序運(yùn)行結(jié)果為('wangming',)hellowangming!('wangming','liping','Goodmorning')hellowangminglipingGoodmorning!('wangming','liping','zhangling')Hiwangminglipingzhangling!5.2.2傳遞參數(shù)方式4.可變數(shù)量參數(shù)函數(shù)形參變量名前加**表示不限定參數(shù)數(shù)量,參數(shù)名稱和參數(shù)以字典形式傳遞給形參。參數(shù)的名字是字典的鍵,對應(yīng)參數(shù)的值是字典的值。5.2.2傳遞參數(shù)方式例5.7編寫函數(shù),求矩形、圓和梯形面積。defcalArea(type,**args):print(args)
iftype=="rectangle":
returnargs["width"]*args["height"]eliftype=="circle":
return3.14159*args["radius"]*args["radius"]eliftype=="trapezoid":
return(args["top"]+args["bottom"])*args["height"]/2print("rectanglearea=",calArea("rectangle",width=2,height=3))print("circlearea=",calArea("circle",radius=2))print("trapezoidarea=",calArea("trapezoid",top=2,bottom=5,height=3))5.2.2傳遞參數(shù)方式例5.7編寫函數(shù),求矩形、圓和梯形面積。程序運(yùn)行結(jié)果為{'width':2,'height':3}rectanglearea=6{'radius':2}circlearea=12.56636{'top':2,'bottom':5,'height':3}trapezoidarea=10.55.2.3參數(shù)類型從變量指向地址內(nèi)容是否可以變化角度看,數(shù)值、字符串、元組是不可變類型,而列表和字典則是可變類型。5.2.3參數(shù)類型在數(shù)值、字符串、元組變量作為函數(shù)參數(shù)時(shí),如果在函數(shù)中修改形參變量的值,不會(huì)影響實(shí)參變量本身。在列表、字典變量作為函數(shù)參數(shù)時(shí),如果在函數(shù)中修改列表內(nèi)容,函數(shù)調(diào)用結(jié)束后的實(shí)參列表值也會(huì)發(fā)生變化。5.2.3參數(shù)類型例5.8交換函數(shù)對不同類型參數(shù)的影響。defswap(x,y):x,y=y,xdefswaplist(list):list[0],list[1]=list[1],list[0]a=2b=3c=[2,3]swap(a,b)swaplist(c)print("aftercallswap:","a=",a,"b=",b)print("aftercallswaplist:","c=",c)5.2.3參數(shù)類型例5.8交換函數(shù)對不同類型參數(shù)的影響。程序運(yùn)行結(jié)果為:aftercallswap:a=2b=3aftercallswaplist:c=[3,2]5.2.4lambda函數(shù)lambda函數(shù)是一種匿名函數(shù),可接受任意數(shù)量的參數(shù),但只能有一個(gè)表達(dá)式。定義lambda函數(shù)的一般格式為:lambda參數(shù)表:表達(dá)式功能:執(zhí)行表達(dá)式并返回結(jié)果。>>>x=lambdaa:a+10>>>print(x(5))15等效于defx(a):returna+105.2.4lambda函數(shù)lambda函數(shù)是一種匿名函數(shù),可接受任意數(shù)量的參數(shù),但只能有一個(gè)表達(dá)式。定義lambda函數(shù)的一般格式為:lambda參數(shù)表:表達(dá)式功能:執(zhí)行表達(dá)式并返回結(jié)果。>>>p=lambdax,y:x+y>>>print(p(4,6))105.2.5pass語句在Python中,def語句、if語句、for語句和while循環(huán)語句必須有一個(gè)語句體,即非空縮進(jìn)代碼塊。如果遺漏了代碼塊,則解析程序時(shí)會(huì)發(fā)生語法錯(cuò)誤。在有些情況下,塊中的代碼實(shí)際上不需要做任何事情,這時(shí)仍然需要在語句體中添加代碼。出于這個(gè)原因,Python提供了pass語句,它不執(zhí)行任何操作,但是pass語句仍然是一個(gè)有效的語句。例如:ifn%2==0:passelse:print(n)在編寫函數(shù)時(shí),當(dāng)代碼體還沒有實(shí)現(xiàn)時(shí),可以用pass語句做代碼體。5.3變量的作用域使用函數(shù)涉及的一個(gè)重要問題是變量的作用域。變量的作用域是指變量在程序的哪些地方可以訪問。在語句中如果使用在該位置無效的變量,運(yùn)行時(shí)將會(huì)產(chǎn)生錯(cuò)誤。5.3變量的作用域例5.10在程序中使用函數(shù)中聲明的變量。defcalRectangle(w,h):
area=w*hreturnareaprint("Rectanglearea=",calRectangle(2,3))print(area)5.3.1局部變量在一個(gè)函數(shù)內(nèi)部使用的變量是內(nèi)部變量,它只在本函數(shù)范圍內(nèi)有效,也就是說只有在本函數(shù)內(nèi)才能使用它們,在此函數(shù)之外是不能使用這些變量的。這稱為局部變量。5.3.1局部變量在程序中添加一條賦值語句area=0,運(yùn)行時(shí)就不會(huì)出現(xiàn)錯(cuò)誤了。程序中使用的各個(gè)變量的作用域如圖所示。形式參數(shù)也是局部變量。例如形參w和h也只在函數(shù)中有效。5.3.1局部變量不同作用域中可以使用相同名字的變量,它們代表不同的對象,互不干擾。例如,在主流程作用域中使用的area和在calRectangle函數(shù)中使用的area變量是同名變量。print(area)語句使用的area的值為0,returnarea語句使用的area值為6,這兩個(gè)area是不同的變量。這表明我們在設(shè)計(jì)函數(shù)時(shí)對變量的命名可以是任意的,不會(huì)對其他程序產(chǎn)生影響。同樣,在調(diào)用函數(shù)時(shí),也不需要考慮函數(shù)中使用了哪些變量名。5.3.2全局變量在函數(shù)外面聲明的變量稱為全局變量,程序中的任何函數(shù)或代碼都可以讀取全局變量。然而,在函數(shù)中給全局變量賦值時(shí)需要特別小心。5.3.2全局變量例5.11在函數(shù)中使用程序中聲明的變量。defsay_hello():print('hello',name+'!')defchange_name(new_name):name=new_nameprint("functionname:",name) name="wangming"say_hello()change_name("wangmingli")print(name)程序運(yùn)行結(jié)果為hellowangming!functionname:wangmingliwangming5.3.2全局變量在函數(shù)內(nèi)使用與全局變量同名變量時(shí),僅做讀取操作時(shí)所操作的變量是全局變量,做賦值操作時(shí)所操作的變量是函數(shù)新創(chuàng)建的局部變量5.3.2全局變量在函數(shù)中,如果想訪問并且修改全局變量,必須使用global對變量作說明,說明使用的變量是函數(shù)外部已經(jīng)創(chuàng)建的全局變量。5.3.2全局變量例5.11在函數(shù)中使用程序中聲明的變量。defsay_hello():print('hello',name+'!')defchange_name(new_name):globalnamename=new_nameprint("functionname:",name) name="wangming"say_hello()change_name("wangmingli")print(name)程序運(yùn)行結(jié)果為hellowangming!functionname:wangmingliwangmingli5.4Python模塊在Python中,可以將一組相關(guān)的函數(shù)、數(shù)據(jù)放在一個(gè)以.py作擴(kuò)展名的Python文件中,這種文件稱為模塊。Python模塊為函數(shù)和數(shù)據(jù)創(chuàng)建了一個(gè)以模塊名稱命名的作用域。利用模塊可以定義變量、函數(shù)和類,模塊里也可以包含可執(zhí)行的代碼。模塊定義好后,需要先引入模塊后才能使用模塊中的變量、函數(shù)和類等。5.4.1引入模塊(1)使用import語句來引入模塊,語法為import模塊1[as名稱1][,模塊2[as名稱2]][,...]解釋器遇到import語句,如果模塊位于當(dāng)前的搜索路徑,該模塊就會(huì)被自動(dòng)導(dǎo)入。如果使用as關(guān)鍵字,可以為模塊起另一個(gè)名字。調(diào)用模塊中函數(shù)時(shí),格式為:模塊名.函數(shù)名在調(diào)用模塊中的函數(shù)時(shí),之所以要加上模塊名,是因?yàn)樵诙鄠€(gè)模塊中,可能存在名稱相同的函數(shù),如果只通過函數(shù)名來調(diào)用,解釋器無法知道到底要調(diào)用哪個(gè)函數(shù)。5.4.1引入模塊Python提供的標(biāo)準(zhǔn)庫和第三方庫也是模塊,在調(diào)用庫中的函數(shù)時(shí)也需要先使用import語句引入。庫是具有相關(guān)功能的模塊的集合。標(biāo)準(zhǔn)庫是安裝Python時(shí)那些自帶的模塊,第三方庫是由其他的第三方機(jī)構(gòu)發(fā)布的具有特定功能的模塊。例如,Python將很多數(shù)學(xué)函數(shù)放在math標(biāo)準(zhǔn)庫中。與調(diào)用內(nèi)置函數(shù)pow()方法不同,使用math中的函數(shù)需要先用import語句引入。5.4.1引入模塊
5.4.1引入模塊例5.12使用math中的sqrt函數(shù),求解一元二次方程。importmatha=float(input("pleaseinputa:"))b=float(input("pleaseinputb:"))c=float(input("pleaseinputc:"))deta=b**2-4*a*cifdeta>=0:print("x1=",(-b+math.sqrt(deta))/2/a)print("x2=",(-b-math.sqrt(deta))/2/a)else:print("noresult")5.4.1引入模塊例5.13自定義模塊geoArea(geoArea.py),包括常用幾何圖形面積計(jì)算函數(shù)。importmathdefcircle(r):return3.14159*r*rdeftriangle(a,b,c):p=(a+b+c)/2returnmath.sqrt(p*(p-a)*(p-b)*(p-c))defrectangle(w,h):returnw*hdeftrapezoid(top,bottom,height):return(top+bottom)*height/25.4.1引入模塊例5.14輸入三角形三條邊長,使用自定義模塊geoArea計(jì)算三角形面積。importgeoAreaasgaa,b,c=eval(input("pleaseinputtriangle'sthreeedge:"))area=ga.triangle(a,b,c)print("area=",area)將例5.14程序文件與geoArea.py模塊文件存儲(chǔ)在同一目錄下。運(yùn)行程序,在提示后輸入三條邊長,三個(gè)數(shù)值為逗號分隔,運(yùn)行結(jié)果為:pleaseinputtriangle'sthreeedge:3,4,5area=6.05.4.1引入模塊(2)使用from語句導(dǎo)入指定函數(shù)有時(shí)只需要用到模塊中的某個(gè)函數(shù),from語句可從模塊中導(dǎo)入指定的部分。格式如下:from模塊名import函數(shù)1[,函數(shù)2[,...函數(shù)n]]>>>frommathimportsqrt>>>sqrt(2)1.4142135623730951如果想把一個(gè)模塊的所有內(nèi)容全都導(dǎo)入,格式為:from模塊名import*5.4.1引入模塊(3)從包模塊導(dǎo)入指定函數(shù)當(dāng)模塊數(shù)量很多時(shí),可以將多個(gè)模塊組織成包的形式。簡單來說,包就是文件夾,但該文件夾下必須有一個(gè)__init__.py文件,最簡單的__init__.py文件可以是一個(gè)空文件。包可以包括子包。5.4.1引入模塊(3)從包模塊導(dǎo)入指定函數(shù)包中模塊的導(dǎo)入仍使用import、from...import語句,模塊命名使用“包名.模塊名”形式。例如,matplotlib是一個(gè)繪圖庫,在matplotlib文件夾下有一個(gè)pyplot.py模塊文件,模塊中的plot()函數(shù)是繪圖函數(shù)。導(dǎo)入plot()函數(shù)的方法為:frommatplot.pyplotimportplot導(dǎo)入pyplot模塊方法為:importmatplotlib.pyplotasplt5.4.2模塊化程序設(shè)計(jì)1.主(main)函數(shù)在其他語言中,使用main函數(shù)的作法非常普遍,像C、C++和Java中,還要求必須使用main函數(shù)。但是在Python中,任何一個(gè).py文件都是可解釋執(zhí)行的文件,可以作為整個(gè)程序的入口文件,這意味著程序的入口是靈活的,不必遵循任何約定。在Python程序中,使用main函數(shù)完全是可選的。如果使用了main函數(shù),根據(jù)約定,main函數(shù)被認(rèn)為是程序的起點(diǎn)。5.4.2模塊化程序設(shè)計(jì)例5.15使用main函數(shù)實(shí)現(xiàn)例5.14。#main.pyimportgeoAreaasgadefmain():a,b,c=eval(input("pleaseinputtriangle'sthreeedge:"))area=ga.triangle(a,b,c)print("area=",area)main()5.4.2模塊化程序設(shè)計(jì)2.模塊化程序設(shè)計(jì)人們在求解一個(gè)復(fù)雜問題時(shí),通常采用的是逐步分解、分而治之的方法,也就是把一個(gè)大問題分解成若干個(gè)比較容易求解的小問題,然后分別求解。設(shè)計(jì)一個(gè)復(fù)雜的程序時(shí),往往也把整個(gè)程序劃分為若干功能較為單一的程序模塊,然后分別予以實(shí)現(xiàn)。這種方法稱為模塊化程序設(shè)計(jì)方法。5.4.2模塊化程序設(shè)計(jì)2.模塊化程序設(shè)計(jì)具體實(shí)現(xiàn)上,就是把一個(gè)較大的程序分成若干個(gè)程序模塊,每個(gè)模塊包括一個(gè)或多個(gè)函數(shù),每個(gè)函數(shù)實(shí)現(xiàn)一個(gè)特定的功能。一個(gè)程序可以由一個(gè)主函數(shù)和若干個(gè)其他函數(shù)構(gòu)成。由主函數(shù)調(diào)用其他函數(shù),其他函數(shù)也可以相互調(diào)用。同一個(gè)函數(shù)可以被一個(gè)或多個(gè)函數(shù)調(diào)用任意多次。5.4.2模塊化程序設(shè)計(jì)3.模塊測試函數(shù)功能測試代碼可以放在模塊文件中,也可以放在單獨(dú)的測試文件中。如果放在模塊中,在其他程序?qū)肽K時(shí),測試代碼不應(yīng)該運(yùn)行。__name__變量(前后各有兩個(gè)下劃線)是Python的內(nèi)置變量,是每個(gè)Python模塊都有的屬性。__name__變量值取決于如何執(zhí)行模塊:直接執(zhí)行一個(gè)模塊時(shí),模塊的__name__變量等于'__main__';模塊被導(dǎo)入到其他程序時(shí),__name__變量等于模塊的名字。5.4.2模塊化程序設(shè)計(jì)例5.16應(yīng)用內(nèi)置變量__name__做模塊函數(shù)功能測試。自定義模塊circleArea(circleArea.py),包括圓面積計(jì)算函數(shù)和測試示例。defcircle(r):return3.14159*r*rprint("circleArea__name__:",__name__)if__name__=='__main__':print("circlearea:",circle(2))運(yùn)行circleArea.py,由于是直接執(zhí)行模塊,if條件為真,輸出結(jié)果為circleArea__name__:__main__circlearea:12.566365.4.2模塊化程序設(shè)計(jì)編寫Python程序(calCircleArea.py),應(yīng)用circleArea模塊的于面積函數(shù)計(jì)算圓面積。importcircleAreaascar=float(input("pleaseinputradius:"))print("area=",ca.circle(r))運(yùn)行calCircleArea.py,結(jié)果為circleArea__name__:circleAreapleaseinputradius:2area=12.566365.4.2模塊化程序設(shè)計(jì)由于circleArea模塊是被導(dǎo)入到calCircleArea,circleArea模塊的__name__變量取值為模塊名,circleArea模塊中的if條件為假,所以測試代碼不會(huì)執(zhí)行5.5Python標(biāo)準(zhǔn)庫模塊Python程序設(shè)計(jì)語言包括一些函數(shù)和類,例如print()、max()、sum()等函數(shù)和int、list等類。為了保證高效性和易用性,并不是所有的函數(shù)和類都是Python內(nèi)置的。除了核心函數(shù)和類以外,Python標(biāo)準(zhǔn)庫中還定義了數(shù)以千計(jì)的函數(shù)和類,它們都需要用模塊的方式進(jìn)行調(diào)用。標(biāo)準(zhǔn)模塊庫中包含的模塊支持如下應(yīng)用:網(wǎng)絡(luò)編程、Web應(yīng)用程序編程、圖形用戶界面開發(fā)、數(shù)據(jù)庫程序設(shè)計(jì)、數(shù)學(xué)函數(shù)、偽隨機(jī)數(shù)發(fā)生器等。5.5.1math模塊Python語言核心僅支持基本的數(shù)學(xué)運(yùn)算,如求絕對值abs()、冪運(yùn)算power()、四舍五入取整round()等,如果要使用其他的數(shù)學(xué)函數(shù)(例如平方根函數(shù))和三角函數(shù),則需要使用數(shù)學(xué)模塊math。數(shù)學(xué)模塊是包含數(shù)學(xué)常量和函數(shù)的庫,使用數(shù)學(xué)模塊中的函數(shù)或常量,必須先導(dǎo)入該模塊:importmath5.5.1math模塊常用數(shù)學(xué)函數(shù)和常量(部分)函數(shù)、常量說明示例sqrt(x)對x求開平方math.sqrt(2)的值為1.4142135623730951ceil(x)求大于或等于x的最小整數(shù)math.ceil(2.1)和math.ceil(2.7)的值都為3floor(x)小于或等于x的最大整數(shù)math.floor(2.1)和math.floor(2.7)的值都為2sin(x)sin(x)math.sin(math.pi/2)的值為1.0cos(x)cos(x)math.cos(math.pi)的值為-1.0log(x,base)logbase(x)math.log(4,2)的值為2.0pi3.141592653589793area=math.pi*3.0**2e2.718281828459045math.e**2的值為7.38905609893064955.5.1math模塊例5.17輸出0~2π間弧度為π/4倍數(shù)的正弦函數(shù)值。importmathforiinrange(0,9):sin=math.sin(math.pi/4*i)print(round(sin,4),end="")round()為內(nèi)置求整函數(shù),指定保留4位小數(shù),不指定時(shí)四舍五入取整程序輸出結(jié)果為:0.00.70711.00.70710.0-0.7071-1.0-0.7071-0.05.5.2random模塊不是所有程序的運(yùn)行結(jié)果都是確定的,例如一個(gè)擲硬幣的游戲,結(jié)果可能是正面,也可能是反面。雖然總體上出現(xiàn)正面和反面的比例大約為1:1,但是每一次的結(jié)果是隨機(jī)的。很多計(jì)算機(jī)仿真、游戲等程序都需要使用隨機(jī)數(shù)。各種編程語言生成的隨機(jī)數(shù)一般都是偽隨機(jī)數(shù),以一個(gè)真隨機(jī)數(shù)(種子)作為初始值,然后用一定的算法不停迭代產(chǎn)生偽隨機(jī)數(shù)。偽隨機(jī)數(shù)可以滿足需要隨機(jī)數(shù)的大多數(shù)應(yīng)用程序的需求。在Python中,random模塊提供了一組生成偽隨機(jī)數(shù)的函數(shù),在使用這些函數(shù)前,首先需要導(dǎo)入模塊:importrandom5.5.2random模塊1.初始化隨機(jī)數(shù)生成器random.seed(a=None)因?yàn)槊看芜\(yùn)行初始化語句的時(shí)間是完全隨機(jī)的,所以可以將其作為生成隨機(jī)數(shù)算法的初值(種子)。如果a被省略或?yàn)镹one,則使用當(dāng)前系統(tǒng)時(shí)間作種子。A也可以取int,float,str,bytes或bytearray等類型數(shù)值。5.5.2random模塊2.random.random()返回[0.0,1.0)范圍內(nèi)的一個(gè)隨機(jī)浮點(diǎn)數(shù)。例5.18生成10個(gè)0~1.0間的隨機(jī)數(shù)。importrandomrandom.seed()foriinrange(0,10):print(random.random(),end="")程序輸出結(jié)果為10個(gè)隨機(jī)數(shù),某次運(yùn)行輸出結(jié)果為:0.097639997763980250.6733827573983940.588
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 建筑構(gòu)造與識圖課程設(shè)計(jì)
- 支座課程設(shè)計(jì)摘要
- 能源開發(fā)與環(huán)境保護(hù)的平衡匯報(bào)
- 青島工學(xué)院《遙感地學(xué)分析》2023-2024學(xué)年第一學(xué)期期末試卷
- 幼兒園泥人特色課程設(shè)計(jì)
- 青島港灣職業(yè)技術(shù)學(xué)院《藥物化學(xué)及實(shí)驗(yàn)》2023-2024學(xué)年第一學(xué)期期末試卷
- 數(shù)控車床子課程設(shè)計(jì)
- 數(shù)電簡易課程設(shè)計(jì)
- 插畫臨摹課程設(shè)計(jì)教案
- 職場溝通技巧與禮儀規(guī)范
- 青海省西寧市2023-2024學(xué)年七年級上學(xué)期期末英語試題(含答案)
- 眼的解剖結(jié)構(gòu)與生理功能課件
- 道路工程監(jiān)理大綱
- 網(wǎng)絡(luò)服務(wù)器搭建、配置與管理-LinuxRHEL8CentOS8(第4版)-課后習(xí)題答案
- 外科病人圍手術(shù)期液體治療專家共識
- 國開本科《中國當(dāng)代文學(xué)專題》形考任務(wù)2試題及答案
- 土木工程試驗(yàn)與檢測考試題題庫
- 統(tǒng)部編版語文三年級上學(xué)期期末真題模擬試卷(含答案解析)
- DL-T 572-2021電力變壓器運(yùn)行規(guī)程-PDF解密
- RBA-6.0-培訓(xùn)教材課件
- 2024年廣西計(jì)算中心有限責(zé)任公司招聘筆試參考題庫附帶答案詳解
評論
0/150
提交評論