python中的函式也是一種物件,而且函式還是一等公民。函式能作為引數,也能作為返回值,這使得python中的函式變得很靈活。想想前面兩篇中介紹的通過內嵌函式實現的裝飾器和閉包。
下面就介紹一下python函式相關的一寫內容。
在程式設計的過程中,可能會遇到函式引數個數不固定的情況,這時就需要使用可變長度的函式引數。在python函式定義中,使用*和**符號分別指定元組(非關鍵字)和字典(關鍵字)作為引數。
當函式被呼叫的時候,所有的引數都將值賦給了在函式宣告中對應的區域性變數,剩下的非關鍵字引數按照順序新增到乙個元組中便於訪問。
可變長元組引數必須在位置和預設引數之後,所以使用可變長元組引數的函式形式一般如下(中括號表示可選引數),可變長元組引數前有乙個"*"符號:
def funcname([fromal_args,] *tuple_grp_nonkw_args):看乙個例子:pass
def argfunc(positional_arg, keyword_arg="**的輸出為:foo", *tuple_grp_nonkw_args):
"positional_arg:
", positional_arg
"keyword_arg:
", keyword_arg
for arg in
tuple_grp_nonkw_args:
"additional_arg:
", arg
argfunc(3)
argfunc(3, 4)
argfunc(3, 4, "
hello
", "
world
")
除了上面的方式,python還可以支援關鍵字變長引數,額外的關鍵字引數被放入了乙個字典進行使用。
可變長字典引數必須是函式定義中的最後乙個引數,所以使用可變長字典引數的函式形式一般如下(中括號表示可選引數),可變長字典引數前有乙個"**"符號:
def funcname([fromal_args,] [*tuple_grp_nonkw_args,] **dict_grp_kw_args):看乙個例子:pass
def argfunc(positional_arg, keyword_arg="**輸出為:foo", *tuple_grp_nonkw_args, **dict_grp_kw_args):
"positional_arg:
", positional_arg
"keyword_arg:
", keyword_arg
for arg in
tuple_grp_nonkw_args:
"additional non-keyword arg:
", arg
for argkey in
dict_grp_kw_args.keys():
"additional keyword arg:
" %(argkey, dict_grp_kw_args[argkey])
argfunc(3, 4, name="
wilber
", age=28)
argfunc(3, 4, "
hello
", "
world
", name="
wilber
", age=28)
函式呼叫的完整形式為:
func( positional_args, keyword_args, *tuple_grp_nonkw_args, **dict_grp_kw_args )在使用的過程中,所有引數都是可選的,但應當注意的是:上面四種引數的位置是不可調換的。
python允許使用lambda關鍵字建立匿名函式,通過lambda關鍵字,可以快速編寫簡單函式。
使用lambda關鍵字的形式為:
lambda [arg1 [, arg2, ... argn]]: expression對於不經常被呼叫的簡單函式,建議直接使用lambda表示式,方便簡潔:
addnum = lambda x, y: x+ypython可以很好的支援物件導向程式設計,但是通過python中以下幾個內建函式和lambda表示式,也可以體驗一下函式式程式設計。addnum
"3 + 4 =
", addnum(3, 4)
filter函式的完整形式為filter(func, seq):呼叫乙個布林型別的函式func來遍歷每乙個seq中的元素,返回乙個使func返回值為ture的元素的序列。
例如獲取100以內的奇數:
print filter(lambda n: (n%2) == 1, range(100))當然對於上面的例子,也可以使用列表解析實現:
print [i for i in range(100) if i%2 == 1]map函式的完整形式為map(func, seq1 [, seq2...]):將函式func作用於給定序列的每乙個元素,並用乙個列表來提供返回值;如果func為none,作用同zip()。
是不是被上面的描述搞暈了,還是看例子吧:
#**輸出為:map的func為none
print map(none, [4, 5, 6])
print map(none, [1, 2, 3], [4, 5, 6])
#map 針對乙個序列
print map(lambda x: x*2, [4, 5, 6])
#map 針對多個序列
print map(lambda x, y: x + y, [1, 2, 3], [4, 5, 6])
reduce函式的完整形式為reduce(func, seq [, init]):func是乙個二元函式;reduce對seq中的每乙個元素進行迭代,每次迭代將上一次的迭代結果(第一次時使用init,如沒有init,則使用seq的第乙個元素)與下乙個元素執行func函式。
看乙個例子,通過reduce函式進行求和操作:
print reduce(lambda x, y: x + y, range(10))輸出為:print reduce(lambda x, y: x + y, range(10), 100)
根據上面的介紹,我們自己也可以實現乙個reduce函式:
def xreduce(bin_func, seq, init=none):iseq =list(seq)
if init is
none:
res =iseq.pop(0)
else
: res =init
for obj in
iseq:
res =bin_func(res,obj)
return res
python函式相關
函式的定義為 def func1 a,b,c 1,args,d kwargs pass函式定義中的引數,稱謂形參,而其中a,b稱為位置引數,c和d稱為關鍵字引數,若按順序傳參的話,c可以作位置引數來傳遞實參,而d由於位於可變引數之後,所以只能作為關鍵字引數來傳入實參,而且可變引數前的引數必須是關鍵字...
Python函式相關
對於不可變引數,函式內部操作引數不會改變實參 對於可變型別,函式內部操作會改變實參 列表,字典 全域性變數,定義時一般會在前面加 g 或 gl 列表 可以將兩個列表合併在一塊,實際就是呼叫列表的extend方法 預設引數 定義函式時,可以將某個引數定義乙個預設值,具有預設值的引數就叫預設引數 呼叫函...
Python 函式相關
這次用的是ipad pro 藍芽鍵盤 colaboatory 雲ide。不得不說谷歌還是np,免費提供雲ide,免費提供gpu訓練深度學習模型,用safari就可以寫。缺點是得全程掛vpn,而且不知道為什麼無法使用簡體中文輸入法,只好用繁體輸入法打注釋。下面是關於函式返回值的一些操作 def fun...