Python函式相關

2022-03-07 22:26:28 字數 3975 閱讀 5310

python中的函式也是一種物件,而且函式還是一等公民。函式能作為引數,也能作為返回值,這使得python中的函式變得很靈活。想想前面兩篇中介紹的通過內嵌函式實現的裝飾器和閉包。

下面就介紹一下python函式相關的一寫內容。

在程式設計的過程中,可能會遇到函式引數個數不固定的情況,這時就需要使用可變長度的函式引數。在python函式定義中,使用*和**符號分別指定元組(非關鍵字)和字典(關鍵字)作為引數。

當函式被呼叫的時候,所有的引數都將值賦給了在函式宣告中對應的區域性變數,剩下的非關鍵字引數按照順序新增到乙個元組中便於訪問。

可變長元組引數必須在位置和預設引數之後,所以使用可變長元組引數的函式形式一般如下(中括號表示可選引數),可變長元組引數前有乙個"*"符號:

def funcname([fromal_args,] *tuple_grp_nonkw_args):

pass

看乙個例子:

def argfunc(positional_arg, keyword_arg="

foo", *tuple_grp_nonkw_args):

print

"positional_arg:

", positional_arg

print

"keyword_arg:

", keyword_arg

for arg in

tuple_grp_nonkw_args:

print

"additional_arg:

", arg

argfunc(3)

print

argfunc(3, 4)

print

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):

print

"positional_arg:

", positional_arg

print

"keyword_arg:

", keyword_arg

for arg in

tuple_grp_nonkw_args:

print

"additional non-keyword arg:

", arg

for argkey in

dict_grp_kw_args.keys():

print

"additional keyword arg:

" %(argkey, dict_grp_kw_args[argkey])

argfunc(3, 4, name="

wilber

", age=28)

print

argfunc(3, 4, "

hello

", "

world

", name="

wilber

", age=28)

print

**輸出為:

函式呼叫的完整形式為:

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+y

print

addnum

print

"3 + 4 =

", addnum(3, 4)

python可以很好的支援物件導向程式設計,但是通過python中以下幾個內建函式和lambda表示式,也可以體驗一下函式式程式設計。

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...