《Python語(yǔ)言》電子課件-第七章_第1頁(yè)
《Python語(yǔ)言》電子課件-第七章_第2頁(yè)
《Python語(yǔ)言》電子課件-第七章_第3頁(yè)
《Python語(yǔ)言》電子課件-第七章_第4頁(yè)
《Python語(yǔ)言》電子課件-第七章_第5頁(yè)
已閱讀5頁(yè),還剩39頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

11第7章

函數(shù)226.1字符串操作6.2正則表達(dá)式上節(jié)回顧337.1抽象與函數(shù)7.2創(chuàng)建函數(shù)7.3函數(shù)參數(shù)7.4變量的作用域7.5遞歸7.6函數(shù)修飾器7.7完成五子棋(封裝及重構(gòu))本章目錄44體系結(jié)構(gòu)7.1抽象與函數(shù)抽象(abstraction)是一種簡(jiǎn)化復(fù)雜的實(shí)際問(wèn)題的方法,它為實(shí)際問(wèn)題找到準(zhǔn)確的定義,并且可以恰當(dāng)?shù)慕忉寙?wèn)題。其中可能會(huì)忽略一些無(wú)關(guān)的細(xì)節(jié),以便更充分地注意與當(dāng)前問(wèn)題有關(guān)的方面。簡(jiǎn)單的說(shuō),就是將一種復(fù)雜的活動(dòng)、繁瑣的流程簡(jiǎn)化為一個(gè)具體的計(jì)算機(jī)能夠理解的操作。例如蘋(píng)果、香蕉、生梨、葡萄、桃子等,它們共同的特性就是水果。得出水果概念的過(guò)程,就是一個(gè)抽象的過(guò)程。57.1抽象與函數(shù)所謂函數(shù)是可重用的代碼段,其被允許起名字,然后通過(guò)調(diào)用該名字的方式,調(diào)用對(duì)應(yīng)代碼段(就是調(diào)用函數(shù))。類(lèi)似于其它語(yǔ)言,Python語(yǔ)言中采用函數(shù)實(shí)現(xiàn)各個(gè)功能模塊,且每個(gè)函數(shù)具有特定的功能。67.1抽象與函數(shù)函數(shù)具有以下特征:(1)Python語(yǔ)言函數(shù)是按照一定規(guī)則書(shū)寫(xiě)的能完成一定功能

的代碼段。(2)一個(gè)Python語(yǔ)言函數(shù)應(yīng)該能夠完成一個(gè)簡(jiǎn)單、明確和單一的功能,函數(shù)名應(yīng)該能夠明確表達(dá)函數(shù)的功能。這樣有助于提高代碼的可讀性和可重用性。如果不能夠給函數(shù)起一個(gè)明確、簡(jiǎn)練的函數(shù)名,那說(shuō)明該函數(shù)的功能不是單一的,函數(shù)實(shí)現(xiàn)了多種不同的功能,這個(gè)函數(shù)就可以被拆分為若干個(gè)小函數(shù)。77.1抽象與函數(shù)函數(shù)具有以下特征:(3)Python語(yǔ)言程序由若干個(gè)文件組成,一個(gè)文件作為一個(gè)功能模塊,完成一定功能。這樣不僅便于程序的開(kāi)發(fā)和管理,還能提高程序的重用性和開(kāi)發(fā)效率。(4)Python語(yǔ)言函數(shù)之間是平行的,相互獨(dú)立。函數(shù)是獨(dú)立的個(gè)體。函數(shù)雖然是平行的,但是函數(shù)之間可以相互調(diào)用。(5)如果函數(shù)內(nèi)沒(méi)有return語(yǔ)句,就會(huì)自動(dòng)返回None對(duì)象。(6)Python函數(shù)是引用調(diào)用,因此在函數(shù)內(nèi),對(duì)參數(shù)的改變會(huì)影響到原始對(duì)象。不過(guò)事實(shí)上只有可變對(duì)象會(huì)有影響,對(duì)不可變對(duì)象來(lái)說(shuō),它的行為類(lèi)似按值調(diào)用。87.2創(chuàng)建函數(shù)定義函數(shù)的方法:使用def關(guān)鍵字,然后接函數(shù)名,在其后的小括號(hào)中填上需要的參數(shù),函數(shù)參數(shù)是可選的(7-1中的arguments),該行要以冒號(hào)結(jié)尾。接下來(lái)是一塊代碼,它們就是函數(shù)體。需要注意縮進(jìn)處理。9def函數(shù)名(參數(shù)):

