《Python大數(shù)據(jù)基礎(chǔ)與實(shí)戰(zhàn)》課件-Python大數(shù)據(jù)基礎(chǔ)與實(shí)戰(zhàn)(第6章 自定義函數(shù))_第1頁
《Python大數(shù)據(jù)基礎(chǔ)與實(shí)戰(zhàn)》課件-Python大數(shù)據(jù)基礎(chǔ)與實(shí)戰(zhàn)(第6章 自定義函數(shù))_第2頁
《Python大數(shù)據(jù)基礎(chǔ)與實(shí)戰(zhàn)》課件-Python大數(shù)據(jù)基礎(chǔ)與實(shí)戰(zhàn)(第6章 自定義函數(shù))_第3頁
《Python大數(shù)據(jù)基礎(chǔ)與實(shí)戰(zhàn)》課件-Python大數(shù)據(jù)基礎(chǔ)與實(shí)戰(zhàn)(第6章 自定義函數(shù))_第4頁
《Python大數(shù)據(jù)基礎(chǔ)與實(shí)戰(zhàn)》課件-Python大數(shù)據(jù)基礎(chǔ)與實(shí)戰(zhàn)(第6章 自定義函數(shù))_第5頁
已閱讀5頁,還剩34頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

第六章自定義函數(shù)6.5lambda表達(dá)式6.4函數(shù)的返回值6.2函數(shù)調(diào)用6.6生成器6.3函數(shù)的參數(shù)6.1函數(shù)定義6.7裝飾器6.8變量的作用域6.9函數(shù)的遞歸6.1函數(shù)的定義6.1函數(shù)定義函數(shù)(function)是指一個(gè)有命名的、執(zhí)行某個(gè)功能的語句序列。在定義一個(gè)函數(shù)的時(shí)候,需要指定函數(shù)的名字和語句序列。

函數(shù)不僅可以實(shí)現(xiàn)代碼的復(fù)用,還可以保證代碼的一致性。Python將函數(shù)的聲明和定義視為一體。函數(shù)的定義語法如下:

def函數(shù)名([參數(shù)列表]):函數(shù)體6.1函數(shù)定義?自定義函數(shù)通過關(guān)鍵字def來定義,通過return語句指定返回值。?函數(shù)可以通過return語句同時(shí)返回多個(gè)值,如果沒有return語句,則函數(shù)返回值為None。?函數(shù)名命名規(guī)則與變量名相同,不能是關(guān)鍵字,應(yīng)該避免函數(shù)名和變量名同名。?函數(shù)的第1行稱為函數(shù)頭,必須以冒號(hào):結(jié)束,其余部分稱為函數(shù)體,而函數(shù)體必須縮進(jìn)。按照慣例,縮進(jìn)總是4個(gè)空格。?函數(shù)形參不需要聲明類型,也不需要指定函數(shù)返回值類型。?當(dāng)函數(shù)不需要任何參數(shù)時(shí),也必須保留一對(duì)空的圓括號(hào)。?Python允許嵌套定義函數(shù)。6.1函數(shù)定義

函數(shù)的形參和返回值可以是任何數(shù)據(jù)類型,包括函數(shù)??梢允褂胮ass關(guān)鍵字,表示函數(shù)什么也不做,起到占位的作用。

定義函數(shù)時(shí),建議設(shè)置其docstring,提供函數(shù)的幫助文檔。可以通過函數(shù)名?或者h(yuǎn)elp(函數(shù)名)看到這些docstring,使用三雙引號(hào)來定義docstring。

用Python編寫的函數(shù),在Jupyternotebook中可以通過“函數(shù)名??”來顯示源代碼。defmyfun1(a,b): """

這是一個(gè)函數(shù)嵌套定義,完成a*(a+b)功能 """ n=a+b defmyfun2(c,d): #函數(shù)的嵌套定義 returnc*d returnmyfun2(n,a) #調(diào)用內(nèi)部函數(shù)

6.1函數(shù)定義6.2函數(shù)的調(diào)用6.2函數(shù)調(diào)用1.函數(shù)的調(diào)用方式對(duì)于一個(gè)函數(shù),可以通過“函數(shù)名(實(shí)參)”的方式來調(diào)用。如果函數(shù)有返回值,那么可以在函數(shù)調(diào)用的同時(shí)將返回值傳遞出來,此時(shí)這個(gè)函數(shù)調(diào)用可以當(dāng)做一個(gè)值來使用。

