Python程序設(shè)計教程第4章課件_第1頁
Python程序設(shè)計教程第4章課件_第2頁
Python程序設(shè)計教程第4章課件_第3頁
Python程序設(shè)計教程第4章課件_第4頁
Python程序設(shè)計教程第4章課件_第5頁
已閱讀5頁,還剩105頁未讀 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

第4章Python函數(shù)課程描述函數(shù)(function)由若干條語句組成,用于實現(xiàn)特定的功能。函數(shù)包含函數(shù)名、若干參數(shù)和返回值。一旦定義了函數(shù),就可以在程序中需要實現(xiàn)該功能的位置調(diào)用該函數(shù),給程序員共享代碼帶來了很大方便。在Python語言中,除了提供豐富的系統(tǒng)函數(shù)(本書前面已經(jīng)介紹了一下常用的系統(tǒng)函數(shù))外,還允許用戶創(chuàng)建和使用自定義函數(shù)。本章知識點聲明函數(shù)在函數(shù)中傳遞參數(shù)變量的作用域Python內(nèi)置函數(shù)調(diào)用函數(shù)方法調(diào)用函數(shù)的返回值全局變量和局部變量函數(shù)式編程4.1聲明和調(diào)用函數(shù)4.1.1聲明函數(shù)4.1.2調(diào)用函數(shù)4.1.1聲明函數(shù)可以使用def關(guān)鍵字來創(chuàng)建Python自定義函數(shù),其基本語法結(jié)構(gòu)如下:def

函數(shù)名(參數(shù)列表):

函數(shù)體參數(shù)列表可以為空,即沒有參數(shù);也可以包含多個參數(shù),參數(shù)之間使用逗號(,)分隔。函數(shù)體可以是一條語句,也可以由一組語句組成?!纠?-1】

創(chuàng)建一個非常簡單的函數(shù)PrintWelcome,它的功能是打印字符串“歡迎使用Python”,代碼如下:def

PrintWelcome(): print("歡迎使用Python");【例4-2】定義函數(shù)PrintString(),通過參數(shù)決定要打印的內(nèi)容。defPrintString(str): print(str);變量str是函數(shù)的參數(shù)。在函數(shù)體中,參數(shù)可以像其他變量一樣被使用??梢栽诤瘮?shù)中定義多個參數(shù),參數(shù)之間使用逗號分隔。【例4-3】定義一個函數(shù)sum(),用于計算并打印兩個參數(shù)之和。函數(shù)sum()包含兩個參數(shù)。參數(shù)num1和num2,代碼如下:defsum(num1,num2): print(num1+num2);4.1.2調(diào)用函數(shù)可以直接使用函數(shù)名來調(diào)用函數(shù),無論是系統(tǒng)函數(shù)還是自定義函數(shù),調(diào)用函數(shù)的方法都是一致的。【例4-4】print(len("student"));程序得到運行結(jié)果為7。【例4-5】調(diào)用【例4-3】中聲明的函數(shù)sum(),計算100+200之和,代碼如下:sum(100,200);程序得到運行結(jié)果為300。4.2參數(shù)和返回值4.2.1在函數(shù)中傳遞參數(shù)4.2.2函數(shù)的返回值4.2.1在函數(shù)中傳遞參數(shù)1.普通參數(shù)Python實行按值傳遞參數(shù)。值傳遞指調(diào)用函數(shù)時將常量或變量的值(通常稱其為實參)傳遞給函數(shù)的參數(shù)(通常稱其為形參)。值傳遞的特點是實參與形參分別存儲在各自的內(nèi)存空間中,是兩個不相關(guān)的獨立變量。因此,在函數(shù)內(nèi)部改變形參的值時,實參的值一般是不會改變的?!纠?-5】介紹的程序都屬于按值傳遞參數(shù)的情況?!纠?-6】在函數(shù)中按值傳遞參數(shù)的例子deffunc(num): num+=1;a=10func(a);print(a);【例4-7】分別打印形參和實參的地址deffunc(num):print"addressofnum:",id(num)a=10func(a);print"addressofa:",id(a);運行結(jié)果如下:addressofnum:37844516addressofa:378445162.列表和字典參數(shù)【例4-8】使用列表作為函數(shù)參數(shù)的例子。defsum(list): total=0; forxinrange(len(list)): printstr(list[x])+"+"; total+=list[x]; print"="+str(total);list=[10,20,30,40]sum(list);運行結(jié)果10+20+30+40+=100【例4-9】使用字典作為函數(shù)參數(shù)的例子def

