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