>>>result=myfun1(5,4)

#函數(shù)調(diào)用時(shí)實(shí)參傳遞給形參,如果實(shí)參是表達(dá)式,先計(jì)算表達(dá)式的值,然后再傳遞給形參>>>result452.特殊的內(nèi)置函數(shù)1)map()map()函數(shù)接受一個(gè)函數(shù)f和一個(gè)序列sq,其作用是將函數(shù)f作用在序列的每個(gè)元素上,等價(jià)于[f(x)forxinsq]。>>>list(map(int,"123")) #將字符串中的每個(gè)字符應(yīng)用int()函數(shù),轉(zhuǎn)換為整型數(shù)[1,2,3]6.2函數(shù)調(diào)用

2)filter()filter()函數(shù)也接受一個(gè)函數(shù)f和一個(gè)序列sq,其作用是通過函數(shù)f來篩選序列中的每個(gè)元素,等價(jià)于[xforxinsqiff(x)]。>>>defis_odd(x): returnx%2!=0>>>list(filter(is_odd,[1,2,3,4,5,6]))[1,3,5]6.2函數(shù)調(diào)用

6.2函數(shù)調(diào)用

3)reduce()reduce()函數(shù)接受一個(gè)二元操作的函數(shù)f和一個(gè)序列sq,實(shí)現(xiàn)對(duì)序列sq中的元素累加計(jì)算,并返回單一結(jié)果。注意:reduce()使用時(shí)需要引入functools模塊。>>>fromfunctoolsimportreduce>>>defadd(x,y): returnmax(x,y) #求x,y的最大者>>>reduce(add,[10,-10,100,200,1,2])2006.3函數(shù)的參數(shù)6.3函數(shù)的參數(shù)

函數(shù)定義時(shí),圓括弧內(nèi)是使用逗號(hào)分隔開的形參列表,函數(shù)可以有多個(gè)參數(shù),也可以沒有參數(shù),形參只是起到占位的作用。定義函數(shù)時(shí)不需要聲明參數(shù)類型,解釋器會(huì)根據(jù)實(shí)參的類型自動(dòng)推斷形參類型。如果傳遞給函數(shù)的實(shí)參是整數(shù)、實(shí)數(shù)、復(fù)數(shù)等基本類型或元組、字符串這樣的不可變類型的數(shù)據(jù),在函數(shù)內(nèi)部直接修改形參的值不會(huì)影響實(shí)參,而是創(chuàng)建一個(gè)新變量。如果傳遞給函數(shù)的實(shí)參是可變序列,并且在函數(shù)內(nèi)部使用下標(biāo)或可變序列自身的方法增加、刪除元素或修改形參元素時(shí),實(shí)參也會(huì)得到相應(yīng)的修改。6.3函數(shù)的參數(shù)>>>defsub(num): print("操作前,形參地址是:%0x"%id(num)) num-=1 print("操作后,形參地址是:%0x"%id(num))>>>test=100>>>print("實(shí)參地址是:%0x"%id(test))>>>sub(test)實(shí)參地址是:52557a40操作前,形參地址是:52557a40操作后,形參地址是:52557a206.3函數(shù)的參數(shù)>>>defadd(s): s.append(10)>>>t=[1,2,3]>>>add(t)>>>t[1,2,3,10]>>>defmodify(lst): print("操作前,形參的地址是:",hex(id(lst)))

lst=[4,5,6] #lst指向一個(gè)新的內(nèi)存地址 print("操作后,形參的地址是:",hex(id(lst)))>>>a=[1,2,3]>>>modify(a)1.