print_dict(dict): for(k,v)indict.items(): print"dict[%s]="%k,vdict={"a":"apple","b":"banana","g":"grape","o":"orange"}print_dict(dict);運行結(jié)果dict[o]=orangedict[g]=grapedict[a]=appledict[b]=banana【例4-10】在函數(shù)中修改列表參數(shù)的例子defswap(list):temp=list[0]list[0]=list[1]list[1]=templist=[1,2]print(list)swap(list)print(list)運行結(jié)果[10,20][20,10]【例4-11】在函數(shù)中修改字典參數(shù)的例子defchangeA(dict):dict['a']=1

d={'a':10,'b':20,'c':30}changeA(d)print(d)運行結(jié)果{'a':1,'c':30,'b':20}3.參數(shù)的默認(rèn)值在Python中,可以為函數(shù)的參數(shù)設(shè)置默認(rèn)值??梢栽诙x函數(shù)時,直接在參數(shù)后面使用“=”為其設(shè)置默認(rèn)值。在調(diào)用函數(shù)時可以不指定擁有默認(rèn)值的參數(shù)的值,此時在函數(shù)體中以默認(rèn)值作為該參數(shù)【例4-12】設(shè)置參數(shù)默認(rèn)值的例子defsay(message,times=1):print(message*times)say('hello')say('Python',3)函數(shù)say()有2個參數(shù):message和times。其中times的默認(rèn)值為1。運行結(jié)果如下:helloPythonPythonPython【例4-13】deffunc1(a=1,b,c=10): d=a+b*c;func(10,20,30)【例4-13】的運行結(jié)果4.可變長參數(shù)Python還支持可變長度的參數(shù)列表。可變長參數(shù)可以是元祖或字典。當(dāng)參數(shù)以*開頭時,表示可變長參數(shù)將被視為一個元祖,格式如下:def

func(*t):在func()函數(shù)中t被視為一個元祖,使用t[index]獲取每一個可變長參數(shù)??梢允褂萌我舛鄠€實參調(diào)用func()函數(shù),例如:func(1,2,3,4)【例4-14】以元祖為可變長參數(shù)的實例deffunc1(*t):print("可變長參數(shù)數(shù)量如下:")print(len(t))print("依次為:")forxinrange(len(t)):print(t[x]);func1(1,2,3,4);運行結(jié)果如下:可變長參數(shù)數(shù)量如下:4依次為:1234【例4-15】使用可變長參數(shù)計算任意個指定數(shù)字之和defsum(*t):sum=0;forxinrange(len(t)):print(str(t[x])+"+");sum+=t[x];print("="+str(sum));sum(1,2);sum(1,2,3,4);sum(11,22,33,44,55);結(jié)果如下1+2+=31+2+3+4+=1011+22+33+44+55+=165【例4-16】defsum(*t):sum=0;forxinrange(len(t)):print(str(t[x])+"+");sum+=t[x];iflen(t)>0:print("="+str(sum));sum();【例4-17】defsum(**t):print(t);

sum(a=1,b=2,c=3);4.2.2函數(shù)的返回值對【例4-3】中的sum()函數(shù)進行改造,通過函數(shù)的返回值返回相加的結(jié)果,代碼如下:defsum(num1,num2): returnnum1+num2;print(sum(1,3));運行結(jié)果為4。【例4-19】def

filter_even(list):list1=[];foriinrange(len(list)):iflist[i]%2==0:list1.append(list[i])

i-=1;returnlist1;list=[1,2,3,4,5,6,7,8,9,10]list2=filter_even(list)print(list2);4.3全局變量和局部變量4.3.1變量的作用域4.3.2在IDLE的調(diào)試窗口中查看變量的值4.3.3在PyCharm的調(diào)試窗口中查看變量的值3.1.3變量的作用域局部變量只在定義它的函數(shù)內(nèi)部有效,在函數(shù)體之外,即使使用同名的變量,也會被看作是另一個變量。全局變量在定義后的代碼中都有效,包括它后面定義的函數(shù)體內(nèi)。如果局部變量和全局變量同名,則在定義局部變量的函數(shù)中,只有局部變量是有效的。【例4-20】a=100; #全局變量def