函數(shù)體上面函數(shù)定義中,第5行是函數(shù)頭,使用def關(guān)鍵字定義Function_name的函數(shù),小括號(hào)中就是要傳入的參數(shù)。以冒號(hào)結(jié)尾說(shuō)明函數(shù)體已經(jīng)開(kāi)始。函數(shù)內(nèi)容需要進(jìn)行縮進(jìn)處理。然后開(kāi)始編寫(xiě)函數(shù)體如第6、7行。關(guān)于函數(shù)調(diào)用:Python中的調(diào)用函數(shù)方法與其它高級(jí)語(yǔ)言一致,為函數(shù)名加上一對(duì)小括號(hào)(括號(hào)內(nèi)是函數(shù)參數(shù))。10defFunction_name([arguments]):

'''optionaldocumentationstring'''

Function_suite例7-1如何定義函數(shù)問(wèn)題分析:編寫(xiě)Helloworld函數(shù),其功能是打印字符串“Helloworld”。11Hello

World!運(yùn)行結(jié)果:例7-2庫(kù)函數(shù)和用戶(hù)自定義函數(shù)舉例1'''2例

7-2庫(kù)函數(shù)和用戶(hù)自定函數(shù)示例3使用用戶(hù)自定義函數(shù)輸出Helloworld!4'''5#!/usr/bin/python6#Filename:Helloworld.py7

8#HelloWorld:用戶(hù)自定義函數(shù),功能是輸出Helloworld!字符串9def

sayHello():10#調(diào)用內(nèi)建函數(shù)print,輸出Helloworld11print

'HelloWorld!'12

13sayHello()

#調(diào)用函數(shù)7.3函數(shù)參數(shù)所謂函數(shù)參數(shù),就是在函數(shù)聲明后的小括號(hào)中的變量。當(dāng)使用函數(shù)時(shí),在小括號(hào)中提供的值是實(shí)際參數(shù),或者稱(chēng)為參數(shù)。12問(wèn)題分析:定義PrintMin函數(shù),輸出兩個(gè)輸入?yún)?shù)para_a和para_b的較小值。131'''2例

7-3函數(shù)形參示例3使用用戶(hù)自定義函數(shù)輸出兩個(gè)數(shù)的較小值!4'''5#!/usr/bin/python6#Filename:PrintMin.py7

8#PrintMin:用戶(hù)自定義函數(shù),功能是輸出兩個(gè)數(shù)的較小值!9def

PrintMin(para_a,para_b):10#判斷參數(shù)大小11ifpara_a<para_b:12printpara_a,’isminimux’13else:14print

para_b,

'isminimux’15#調(diào)用內(nèi)建函數(shù)print,輸出較小值16PrintMin(2,7)#直接參數(shù)調(diào)用17a=618b=819PrintMin(a,b)

#以變量的形式提供參數(shù)2isminimux6isminimux運(yùn)行結(jié)果:例7-3函數(shù)形參舉例7.3.1函數(shù)參數(shù)類(lèi)型形參的參數(shù)類(lèi)型:必備參數(shù)命名參數(shù)缺省參數(shù)不定長(zhǎng)參數(shù)147.3.1函數(shù)參數(shù)類(lèi)型1、必備參數(shù)

必備參數(shù)需要按照參數(shù)聲明的順序如實(shí)傳入函數(shù)中,如果未傳入?yún)?shù),或者參數(shù)數(shù)量不對(duì)應(yīng),就會(huì)出現(xiàn)語(yǔ)法錯(cuò)誤。主要針對(duì)那些函數(shù)設(shè)計(jì)時(shí)就已經(jīng)清楚了函數(shù)的各個(gè)參數(shù)及功能已經(jīng)確定了。這樣就可以直接定義函數(shù)體。在實(shí)際開(kāi)發(fā)中,可能使用的很少,因?yàn)楹苌儆泄δ軈?shù)完全確定的情況。15問(wèn)題分析:定義PrintMin函數(shù),輸出兩個(gè)輸入?yún)?shù)para_a和para_b的較小值。161'''2例

