函數(shù)(二)
一、函數(shù)參數(shù)
1.定義函數(shù)的參數(shù):固定參數(shù)/可變參數(shù)
定義函數(shù)時(shí),參數(shù)可以有兩種;一種是在參數(shù)表中寫明參數(shù)名key的參數(shù),固定了順序和數(shù)量,如:
? def func(key1, key2, key3…):
? def func(key1, key2=value2…)


另一種是定義時(shí)還不知道會(huì)有多少參數(shù)傳入的可變參數(shù),如:
? def func(*args): #不帶key的多個(gè)無名參數(shù)
? def func(**kwargs): #key=val形式的多個(gè)命名參數(shù)




2. 調(diào)用函數(shù)的參數(shù):位置參數(shù)/關(guān)鍵字參數(shù)
調(diào)用函數(shù)的時(shí)候,可以傳進(jìn)兩種參數(shù);一種是沒有名字的位置參數(shù),如func(arg1,arg2, arg3…),會(huì)按照前后順序?qū)?yīng)到函數(shù)參數(shù)。


另一種是帶key的關(guān)鍵字參數(shù),如func(key1=arg1,key2=arg2…),由于指定了key,可不按順序?qū)?yīng)。如果混用,所有位置參數(shù)必在前,關(guān)鍵字參數(shù)必在后。

3.調(diào)用函數(shù)的參數(shù):解包
對(duì)于有多個(gè)參數(shù)的函數(shù),可以單個(gè)序列或字典“解包”對(duì)應(yīng)到每個(gè)參數(shù),如:func(*aseq):序列解包對(duì)應(yīng)到每個(gè)位置參數(shù),func(**adict):字典解包對(duì)應(yīng)到每個(gè)關(guān)鍵字參數(shù)。


二、函數(shù)式編程
相對(duì)于復(fù)雜算法步驟的編程范式,函數(shù)式編程通過表達(dá)式和函數(shù)的操作來定義函數(shù),強(qiáng)調(diào)對(duì)結(jié)果的描述,而不是過程,不會(huì)有副作用(影響函數(shù)之外的數(shù)據(jù),如全局變量),函數(shù)可以是變量的值,函數(shù)可以作為參數(shù)傳遞,函數(shù)可以作為返回值,經(jīng)常使用遞歸定義,而不是迭代和循環(huán)。
三、map函數(shù)
有時(shí)候,需要對(duì)列表中每個(gè)元素做一個(gè)相同的處理,得到新列表,例如所有數(shù)據(jù)乘以3 ;例如所有字符串轉(zhuǎn)換為整數(shù);例如兩個(gè)列表對(duì)應(yīng)值相加。map(func, list1, list2….),函數(shù)func有幾個(gè)參數(shù),后面就跟幾個(gè)列表。


四、函數(shù)表達(dá)式:lambda
? 有時(shí)候,函數(shù)只用一次,其名稱也就不重要,可以無需費(fèi)神去def一個(gè)
? Lambda表達(dá)式可以返回一個(gè)匿名函數(shù):lambda <參數(shù)表>:<表達(dá)式>


五、函數(shù)作為參數(shù):reduce函數(shù)
reduce函數(shù)對(duì)列表進(jìn)行滾動(dòng)式處理,最終得到一個(gè)值,例如,累加,累乘等等。reduce(func, list) 相當(dāng)于:func(func(func(list1,list2),list3),list4)....reduce(lambda x, y: x+y, [1, 2, 3, 4, 5])相當(dāng)于:((((1+2)+3)+4)+5)。

六、函數(shù)作為參數(shù):filter函數(shù)
filter函數(shù)對(duì)數(shù)據(jù)集中的對(duì)象逐個(gè)調(diào)用func,如果結(jié)果為真,則保留這個(gè)對(duì)象;否則拋棄這個(gè)對(duì)象。

推薦閱讀
《數(shù)據(jù)科學(xué)與人工智能》公眾號(hào)推薦朋友們學(xué)習(xí)和使用Python語言,需要加入Python語言群的,請(qǐng)掃碼加我個(gè)人微信,備注【姓名-Python群】,我誠(chéng)邀你入群,大家學(xué)習(xí)和分享。
? ? 關(guān)于Python語言,有任何問題或者想法,請(qǐng)留言或者加群討論。