setNumber(): a=10; #局部變量

print(a); #打印局部變量asetNumber();print(a); #打印全局變量$a4.3.2在IDLE的調(diào)試窗口中查看變量的值1.設(shè)置斷點2.單步調(diào)試1.設(shè)置斷點斷點是調(diào)試器的功能之一,可以讓程序中斷在需要的地方,從而方便對其進行分析。用鼠標(biāo)右擊要設(shè)置斷點的程序行,在快捷菜單里選擇SetBreakpont菜單項,會在當(dāng)前行設(shè)置斷點,該行代碼會顯示黃色背景。2.單步調(diào)試設(shè)置斷點后,運行程序,可以停在斷點處,然后一條語句一條語句的單步運行。單步調(diào)試可以看到程序的運行過程,同時可以查看在某一時刻某個變量的值。下面介紹在IDLE中單步調(diào)試程序的方法。例如在IDLE中打開例3-7.py,然后在菜單中選擇Run/PythonShell,打開PythonShell窗口。在PythonShell的菜單中,選擇Debug/Debugger,PythonShell窗口中會出現(xiàn)下面文字,[DEBUGON]同時打開DebugControl窗口程序停留在第1行程序停留在斷點處4.3.3在PyCharm的調(diào)試窗口中查看變量的值1.設(shè)置和應(yīng)用斷點將光標(biāo)移動至要設(shè)置斷點的程序行,選擇“Run”→“ToggleLineBreakpointer”菜單項,會在當(dāng)前行設(shè)置斷點,該行代碼前會出現(xiàn)一個紅色的圓點圖標(biāo),代表斷點。2.調(diào)試Python程序在PyCharm中打開Python程序單擊工具欄上調(diào)試按鈕,即可調(diào)試當(dāng)前的Python程序。程序會暫停在斷點代碼處,并在下方的Debug窗格中顯示變量的值。當(dāng)前中斷運行的程序行顯示為淡綠色背景條,并且該行代碼前會出現(xiàn)一個箭頭圖標(biāo)。單擊調(diào)試工具欄上的繼續(xù)按鈕可以繼續(xù)運行程序,單擊調(diào)試工具欄上的終止按鈕可以終止運行程序。在PyCharm中設(shè)置斷點看變量的值也可以將鼠標(biāo)移至變量上面,通過彈出的提示查看變量的值,如圖4-8所示。3.單步運行單步運行就是一步一步地運行程序,程序員可以使用單步運行跟蹤程序的運行軌跡。選擇Run→StepOver(或StepInto)菜單項可以執(zhí)行單步運行,程序行前面的箭頭圖標(biāo)會移動到下一行程序。StepOver和StepInto的區(qū)別在于,當(dāng)程序停留在調(diào)用函數(shù)的語句處時,單擊StepInto會進入函數(shù)內(nèi)部,停留在函數(shù)的第1行語句處;單擊StepOver會越過函數(shù),停留在函數(shù)后面的第1行語句處。4.4Python內(nèi)置函數(shù)4.3.1數(shù)學(xué)運算函數(shù)4.3.2字符串處理函數(shù)4.3.3其他常用內(nèi)置函數(shù)3.3.1數(shù)學(xué)運算函數(shù)函數(shù)原型具體說明abs()abs(x)返回x的絕對值pow()pow(x,y)返回x的y次冪Round()round(x[,n])返回浮點數(shù)x的四舍五入值,參數(shù)n指定保留的小數(shù)位數(shù)divmod()divmod(a,b)

返回a除以b的商和余數(shù),返回一個元組。例如divmod(a,b)返回