7-4函數(shù)必備參數(shù)示例3使用用戶(hù)自定義函數(shù)說(shuō)明函數(shù)的必備參數(shù)4'''5#!/usr/bin/python6#Filename:NecPara.py7

8#PrintMin:用戶(hù)自定義函數(shù),功能是輸出兩個(gè)數(shù)的較小值!9def

PrintMin(para_a,para_b):10#判斷參數(shù)大小11ifpara_a<para_b:12printpara_a,’isminimux’13else:14print

para_b,

'isminimux’15#調(diào)用內(nèi)建函數(shù)print,輸出較小值16PrintMin(2)#傳入?yún)?shù)數(shù)量不對(duì)應(yīng)17PrintMin()

#未傳入?yún)?shù)Traceback(mostrecentcalllast):File"<stdin>",line1,in<module>TypeError:PrintMin()takesexactly2arguments(1given)Traceback(mostrecentcalllast):File"<stdin>",line1,in<module>TypeError:PrintMin()takesexactly2arguments(0given)運(yùn)行結(jié)果:例7-4函數(shù)必備參數(shù)舉例程序分析:參數(shù)傳入不同或者未傳入?yún)?shù),會(huì)直接報(bào)錯(cuò)。7.3.1函數(shù)參數(shù)類(lèi)型2、命名參數(shù)

基本用法和必備參數(shù)類(lèi)似,如果參數(shù)較多,無(wú)法具體對(duì)應(yīng)的寫(xiě)出參數(shù)的順序,可以使用命名參數(shù)的形式,按名稱(chēng)指定參數(shù)。避免了參數(shù)先后順序出錯(cuò),影響函數(shù)正確性的情況。17問(wèn)題分析:定義PrintMin函數(shù),輸出兩個(gè)輸入?yún)?shù)para_a和para_b的較小值。181'''2例

7-5函數(shù)命名參數(shù)示例3使用用戶(hù)自定義函數(shù)說(shuō)明函數(shù)的命名參數(shù)4'''5#!/usr/bin/python6#Filename:NamePara.py7

8#PrintMin:用戶(hù)自定義函數(shù),功能是輸出兩個(gè)數(shù)的較小值!9def

PrintMin(para_a,para_b):10#判斷參數(shù)大小11ifpara_a<para_b:12printpara_a,’isminimux’13else:14print

para_b,

'isminimux’15#調(diào)用內(nèi)建函數(shù)print,輸出較小值16PrintMin(para_b=2,para_a=3)#使用名稱(chēng)指定參數(shù)2isminimux運(yùn)行結(jié)果:例7-5函數(shù)命名參數(shù)舉例程序分析:可以通過(guò)命名參數(shù)的形式,進(jìn)行參數(shù)傳遞。7.3.1函數(shù)參數(shù)類(lèi)型3、缺省參數(shù)

調(diào)用函數(shù)時(shí),缺省參數(shù)的值如果沒(méi)有傳入,就會(huì)使用默認(rèn)值。這種參數(shù)適用于那種在函數(shù)聲明中某些可以確定值的參數(shù),如果不添加該參數(shù)直接使用,會(huì)調(diào)用缺省參數(shù),也能正確的使用函數(shù)。并且這種缺省參數(shù),在某些函數(shù)具有多個(gè)參數(shù)的使用時(shí),可以通過(guò)不輸入缺省參數(shù)來(lái)達(dá)到控制函數(shù)功能的效果,比如定義參數(shù)缺省值為None,通過(guò)判斷參數(shù)缺省值達(dá)到控制程序效果。19問(wèn)題分析:定義PrintMin函數(shù),輸出兩個(gè)輸入?yún)?shù)para_a和para_b的較小值。201'''2例

