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)
deff2
(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種引數,但不要同時使用太多的組合,否則函式介面的可理解性很差。
python3 函式 必選引數與預設引數
位置引數須以正確的順序傳入函式。呼叫時的數量必須和宣告時的一樣。def power x,n s 1 while n 0 n n 1s s x return sprint pow 5,3 125 修改後的power x,n 函式有兩個引數 x和n,這兩個引數都是位置引數,呼叫函式時,傳入的兩個值按照位...
函式的引數(必選,預設,可變,關鍵字)
python的函式具有非常靈活的引數形態,既可以實現簡單的呼叫,又可以傳入非常複雜的引數。預設引數一定要用不可變物件 如果是可變物件,執行會有邏輯錯誤!1 他們是啥?幹啥的?簡單說 定義函式接收的引數可以接收任意個,或者呼叫函式傳引數時候傳任意個。args是可變引數,收集所有位置引數,儲存為乙個tu...
Python 函式的引數 預設引數
預設引數很有用,但使用不當,也會掉坑里。預設引數有個最大的坑,演示如下 先定義乙個函式,傳入乙個list,新增乙個end再返回 def add end l return l當你正常呼叫時,結果似乎不錯 add end 1,2,3 1,2,3,end add end x y z x y z end 當...