(a/b,a%b)【例4-21】print(abs(-1));print(round(80.23456,2))print(pow(2,3))print(divmod(8,3));運行結(jié)果如下:180.238(2,2)4.3.2字符串處理函數(shù)1.字符串中字符大小寫的變換函數(shù)原型具體說明lower()str.lower()將字符串str中的字母轉(zhuǎn)換為小寫字母upper()str.upper()將字符串str中的字母轉(zhuǎn)換為大寫字母swapcase()str.swapcase()將字符串str中的字母大小寫互換capitalize()str.capitalize()將字符串str中的首字母大寫title()str.title()將字符串str中的首字母大寫,其余為小寫【例4-22】str1="helloworld";str2="HELLOWORLD";str3="Helloworld";print(str1.upper());print(str2.lower());print(str3.swapcase())print(str3.swapcase())print(str1.capitalize());print(str2.title());運行結(jié)果HELLOWORLDhelloworldhELLOWORLDhELLOWORLDHelloworldHelloWorld2.指定輸出字符串時的對齊方式函數(shù)原型具體說明ljust()str.ljust(width,[fillchar])左對齊輸出字符串str,總寬度為參數(shù)width,不足部分以參數(shù)fillchar指定的字符填充,默認(rèn)使用空格填充rjust()str.rjust(width,[fillchar])右對齊輸出字符串str,總寬度為參數(shù)width,不足部分以參數(shù)fillchar指定的字符填充,默認(rèn)使用空格填充center()str.center(width,[fillchar])居中對齊輸出字符串str,總寬度為參數(shù)width,不足部分以參數(shù)fillchar指定的字符填充,默認(rèn)使用空格填充zfill()str.zfill(width)將字符串str變成width長,并且右對齊,不足部分用0補足【例4-23】str1="helloworld";print(str1.ljust(30,"*"));print(str1.rjust(30,"*"));print(str1.center(30,"*"))print(str1.zfill(30))運行結(jié)果如下:helloworld**************************************helloworld*********helloworld**********0000000000000000000helloworld3.搜索和替換函數(shù)原型具體說明find()str.find(substr,[start,[end]])返回字符串str中出現(xiàn)子串substr的第一個字母的位置,如果str中沒有substr,則返回-1。搜索范圍從start至endindex()str.index(substr,[start,[end]])與find()函數(shù)相同,只是在str中沒有substr時,index()函數(shù)會返回一個運行時錯誤rfind()str.rfind(substr,[start,[end]])返回從右側(cè)算起,字符串str中出現(xiàn)子串substr的第一個字母的位置,如果str中沒有substr,則返回-1。搜索范圍從start至endrindex()str.rindex(substr,[start,[end]])與rfind()函數(shù)相同,只是在str中沒有substr時,rindex()函數(shù)會返回一個運行時錯誤count()str.count(substr,[start,[end]])計算substr在str中出現(xiàn)的次數(shù)。統(tǒng)計范圍從start至endreplace()str.replace(oldstr,newstr,[count])把str中的oldstr替換為newstr,count為替換次數(shù)strip()str.strip([chars])把字符串str中前后chars中有的字符全部去掉。如果不指定參數(shù)chars,則會去掉空白符(包括'\n','\r','\t'和'')lstrip()str.lstrip([chars])把字符串str中前面包含的chars中有的字符全部去掉。如果不指定參數(shù)chars,則會去掉空白符(包括'\n','\r','\t'和'')rstrip()str.rstrip([chars])把字符串str中前面包含的chars中有的字符全部去掉。如果不指定參數(shù)chars,則會去掉空白符(包括'\n','\r','\t'和'')expandtabs()str.expandtabs([tabsize])把字符串str中的tab字符替換為空格,每個tab替換為tabsize個空格,默認(rèn)是8個