7-6函數(shù)缺省參數(shù)示例3使用用戶(hù)自定義函數(shù)說(shuō)明函數(shù)的缺省參數(shù)4'''5#!/usr/bin/python6#Filename:NamePara.py7

8#PrintMin:用戶(hù)自定義函數(shù),功能是輸出兩個(gè)數(shù)的較小值!9def

PrintMin(para_a,para_b=2):10#判斷參數(shù)大小11ifpara_a<para_b:12printpara_a,’isminimux’13else:14print

para_b,

'isminimux’15#調(diào)用內(nèi)建函數(shù)print,輸出較小值16PrintMin(3,1)#未使用缺省參數(shù)17PrintMin(3)#使用缺省參數(shù)1isminimux2isminimux運(yùn)行結(jié)果:例7-6函數(shù)缺省參數(shù)舉例程序分析:由于有缺省參數(shù),在未對(duì)para_b賦值時(shí),將使用初始缺省值2,所以輸出結(jié)果如上。7.3.1函數(shù)參數(shù)類(lèi)型4、不定長(zhǎng)參數(shù)

有時(shí)一個(gè)函數(shù)可能需要比聲明時(shí)更多的參數(shù)。所以這時(shí)要使用不定長(zhǎng)參數(shù)。使用方法是在變量名前加上星號(hào)(*),這樣它就會(huì)存放所有未命名的變量參數(shù)。當(dāng)然也可以不多傳參數(shù)。這種參數(shù)主要適用于無(wú)法確定函數(shù)參數(shù)個(gè)數(shù)情況。此時(shí)使用列表的形式,進(jìn)行參數(shù)的附加,達(dá)到不必修改函數(shù)的參數(shù)定義,就可以傳入多個(gè)參數(shù)的目的。21問(wèn)題分析:定義PrintPara函數(shù),打印輸出所有傳入的參數(shù)。221'''2例

7-7函數(shù)不定長(zhǎng)參數(shù)示例3使用用戶(hù)自定義函數(shù)說(shuō)明函數(shù)的不定長(zhǎng)數(shù)4'''5#!/usr/bin/python6#Filename:UnPara.py7

8#UnPara:用戶(hù)自定義函數(shù),打印傳入?yún)?shù)9def

PrintPara(para_a,*para_b):10#打印傳入?yún)?shù)11printpara_a12fortempinpara_b:#遍歷參數(shù)para_b獲取各個(gè)數(shù)值13printtemp14

15#調(diào)用內(nèi)建函數(shù)PrintPara16PrintPara(2);#使用單個(gè)參數(shù)17PrintPara(4,5,6);#使用多個(gè)參數(shù)運(yùn)行結(jié)果:例7-7函數(shù)不定長(zhǎng)參數(shù)舉例程序分析:在函數(shù)參數(shù)聲明時(shí)使用*para_b將接受之后的多個(gè)參數(shù),來(lái)實(shí)現(xiàn)不定長(zhǎng)參數(shù)調(diào)用。2456例7-8函數(shù)改變參數(shù)舉例問(wèn)題分析:定義PrintPara函數(shù),打印輸出所有傳入的參數(shù)。231'''2例

7-8函數(shù)改變參數(shù)示例3使用用戶(hù)自定義函數(shù)說(shuō)明函數(shù)改變參數(shù)的影響4'''5#!/usr/bin/python6#Filename:ChangeNumber.py7

8#ChangeNumber:用戶(hù)自定義函數(shù),嘗試改變參數(shù)9def

ChangeNumber(number):10#修改參數(shù)值11number=112print“number:”,number13#調(diào)用函數(shù)14number=215ChangeNumber(number)16print“input_number:”number運(yùn)行結(jié)果:7.3.2修改參數(shù)程序分析:在函數(shù)ChangeNumber內(nèi)修改了參數(shù)number,但是它沒(méi)有影響到test_number變量。這是因?yàn)閰?shù)存儲(chǔ)在局部作用域內(nèi),函數(shù)內(nèi)與函數(shù)外具有相同名稱(chēng)的變量沒(méi)有任何關(guān)系,是兩個(gè)不同的變量。number:1input_number:2241'''2例