位置參數(shù)位置參數(shù)是最常用的形式,調(diào)用函數(shù)時(shí)實(shí)參和形參的順序以及必須嚴(yán)格一致,并且實(shí)參和形參的數(shù)量必須相同。>>>defmenu(food,cigarette,wine): print("主食:",food,"香煙:",cigarette,"白酒:",wine)>>>menu("面條","紅塔山","郎酒")主食:面條香煙:紅塔山白酒:郎酒6.3函數(shù)的參數(shù)6.3函數(shù)的參數(shù)2.默認(rèn)值參數(shù)在調(diào)用帶有默認(rèn)值參數(shù)的函數(shù)時(shí),可以不用為設(shè)置默認(rèn)值的形參進(jìn)行傳值,此時(shí)函數(shù)將會(huì)直接使用函數(shù)定義時(shí)設(shè)置的默認(rèn)值,當(dāng)然也可以通過顯式賦值來替換其默認(rèn)值。在調(diào)用函數(shù)時(shí)是否為默認(rèn)值參數(shù)傳遞實(shí)參是可選的。需要注意的是,在定義帶有默認(rèn)值參數(shù)的函數(shù)時(shí),任何一個(gè)默認(rèn)值參數(shù)右邊都不能再出現(xiàn)沒有默認(rèn)值的普通位置參數(shù),否則會(huì)提示語法錯(cuò)誤。函數(shù)的默認(rèn)值參數(shù)是在函數(shù)定義時(shí)確定值的,所以只會(huì)被初始化一次。帶有默認(rèn)值參數(shù)的函數(shù)定義語法如下:def函數(shù)名(……,形參=默認(rèn)值):

函數(shù)體6.3函數(shù)的參數(shù)

多次調(diào)用函數(shù)并且不為默認(rèn)值參數(shù)傳遞實(shí)參時(shí),默認(rèn)值參數(shù)只在定義時(shí)進(jìn)行一次解釋和初始化。因此,對(duì)于列表、字典這樣可變類型的默認(rèn)值參數(shù),可能會(huì)導(dǎo)致邏輯錯(cuò)誤。>>>defbuggy(arg,result=[]): result.append(arg) print(result)>>>buggy(3,[1,2])[1,2,3]>>>buggy(3)

>>>buggy(4)[3]

[3,4]6.3函數(shù)的參數(shù)

一般來說,要避免使用列表、字典、集合等可變序列作為函數(shù)參數(shù)默認(rèn)值,對(duì)于上面的函數(shù),更建議使用下面的寫法。>>>defbuggy(arg,result=None): ifresultisNone: result=[] result.append(arg) print(result)6.3函數(shù)的參數(shù)3.關(guān)鍵參數(shù)關(guān)鍵參數(shù)指調(diào)用函數(shù)時(shí)的參數(shù)傳遞方式,與函數(shù)定義無關(guān)。通過關(guān)鍵參數(shù)可以按照參數(shù)名字傳遞值,明確指定哪個(gè)值傳遞給哪個(gè)參數(shù),實(shí)參的順序可以和形參的順序不一致,并不影響參數(shù)值的傳遞結(jié)果。>>>menu(wine="茅臺(tái)",food="米飯",cigarette="好貓")主食:米飯香煙:好貓白酒:茅臺(tái)還可以混合位置參數(shù)和關(guān)鍵參數(shù),但是要確保位置參數(shù)在關(guān)鍵參數(shù)的左邊。>>>menu("米粉",wine="五糧液",cigarette="云煙")主食:米粉香煙:云煙白酒:五糧液6.3函數(shù)的參數(shù)4.可變長(zhǎng)度參數(shù)Python支持在函數(shù)定義時(shí)可以使用個(gè)數(shù)不確定的參數(shù)??勺冮L(zhǎng)度參數(shù)主要有兩種形式:在參數(shù)名前加*或**。*parameter用來接收多個(gè)位置參數(shù)并將其放在一個(gè)元組中。**parameter用來接收多個(gè)關(guān)鍵參數(shù)并將其存放到一個(gè)字典中。6.3函數(shù)的參數(shù)>>>defprint_args(arg1,arg2,*pargs,**kargs): print("arg1is",arg1) print("arg2is",arg2) foreachpargsinpargs: print("additionalpositionarg:",eachpargs) forkey,valueinkargs.items(): print("additionalkeywordarg:%s:%s"%(key,value))>>>print_args("主食","面條","白酒","汾酒",香煙="芙蓉王")6.4函數(shù)的返回值6.4函數(shù)的返回值

在Python中,定義函數(shù)時(shí)不需要聲明函數(shù)的返回值類型,函數(shù)返回值類型與return語句返回表達(dá)式的類型一致。return語句結(jié)束函數(shù)的執(zhí)行。