【例4-24】str1="helloworldPython";list1=str1.split("");print(list1);str1="helloworld\nPython";list1=str1.splitlines();print(list1);list1=["hello","world","Python"]str1="#"print(str1.join(list1))運行結(jié)果如下:['hello','world','Python']['helloworld','Python']hello#world#Python5.字符串判斷相關(guān)函數(shù)原型具體說明startswith()str.startswith(substr)判斷str是否以substr開頭endswith()str.endswith(substr)判斷str是否以substr為結(jié)尾isalnum()str.isalnum()判斷str是否全為字母或數(shù)字isalpha()str.isalpha()判斷str是否全為字母isdigit()str.isdigit()判斷str是否全為數(shù)字islower()str.islower()判斷str是否全為小寫字母isupper()str.isupper()判斷str是否全為大寫字母【例4-26】tr='pythonStringfunction'print(str+".startwith('t')的結(jié)果")print(str.startswith('t'))print(str+".endwith('d')的結(jié)果")print(str.endswith('d'))print(str+".isalnum()的結(jié)果")print(str.isalnum())str='pythonStringfunction'print(str+".isalnum()的結(jié)果")print(str.isalnum())print(str+".isalpha()的結(jié)果")print(str.isalpha())print(str+".isupper()的結(jié)果")print(str.isupper())print(str+".islower()的結(jié)果")print(str.islower())print(str+".isdigit()的結(jié)果")print(str.isdigit())str='3423'print(str+".isdigit()的結(jié)果")print(str.isdigit())運行結(jié)果如下:pythonStringfunction.startwith('t')的結(jié)果FalsepythonStringfunction.endwith('d')的結(jié)果FalsepythonStringfunction.isalnum()的結(jié)果FalsepythonStringfunction.isalnum()的結(jié)果TruepythonStringfunction.isalpha()的結(jié)果TruepythonStringfunction.isupper()的結(jié)果FalsepythonStringfunction.islower()的結(jié)果FalsepythonStringfunction.isdigit()的結(jié)果False3423.isdigit()的結(jié)果True4.5函數(shù)式編程4.5.1函數(shù)式編程概述4.5.2Python函數(shù)式編程常用的函數(shù)4.5.1函數(shù)式編程概述1.什么是函數(shù)式編程函數(shù)式編程一種編程的基本風(fēng)格,也就是構(gòu)建程序的結(jié)構(gòu)和元素的方式。函數(shù)式編程將計算過程看作是數(shù)學(xué)函數(shù),也就是可以使用表達式編程。在函數(shù)的代碼中,函數(shù)的返回值只依賴傳入函數(shù)的參數(shù),因此使用相同的參數(shù)調(diào)用函數(shù)2次,會得到相同的結(jié)果。(1)頭等函數(shù)(First-classfunction)如果一個編程語言把函數(shù)視為頭等函數(shù),則可以稱其擁有頭等函數(shù)。擁有頭等函數(shù)的編程語言可以將函數(shù)作為其他函數(shù)的參數(shù),也可以將函數(shù)作為作為其他函數(shù)的返回值。可以把函數(shù)賦值給變量或存儲在元組、列表、字典、集合和對象等數(shù)據(jù)結(jié)構(gòu)中。有的語言還支持匿名函數(shù)。在擁有頭等函數(shù)的編程語言中,函數(shù)名沒有任何特殊的狀態(tài),而是將函數(shù)看作是function類型的二進制類型。(2)高階函數(shù)(Higher-orderfunction)高階函數(shù)是頭等函數(shù)的一種實踐,它是可以將其他函數(shù)作為參數(shù)或返回結(jié)果的函數(shù)。例如,定義一個高階函數(shù)map(),有2個參數(shù),一個是函數(shù)func(),一個是列表list,map()函數(shù)將list里面的所有元素應(yīng)用函數(shù)func(),并將處理結(jié)果組成一個列表list1,最后將list1作為map()函數(shù)的返回結(jié)果。(3)純函數(shù)純函數(shù)與外界交換數(shù)據(jù)只有唯一渠道——參數(shù)和返回值。純函數(shù)不操作全局變量,沒有狀態(tài)、無I/O操作,不改變傳入的任何參數(shù)的值。理想情況下,不會給他傳入任何外部數(shù)據(jù)。很容易把一個純函數(shù)移植到一個新的運行環(huán)境。最多只需要修改類型定義即可。純函數(shù)具有引用透明性(ReferentialTransparency)。也就是說,對于同一個輸入值,它一定得到相同的輸出值,而與在什么時候、在什么情況下執(zhí)行該函數(shù)無關(guān)。(4)遞歸在函數(shù)式編程語言中循環(huán)通常通過遞歸來實現(xiàn)。遞歸就是在函數(shù)里調(diào)用自身;在使用遞歸策略時,必須有一個明確的遞歸結(jié)束條件,稱為遞歸出口。2.函數(shù)式編程的優(yōu)點(1)便于進行單元測試(2)便于調(diào)試(3)適合并行執(zhí)行4.5.2Python函數(shù)式編程常用的函數(shù)1.lambda表達式2.使用map()函數(shù)3.filter()函數(shù)4.reduce()函數(shù)5.zip()函數(shù)1.lambda表達式Lambda表達式是一種匿名函數(shù),是從數(shù)學(xué)里的λ演算得名的。λ演算可以用來定義什么是一個可計算函數(shù)。(1)Python匿名函數(shù)Python的Lambda表達式的函數(shù)體只能有唯一的一條語句,也就是返回值表達式語句。其語法如下:返回函數(shù)名=lambda參數(shù)列表:函數(shù)返回值表達式語句例如,下面的Lambda表達式可以計算x、y和z等3個參數(shù)的和:sum=lambdax,y,z:x+y+z可以使用sum(x,y,z)調(diào)用上面的Lambda表達式?!纠?-27】使用Lambda表達式的例子sum=lambdax,y,z:x+y+zprint(sum(1,2,3));運行結(jié)果為6?!纠?-27】中的Lambda表達式相當(dāng)于下面的函數(shù)。defsum(x,y,z): returnx+y+z;(2)Lambda表達式數(shù)組可以將Lambda表達式作為數(shù)組(也可以是列表或字典,這里以數(shù)組為例)元素,從而實現(xiàn)跳轉(zhuǎn)表的功能,也就是函數(shù)的列表。Lambda表達式數(shù)組的定義方法如下:數(shù)組名=[(Lambda表達式1),(Lambda表達式2),…]調(diào)用數(shù)組中Lambda表達式的方法如下:數(shù)組名[索引](Lambda表達式的參數(shù)列表)【例4-28】定義一個Lambda表達式數(shù)組。第1個元素用于計算參數(shù)的平方,第3個元素用于計算參數(shù)的立方,第1個元素用于計算參數(shù)的四次方。代碼如下:Arr=[(lambdax:x**2),(lambdax:x**3),(lambdax:x**4)]print(Arr[0](2),Arr[1](2),Arr[2](2))程序分別計算并打印2的平方、立方和四次方。運行結(jié)果如下:4816(3)將Lambda表達式作為函數(shù)的返回值【例4-29】