7-9函數(shù)改變列表參數(shù)示例3使用用戶(hù)自定義函數(shù)說(shuō)明函數(shù)改變列表參數(shù)的影響4'''5#!/usr/bin/python6#Filename:ChangeNumberList.py7

8#ChangeNumberList:用戶(hù)自定義函數(shù),嘗試改變列表參數(shù)9def

ChangeNumberList(number):10#修改參數(shù)值11number[0]=112print“number:”,number13#調(diào)用函數(shù)14number=[2,2]15ChangeNumberList(number)16print“input_number:”number運(yùn)行結(jié)果:例7-9函數(shù)改變參數(shù)舉例程序分析:本例中變量number所綁定的列表的確改變了。其實(shí)當(dāng)兩個(gè)變量同時(shí)引用一個(gè)列表的時(shí)候,它們的確引用的是同一個(gè)列表,而不是副本。number:[1,2]input_number:[1,2]7.3.2修改參數(shù)這種現(xiàn)象其實(shí)就是參數(shù)的值傳遞和引用傳遞。所謂值傳遞就是當(dāng)方法被調(diào)用時(shí),實(shí)際參數(shù)把它的值傳遞給對(duì)應(yīng)的形式參數(shù),形式參數(shù)只是用實(shí)際參數(shù)的值初始化自己的存儲(chǔ)單元內(nèi)容,是兩個(gè)不同的存儲(chǔ)單元,所以方法執(zhí)行中形式參數(shù)值的改變不影響實(shí)際參數(shù)的值。所謂引用傳遞,即方法調(diào)用時(shí),實(shí)際參數(shù)是對(duì)象(或數(shù)組),這時(shí)實(shí)際參數(shù)與形式參數(shù)指向同一個(gè)地址,在方法執(zhí)行中,對(duì)形式參數(shù)的操作實(shí)際上就是對(duì)實(shí)際參數(shù)的操作,這個(gè)結(jié)果在方法結(jié)束后被保留了下來(lái),所以方法執(zhí)行中形式參數(shù)的改變將會(huì)影響實(shí)際參數(shù)。257.3.2修改參數(shù)如果函數(shù)收到的是一個(gè)可變對(duì)象(比如字典或者列表)的引用,就能修改對(duì)象的原始值(相當(dāng)于通過(guò)“傳引用”來(lái)傳遞對(duì)象)。如果函數(shù)收到的是一個(gè)不可變對(duì)象(比如數(shù)字、字符或者元組)的引用,就不能直接修改原始對(duì)象(相當(dāng)于通過(guò)“傳值”來(lái)傳遞對(duì)象)267.4變量的作用域一個(gè)程序的所有的變量并不是在哪個(gè)位置都可以訪問(wèn),訪問(wèn)權(quán)限決定于這個(gè)變量是在哪里賦值。變量的作用域決定了在哪一部分程序可以訪問(wèn)哪些特定變量。兩種最基本的變量作用域如下:全局變量:定義在函數(shù)外的擁有全局作用域,全局變量可以在整個(gè)程序范圍內(nèi),被自由訪問(wèn)。局部變量:定義在函數(shù)內(nèi)部變量,擁有局部作用域(上一節(jié)提到的作用域問(wèn)題),因此局部變量只能在其被聲明的函數(shù)內(nèi)部調(diào)用。27問(wèn)題分析:定義Add函數(shù),完成參數(shù)number_a和number_b的求和運(yùn)算。281'''2例

7-10函數(shù)作用域示例3使用用戶(hù)自定義函數(shù)說(shuō)明局部變量和全局變量的影響4'''5#!/usr/bin/python6#Filename:Variable.py7number=0;#全局變量8#Add:用戶(hù)自定義函數(shù)--求和9def

Add(number_a,number_b):10#計(jì)算兩個(gè)數(shù)的和11number=number_a+number_b;#number這里是局部變量12print“Inthefunctionnumber:”,number13#調(diào)用函數(shù)14Add(1,2)15print“Outthefunctionnumber:”,number運(yùn)行結(jié)果:例7-10函數(shù)作用域舉例程序分析:本例中首先定義了全局變量number賦值為0,然后在Add函數(shù)中定義了另一個(gè)number變量,是局部變量,這樣在函數(shù)中對(duì)number的修改并未影響到全局變量的number。這就是因?yàn)樗鼈冏饔糜虿煌?。如果想要為一個(gè)定義在函數(shù)外的變量賦值,那么就得告訴Python該變量名不是局部的,而是全局的。通常使用global語(yǔ)句完成這一功能。Inthefunctionnumber:3Outthefunctionnumber:0問(wèn)題分析:定義Add函數(shù),完成參數(shù)number_a和number_b的求和運(yùn)算,并使用global關(guān)鍵字更新全局變量值。291'''2例

