1.python函數(shù)傳參的方式有以下幾種:
備注:傳參按照數(shù)量分為固定參數(shù)和可變參數(shù),固定參數(shù)有關(guān)鍵字+默認(rèn),可變參數(shù)是參數(shù)組。
1.1、關(guān)鍵字參數(shù),就是傳參的時(shí)候可以只傳值(參數(shù)值),但要求與函數(shù)的參數(shù)順序一致;也可以帶上參數(shù)名,(參數(shù)名=參數(shù)值),該情況就是關(guān)鍵字參數(shù),可以不需要按照函數(shù)的參數(shù)順序。
1.2、默認(rèn)參數(shù),就是給參數(shù)附一個(gè)默認(rèn)的值,如果調(diào)用函數(shù)時(shí)給該參傳了新值,以新值為準(zhǔn),如果沒傳,使用默認(rèn)值,備注要求默認(rèn)參數(shù)要放到參數(shù)最后面,(參數(shù)名1,參數(shù)名2,默認(rèn)參數(shù)=3)
1.3、參數(shù)組,就是參數(shù)值是元祖和字典,func(*tuple_grp_nonkw_args, **dict_grp_kw_args),其中的 tuple_grp_nonkw_args 是以元組形式體現(xiàn)的非關(guān)鍵字參數(shù)組, dict_grp_kw_args 是裝有關(guān)鍵字參數(shù)的字典,字典中鍵為參數(shù)名,值為相應(yīng)的參數(shù)值。
備注:(1).可變長(zhǎng)的參數(shù)元組必須在位置和默認(rèn)參數(shù)之后;(2).參數(shù)順序是:關(guān)鍵字參數(shù)、默認(rèn)參數(shù)、參數(shù)組(可變參數(shù))
2.裝飾器(@):
2.1、裝飾器是在函數(shù)調(diào)用之上的修飾,裝飾器的語(yǔ)法以@開頭,接著是裝飾器函數(shù)的名字和可選的參數(shù)。緊跟著裝飾器聲明的是被修飾的函數(shù),和裝飾函數(shù)的可選參數(shù)。裝飾器看起來會(huì)是這樣:
@decorator(dec_opt_args)
def func2Bdecorated(func_opt_args):
2.2、可以考慮在裝飾器中置入通用功能的代碼來降低程序復(fù)雜度。例如,可以用裝飾器來:
? ? a.引入日志
? ? b.增加計(jì)時(shí)邏輯來檢測(cè)性能
? ? c.給函數(shù)加入事務(wù)的能力
3.函數(shù)式編程
3.1、匿名函數(shù)與 lambda
匿名函數(shù)的語(yǔ)法:
lambda [arg1[, arg2, ... argN]]: expression參數(shù)是可選的,如果使用的參數(shù)話,參數(shù)通常也是表達(dá)式的一部分
核心筆記:lambda 表達(dá)式返回可調(diào)用的函數(shù)對(duì)象。
用合適的表達(dá)式調(diào)用一個(gè) lambda 生成一個(gè)可以像其他函數(shù)一樣使用的函數(shù)對(duì)象。它們可被傳入給其他函數(shù),用額外的引用別名化,作為容器對(duì)象以及作為可調(diào)用的對(duì)象被調(diào)用(如果需要的話,可以帶參數(shù))。當(dāng)被調(diào)用的時(shí)候,如果給定相同的參數(shù)的話,這些對(duì)象會(huì)生成一個(gè)和相同表達(dá)式等價(jià)的結(jié)果。它們和那些返回等價(jià)表達(dá)式計(jì)算值相同的函數(shù)是不能區(qū)分的
3.2、舉例如下:
def add(x, y): return x + y? ? ? <=> ?函數(shù)名=lambda x, y: x + y
def usuallyAdd2(x, y=2): return x+y? <=> ?函數(shù)名=lambda x, y=2: x+y
如:a = lambda x, y=2: x + y ?—> ? ?a(3)=5
4.內(nèi)建函數(shù)
4.1、filter(odd, allNums),返回一個(gè)列表,odd代表提供篩選的函數(shù),allNums代表待處理的列表,filter的作用是將allNums列表中的數(shù)據(jù)通過odd函數(shù)篩選后,保留返回True的數(shù)據(jù)組成新的列表;
4.2、map(odd, allNums),返回一個(gè)列表,odd代表運(yùn)算的函數(shù),allNums代表待處理的列表,filter的作用是將allNums列表中的數(shù)據(jù)通過odd函數(shù)運(yùn)算后,返回函數(shù)結(jié)果的數(shù)據(jù)組成新的列表;map((lambda x: x+2), [0, 1, 2, 3, 4, 5]) => [2, 3, 4, 5, 6, 7];map(lambda x, y: (x+y, x-y), [1,3,5], [2,4,6]) => [(3, -1), (7, -1), (11, -1)]。
5.變量的作作用域
5.1、全局變量與局部變量
當(dāng)搜索一個(gè)標(biāo)識(shí)符的時(shí)候,python 先從局部作用域開始搜索。如果在局部作用域內(nèi)沒有找到那個(gè)名字,那么就一定會(huì)在全局域找到這個(gè)變量否則就會(huì)被拋出 NameError 異常,如果找到一個(gè)名字,搜索就不會(huì)繼續(xù)去尋找一個(gè)全局域的變量,故局部變量可的優(yōu)先級(jí)高于同名的全局變量。
6.生成器
生成器是一個(gè)帶 yield 語(yǔ)句的函數(shù)。一個(gè)函數(shù)或者子程序只返回一次,但一個(gè)生成器能暫停執(zhí)行并返回一個(gè)中間的結(jié)果----那就是 yield 語(yǔ)句的功能, 返回一個(gè)值給調(diào)用者并暫停執(zhí)行。當(dāng)生成器的 next()方法被調(diào)用的時(shí)候,它會(huì)準(zhǔn)確地從離開地方繼續(xù)(當(dāng)它返回[一個(gè)值以及]控制給調(diào)用者時(shí))——可嘗試用于功能測(cè)試半自動(dòng)化。