定義一個函數(shù)math。當(dāng)參數(shù)o等于1時返回計算加法的Lambda表達式;當(dāng)參數(shù)o等于2時返回計算計算減法的Lambda表達式;當(dāng)參數(shù)o等于3時返回計算乘法的Lambda表達式;當(dāng)參數(shù)o等于4時返回計算除法的Lambda表達式。代碼如下:defmath(o):if(o==1):returnlambdax,y:x+yif(o==2):returnlambdax,y:x-yif(o==3):returnlambdax,y:x*yif(o==4):returnlambdax,y:x/y

action=math(1)#返回加法Lambda表達式print("10+2",action(10,2))action=math(2)#返回減法Lambda表達式print("10-2=",action(10,2))action=math(3)#返回乘法Lambda表達式print("10*2,=",action(10,2))action=math(4)#返回除法Lambda表達式print("10/2,=",action(10,2))結(jié)果如下10+21210-2=810*2,=2010/2,=5.02.使用map()函數(shù)map()函數(shù)用于將指定序列中的所有元素作為參數(shù)調(diào)用指定函數(shù),并將結(jié)果構(gòu)成一個新的序列返回。map函數(shù)的語法如下:結(jié)果序列=map(映射函數(shù),序列1[,序列2,…])在map()函數(shù)的參數(shù)中,可以有多個序列,這取決于映射函數(shù)的參數(shù)數(shù)量。序列1、序列2等序列中元素會按順序作為映射函數(shù)的參數(shù),映射函數(shù)的返回值將作為map()函數(shù)的返回序列的元素。【例4-30】arr=map(lambdax:x**2,[2,4,6,8,10])foreinenumerate(arr):print(e)運行結(jié)果(0,4)(1,16)(2,36)(3,64)(4,100)【例4-31】arr=map(lambdax,y:x+y,[1,3,5,7,9],[2,4,6,8,10])foreinenumerate(arr):print(e)本例中映射函數(shù)是一個有2個參數(shù)的Lambda表達式,用于計算參數(shù)之和。因為映射函數(shù)有2個參數(shù),所以map()函數(shù)中有2個序列參數(shù)。map()對2個序列參數(shù)中對應(yīng)位置的元素應(yīng)用Lambda表達式,將計算結(jié)果作為數(shù)組返回。然后,打印返回數(shù)組的元素。運行結(jié)果如下(0,3)(1,7)(2,11)(3,15)(4,19)3.filter()函數(shù)filter()函數(shù)可以對指定序列執(zhí)行過濾操作,具體定義如下:filter(函數(shù)function,序列sequence)函數(shù)function接受一個參數(shù),返回布爾值True或False。序列sequence可以是列表、元祖或字符串?!纠?-32】defis_even(x): returnx%2==0arr=filter(is_even,[1,2,3,4,5,6,7,8,9,10])foreinenumerate(arr):print(e)運行結(jié)果(0,2)(1,4)(2,6)(3,8)(4,10)4.reduce()函數(shù)reduce()函數(shù)用于將指定序列中的所有元素作為參數(shù)按一定的規(guī)則調(diào)用指定函數(shù)。reduce函數(shù)的語法如下:計算結(jié)果=reduce(映射函數(shù),序列)映射函數(shù)的必須有2個參數(shù)。reduce()函數(shù)首先以序列的第1和第2個元素為參數(shù)調(diào)用映射函數(shù),然后將返回結(jié)果與序列的第3個元素為參數(shù)調(diào)用映射函數(shù)。以此類推,直至應(yīng)用到序列的最后一個元素,將計算結(jié)果作為reduce()函數(shù)的返回結(jié)果?!纠?-33】defadd(x,y):returnx+ysum=reduce(add,range(1,11))print(sum)程序的運行過程(1)reduce()函數(shù)首先使用2和4為參數(shù)調(diào)用myadd()函數(shù),得到結(jié)果6。(2)使用結(jié)果6和序列的第3個元素6為參數(shù)調(diào)用myadd()函數(shù),得到結(jié)果12。(3)使用結(jié)果12和序列的第4個元素8為參數(shù)調(diào)用myadd()函數(shù),得到結(jié)果20。(1)使用結(jié)果20和序列的第5個元素10為參數(shù)調(diào)用myadd()函數(shù),得到結(jié)果30。運行結(jié)果為30。5.zip()函數(shù)zip()函數(shù)以一系列列表作為參數(shù),將列表中對應(yīng)的元素打包成一個個元組,然后返回由這些元組組成的列表。【例4-34】a=[1,2,3]b=[4,5,6]zipped=zip(a,b)forelementinzipped:print(element)運行結(jié)果(1,4,7)(2,5,8)(3,6,9)【例4-35】a=[1,2,3]b=[4,5,6,7,8,9]zipped=zip(a,b)forelementinzipped:print(element)【例4-36】a=[1,2,3]b=[4,5,6]zipped=zip(a,b)unzipped=zip(*zipped)forelementinunzipped:print(element)運行結(jié)果(1,2,3)(4,5,6)4.5.3普通編程方式與函數(shù)式編程的對比【例4-37】以普通編程方式計算列表元素中正數(shù)之和。list=[2,-4,9,-5,6,13,-12,-3,8,-11,16]sum=0foriinrange(len(list)):iflist[i]>0:sum+=list[i]print(sum)運行結(jié)果如下:54【例4-38】以函數(shù)式編程方式實現(xiàn)【例4-37】的功能list=[2,-4,9,-5,6,13,-12,-3,8,-11,16]sum=filter(lambdax:x>0,list)s=reduce(lambdax,y:x+y,sum)print(s)相比而言,函數(shù)式編程具有如下特點(1)代碼更簡單。(2)數(shù)據(jù),操作,返回值都放在一起。(3)沒有循環(huán)體,幾乎沒有臨時變量,也就不用勞神去分析程序的流程行尾數(shù)據(jù)變化過程了。(4)代碼用來要做什么,而不是怎么去做。4.6閉包和遞歸函數(shù)4.6.1閉包(closure)4.6.2遞歸函數(shù)4.6.1閉包(closure)在Python中,閉包指函數(shù)的嵌套??梢栽诤瘮?shù)內(nèi)部定義一個嵌套函數(shù),將嵌套函數(shù)視為一個對象,所以可以將嵌套函數(shù)作為定義它的函數(shù)的返回結(jié)果?!纠?-39】使用閉包的例子deffunc_lib():defadd(x,y):returnx+yreturnadd#返回函數(shù)對象fadd=fu

溫馨提示

  • 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)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論