7-11函數(shù)global語(yǔ)句使用示例3使用用戶(hù)自定義函數(shù)說(shuō)明global的使用方法4'''5#!/usr/bin/python6#Filename:GlobalVariable.py7number=0;#全局變量8#Add:用戶(hù)自定義函數(shù)--求和9def

Add(number_a,number_b):10#計(jì)算兩個(gè)數(shù)的和11globalnumber12number=number_a+number_b;#number這里是局部變量13print“Inthefunctionnumber:”,number14#調(diào)用函數(shù)15Add(1,2)16print“Outthefunctionnumber:”,number運(yùn)行結(jié)果:例7-11函數(shù)global語(yǔ)句使用舉例程序分析:本例中首先定義了全局變量number賦值為0,然后在Add函數(shù)中定義了另一個(gè)number變量,但是此處使用了global語(yǔ)句。這個(gè)number是全局的。當(dāng)函數(shù)內(nèi)number發(fā)生變化時(shí),函數(shù)外的也跟著變了。Inthefunctionnumber:3Outthefunctionnumber:37.5遞歸程序調(diào)用自身的編程技巧稱(chēng)為遞歸(recursion)。遞歸做為一種算法在程序設(shè)計(jì)語(yǔ)言中廣泛應(yīng)用,它通常把一個(gè)大型復(fù)雜的問(wèn)題,轉(zhuǎn)化為一個(gè)與原問(wèn)題相似的,且規(guī)模較小的問(wèn)題來(lái)求解。遞歸策略只需少量的程序就可描述出解題過(guò)程所需要的多次重復(fù)計(jì)算,大大地減少了程序的代碼量。通常的遞歸函數(shù)包含:當(dāng)函數(shù)直接結(jié)束時(shí)有基本的返回值。遞歸調(diào)用函數(shù)自身:包括一個(gè)或多個(gè)對(duì)自身函數(shù)的調(diào)用。30問(wèn)題分析:設(shè)計(jì)函數(shù)Factorial計(jì)算i的階乘,用局部靜態(tài)變量result記錄i的階乘,當(dāng)調(diào)用Factorial(10)時(shí),result*=i,采用for循環(huán),循環(huán)調(diào)用從而計(jì)算出1、2、3、4、…、n的階乘。311'''2例

7-12函數(shù)階乘循環(huán)實(shí)現(xiàn)使用示例3使用用戶(hù)自定義循環(huán)函數(shù)實(shí)現(xiàn)階乘的方法4'''5#!/usr/bin/python6#Filename:Factorial.py7#n階乘的定義:n*(n-1)*(n-2)*……*18#Factorial:用戶(hù)自定義函數(shù)—階乘計(jì)算9def

Factorial(number_a):10#計(jì)算數(shù)number_a的階乘11result=number_a12foriinrange(1,number_a):13result*=i14returnresult15#調(diào)用函數(shù)16printFactorial(10)運(yùn)行結(jié)果:例7-12函數(shù)階乘循環(huán)實(shí)現(xiàn)使用舉例3628800問(wèn)題分析:設(shè)計(jì)函數(shù)Recursion計(jì)算i的階乘,用局部靜態(tài)變量result記錄i的階乘,當(dāng)調(diào)用Recursion(10)時(shí),實(shí)際返回10*Recursion(9),采用遞歸調(diào)用,從而計(jì)算出1、2、3、4、…、n的階乘。321'''2例

