函式的引數(必選,預設,可變,關鍵字)

2022-03-04 17:17:06 字數 1890 閱讀 4770

python的函式具有非常靈活的引數形態,既可以實現簡單的呼叫,又可以傳入非常複雜的引數。

預設引數一定要用不可變物件

,如果是可變物件,執行會有邏輯錯誤!

(1)他們是啥?幹啥的?

簡單說:定義函式接收的引數可以接收任意個,或者呼叫函式傳引數時候傳任意個。

*args是可變引數,收集所有位置引數,儲存為乙個tuple;

**kwargs是關鍵字引數,收集所有關鍵字引數(簡單說:就是鍵值對引數!),儲存為乙個dict。

(2)呼叫函式時,如何傳入可變引數和關鍵字引數?以及他們的語法?

可變引數既可以直接傳入:func(1, 2, 3),又可以先組裝list或tuple,再通過*args傳入:func(*(1, 2, 3))

關鍵字引數既可以直接傳入:func(a=1, b=2),又可以先組裝dict,再通過**kwargs傳入:func(**)

在python中定義函式,可以用必選引數、預設引數、可變引數、關鍵字引數和命名關鍵字引數,這5種引數都可以組合使用。

但是請注意,引數定義的順序必須是:必選引數、預設引數、可變引數、命名關鍵字引數和關鍵字引數。

函式定義: 

定義乙個函式,包含上述若干種引數:

def f1(a, b, c=0, *args, **kw):

print('a =', a, 'b =', b, 'c =', c, 'args =', args, 'kw =', kw)

def f2(a, b, c=0, *, d, **kw):

print('a =', a, 'b =', b, 'c =', c, 'd =', d, 'kw =', kw)

函式呼叫:

在函式呼叫的時候,python直譯器自動按照引數位置和引數名把對應的引數傳進去。

1 >>> f1(1, 2)

2 a = 1 b = 2 c = 0 args = () kw ={}

3 >>> f1(1, 2, c=3)

4 a = 1 b = 2 c = 3 args = () kw ={}

5 >>> f1(1, 2, 3, '

a', 'b'

)6 a = 1 b = 2 c = 3 args = ('

a', '

b') kw ={}

7 >>> f1(1, 2, 3, '

a', '

b', x=99)

8 a = 1 b = 2 c = 3 args = ('

a', '

b') kw =

9 >>> f2(1, 2, d=99, ext=none)

10 a = 1 b = 2 c = 0 d = 99 kw =

最神奇的是通過乙個tuple和dict,你也可以呼叫上述函式:

1 >>> args = (1, 2, 3, 4)

2 >>> kw =

3 >>> f1(*args, **kw)

4 a = 1 b = 2 c = 3 args = (4,) kw =

5 >>> args = (1, 2, 3)

6 >>> kw =

7 >>> f2(*args, **kw)

8 a = 1 b = 2 c = 3 d = 88 kw =

所以,對於任意函式,都

可以通過類似

func(*args, **kw)的形式呼叫它,無論它的引數是如何定義的。

雖然可以組合多達5種引數,但不要同時使用太多的組合,否則函式介面的可理解性很差。

python函式的引數(必選,預設,可變,關鍵字)

python的函式具有非常靈活的引數形態,既可以實現簡單的呼叫,又可以傳入非常複雜的引數。預設引數一定要用不可變物件,如果是可變物件,執行會有邏輯錯誤!1 他們是啥?幹啥的?簡單說 定義函式接收的引數可以接收任意個,或者呼叫函式傳引數時候傳任意個。args是可變引數,收集所有位置引數,儲存為乙個tu...

python關鍵字引數與可變引數

關鍵字引數可以傳入0或者多個引數名的引數,這些引數在函式定義中並沒有出現,這些引數在函式內部自動封裝整合乙個字典 dict 通常來講關鍵字引數是放在函式引數列表的最後,通過乙個demo 來看 def write msg id,kwargs msg for key,val in kwargs.item...

python關鍵字和非關鍵字引數(可變長引數)

可變長引數存在的意義是 每次呼叫乙個函式處理不同量的引數輸入。即,引數在呼叫之前輸入的引數數量是未知的,或者多次呼叫該函式,每次的引數輸入的量是不一致的 可變長引數分為非關鍵字和關鍵字型別,分別對應元組和字典,如下定義乙個類,功能是列印出輸入的函式 class test def keyword se...