Python支持同時(shí)返回多個(gè)值,多個(gè)值以元組的形式返回。>>>defadddiv(a,b): a,b=a+b,a/b returna,b #返回一個(gè)元組,包含a和b的值>>>add,sub=adddiv(10,3) #元組的拆封>>>print("參數(shù)之和是:%d,參數(shù)相除是:%.2f"%(add,sub))參數(shù)之和是:13,參數(shù)相除是:3.336.5lambda表達(dá)式6.5lambda表達(dá)式lambda表達(dá)式可以用來聲明匿名函數(shù),也就是沒有函數(shù)名字的臨時(shí)使用的函數(shù)。在使用函數(shù)作為參數(shù)的時(shí)候,如果傳入的函數(shù)比較簡(jiǎn)單或者使用次數(shù)較少,直接定義這些函數(shù)就顯得比較浪費(fèi),這是就可以使用lambda表達(dá)式。

lambda<variables>:<expression>其中variables是函數(shù)的參數(shù),expression是函數(shù)的返回值,它們之間用冒號(hào):分隔。

lambda表達(dá)式只可以包含一個(gè)表達(dá)式,不允許包含選擇、循環(huán)等語法結(jié)構(gòu),該表達(dá)式的計(jì)算結(jié)果可以看作是函數(shù)的返回值,不允許包含復(fù)合語句,但在表達(dá)式中可以調(diào)用其他函數(shù)。6.5lambda表達(dá)式>>>f=lambdax,y,z:max(x,y,z)>>>f(10,20,30)30>>>L=[1,2,3,4,5]>>>print(list(map(lambdax:x+10,L)))[11,12,13,14,15]>>>defdemo(n): returnn*n>>>list(map(lambdax:demo(x),(1,2,3,4))) #使用函數(shù)作為lambda表達(dá)式的返回值[1,4,9,16]>>>fromrandomimportsample#導(dǎo)入random包中的sample模塊>>>data=[sample(range(100),6)foriinrange(3)]

>>>forrowindata: print(row)[22,62,82,50,36,99][62,19,72,88,82,25][28,27,92,63,20,5]>>>forrowinsorted(data,key=lambdarow:row[0]):#按照每行的第一個(gè)元素升序排列 print(row)[22,62,82,50,36,99][28,27,92,63,20,5][62,19,72,88,82,25]6.5lambda表達(dá)式6.6生成器

生成器(generator)是創(chuàng)建迭代器(iterator)對(duì)象的一種簡(jiǎn)單而強(qiáng)大的工具。生成器的語法和普通函數(shù)一樣,只是返回?cái)?shù)據(jù)時(shí)需要使用yield語句而非return語句。包含yield語句的函數(shù)可以用來創(chuàng)建生成器對(duì)象,這樣的函數(shù)也稱生成器函數(shù)。與一般函數(shù)不同的是,一般函數(shù)在執(zhí)行到return語句時(shí),會(huì)立刻結(jié)束函數(shù)的運(yùn)行,而生成器在每次執(zhí)行到y(tǒng)ield語句時(shí),會(huì)返回一個(gè)中間的結(jié)果給調(diào)用者,之后會(huì)暫?;驋炱鸷竺娲a的執(zhí)行,下次通過生成器對(duì)象的__next__()方法、內(nèi)置函數(shù)next()、for循環(huán)遍歷生成器對(duì)象元素或其他方式顯式獲取數(shù)據(jù)時(shí),它會(huì)準(zhǔn)確地從離開地方繼續(xù)執(zhí)行。6.6生成器>>>defmy_range(first=0,last=10,step=1): number=first whilenumber<last: yieldnumber#暫停執(zhí)行,需要時(shí)再產(chǎn)生一個(gè)新元素 number+=step>>>ranger=my_range(1,6)>>>forxinranger: #迭代生成器對(duì)象 print(x,end='\t')1 2 3 4 5 6.6生成器6.7裝飾器

裝飾器(decorators)本質(zhì)上是一個(gè)輸入?yún)?shù)是函數(shù),并且返回值也是函數(shù)的函數(shù)。裝飾器的語

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(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ǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論