7-13函數(shù)遞歸使用示例3使用用戶(hù)自定義階乘函數(shù)說(shuō)明遞歸的使用方法4'''5#!/usr/bin/python6#Filename:Recursion.py7#n階乘的定義:n*(n-1)*(n-2)*……*18#Recursion:用戶(hù)自定義函數(shù)—階乘計(jì)算9def

Recursion(number_a):10#計(jì)算數(shù)number_a的階乘11ifnumber_a==1:12return113else:14returnnumber_a*Recursion(number_a-1)15#調(diào)用函數(shù)16printRecursion(10)運(yùn)行結(jié)果:例7-13函數(shù)遞歸使用舉例36288007.6函數(shù)修飾器本節(jié)將介紹一種Python為函數(shù)設(shè)計(jì)的高級(jí)語(yǔ)法——修飾器。使用修飾器的目的是,對(duì)已有的函數(shù)添加一些小功能,卻又不希望對(duì)函數(shù)內(nèi)容有太多剛性的修改。函數(shù)修飾器以透明,動(dòng)態(tài)為原則,可以靈活的為已有的函數(shù)添加一些額外的功能。Python的函數(shù)修飾器充分借鑒了函數(shù)式編程中的技巧:將需要添加功能的函數(shù)像普通對(duì)象一樣作為參數(shù)傳入修飾器中;將函數(shù)作為修飾器的返回值返回。33問(wèn)題分析:現(xiàn)在已經(jīng)實(shí)現(xiàn)了若干函數(shù),這些函數(shù)的功能都是按照相應(yīng)規(guī)則返回一段字符串。現(xiàn)在想為這些函數(shù)的所有輸出字符串前添加一個(gè)類(lèi)似“水印”的“HelloWorld_”前綴。341'''2例

7-14函數(shù)修飾器使用示例3使用用戶(hù)自定義函數(shù)說(shuō)明修飾器的使用方法4'''5#!/usr/bin/python6#Filename:Deco.py7defdeco(func):8defwrappedFunc():9return"HelloWorld_"+func()10returnwrappedFunc11

12@deco13deff():14return"Iamf"運(yùn)行結(jié)果:例7-14函數(shù)修飾器使用舉例HelloWorld_IamfIamg15defg():16return"Iamg"17

18printf()19printg()7.6函數(shù)修飾器在程序中如果有函數(shù)需要修飾器修飾,只需在函數(shù)定義前使用@加修飾器名的語(yǔ)法即可使用這個(gè)修飾器。在較老版本的Python中,使用修飾器的語(yǔ)法更接近修飾器的本質(zhì)。對(duì)于下列修飾器的使用:所以說(shuō),修飾器的本質(zhì)是Python解釋器在發(fā)現(xiàn)函數(shù)調(diào)用修飾器后,將其傳入修飾器中,然后用返回的函數(shù)對(duì)象將自身完全替換。351@deco2deff():3pass等同于f=deco(f)7.6函數(shù)修飾器一個(gè)函數(shù)可以被多個(gè)修飾器嵌套修飾,以完成更加復(fù)雜的功能。有時(shí)候,為了使得函數(shù)修飾器更加靈活,還可以為函數(shù)修飾器添加參數(shù)。帶參的函數(shù)修飾器,需要在修飾器函數(shù)內(nèi)再添加一層內(nèi)嵌函數(shù),作為對(duì)修飾器傳入?yún)?shù)的處理。361@deco32@deco23@deco14deff():5pass等同于f=deco3(deco2(deco1(f)))問(wèn)題分析:現(xiàn)在已經(jīng)實(shí)現(xiàn)了若干函數(shù),這些函數(shù)的功能都是按照相應(yīng)規(guī)則返回一段字符串。現(xiàn)在想為這些函數(shù)的所有輸出字符串前添加一個(gè)類(lèi)似“水印”的前綴,具體內(nèi)容由參數(shù)決定。371'''2例

7-15函數(shù)帶參數(shù)的修飾器使用示例3使用用戶(hù)自定義函數(shù)說(shuō)明帶參數(shù)修飾器的使用方法4'''5#!/usr/bin/python6#Filename:Deco_Para.py7defdeco(prefix):8def_deco(func):9defwrappedFunc():10returnprefix+func()11returnwrappedFunc12return_deco13

14@deco("second_")運(yùn)行結(jié)果:例7-15帶參函數(shù)修飾器使用舉例second_first_Iamf15@deco("first_")16deff():17return"Iamf"18

19printf()7.7完成五子棋(封裝及重構(gòu))之前的章節(jié)已經(jīng)通過(guò)前面幾章所學(xué)的知識(shí)實(shí)現(xiàn)了五子棋,下面需要用函數(shù)的知識(shí)來(lái)封裝之前的五子棋游戲。記錄狀態(tài)函數(shù)根據(jù)前幾章的代碼可以將記錄狀態(tài)封裝為一個(gè)函數(shù):381defRecord(qipan):2who=True3whileTrue:4t=raw_input('請(qǐng)輸入棋子位置(x,y),現(xiàn)在由'+('〇'ifwhoelse'乂')+'方下子:')5t=t.split(',')6iflen(t)==2:7x=int(t[0])8y=int(t[1])9ifqipan[x][y]==0:10qipan[x][y]=1ifwhoelse211who=notwho12else:13print"當(dāng)前位置已有棋子,請(qǐng)重新下子"14else:15print"輸入位置有誤,請(qǐng)輸入要下的位置,如1,1"7.7完成五子棋(封裝及重構(gòu))顯示棋盤(pán)函數(shù)對(duì)該功能進(jìn)行封裝,提供3個(gè)參數(shù)分別是(棋盤(pán),最大行,最大列),詳細(xì)代碼如下391#coding:utf-82maxX=103maxY=104Qipan=[[0,0,0,0,1,0,0,2,0,0],5[0,1,2,1,1,0,2,0,0,0],6[0,0,0,0,1,1,0,2,0,0],7[0,0,0,0,2,0,0,1,0,0],8[0,0,0,1,1,1,2,0,0,0],9[0,0,0,2,0,0,0,2,0,0],10[0,0,1,2,0,2,2,0,1,0],11[0,0,0,2,0,0,0,1,0,0],12[0,0,0,0,0,0,1,1,0,0],13[0,0,0,0,0,0,0,0,0,0],]14defPrintqp(qipan,maxx,maxy):15print('〇一二三四五六七八九')16foriinrange(maxx):17printi,18forjinrange(maxy):19ifqipan[i][j]==0:20print'十',21elifqipan[i][j]==1:22print'〇',23elifqipan[i][j]==2:24print'乂',25print'\n'>>>Printqp(Qipan,maxX,maxY)7.7完成五子棋(封裝及重構(gòu))棋局判勝函數(shù)由此功能可以設(shè)計(jì)一個(gè)函數(shù)isWin參數(shù)分別為(棋盤(pán)的二維數(shù)組,棋子橫坐標(biāo),縱坐標(biāo)),返回值為是否贏了。是為true,否為false。401defisWin(qipan,xPoint,yPoint):#判贏2globalmaxx,maxy3flag=False4t=qipan[xPoint][yPoint]5x=xPoint6y=yPoint7#橫向8count=09x=xPoint10y=yPoint11while(x>=0andt==qipan[x][y]):12count+=113x-=114x=xPoint15y=yPoint16while(x<maxxandt==qipan[x][y]):17count+=118x+=119if(count>5):returnTrue20#縱向

21count=022x=xPoint23y=yPoint24while(y>=0andt==qipan[x][y]):25count+=126y-=127y=yPoint28while(y<maxyandt==qipan[x][y]):29count+=130y+=131if(count>5):returnTrue7.7完成五子棋(封裝及重構(gòu))棋局判勝函數(shù)4132#/33count=034x=xPoint35y=yPoint36while(x<maxxandy>=0andt==qipan[x][y]):37count+=138x+=139y-=140x=xPoint41y=yPoint42while(x>=0andy<maxyandt==qipan[x][y]):43count+=144x-=145y+=146if(count>5):returnTrue47#\48count=049

x=xPoin50y=yPoint51while(x>=0andy>=0andt==qipan[x][y]):52count+=153x-=154y-=155x=xPoint56y=yPoint57while(x<maxxandy<m

溫馨提示

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

評(píng)論

0/150

提交評(píng)論