定義函數(shù)時(shí)()
里的參數(shù)叫做形參(形式參數(shù)),它只是一個變量名赫段,接受調(diào)用時(shí)傳遞的實(shí)參,僅供函數(shù)體中的代碼調(diào)用矢赁。
函數(shù)調(diào)用時(shí),傳入()
里的參數(shù)叫實(shí)參(實(shí)際參數(shù))贬丛,它是實(shí)際的數(shù)據(jù)撩银,會傳遞給形參。
形參
根據(jù)形參的功能和定義方式可以分為:
- 必須參數(shù)
- 默認(rèn)參數(shù)
- 動態(tài)參數(shù)
- 位置動態(tài)參數(shù)
- 關(guān)鍵字動態(tài)參數(shù)
必須參數(shù)
在定義函數(shù)時(shí)豺憔,如果要求調(diào)用者必須傳遞實(shí)參給這個形參额获,那么這個形參就要定義為必須形參够庙。
直接定義在函數(shù)名后的()
里的形參就是必須形參。
例如上一節(jié)中的my_print
函數(shù)中的content
和count
抄邀。我們再來看一個案例:
定義一個函數(shù)耘眨,接收兩個數(shù),然后打印它們的和
>>> def add(x,y):
... print(x+y)
>>> add(1) # 調(diào)用時(shí)必須傳遞實(shí)參給必須參數(shù)境肾,否則報(bào)錯
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: add() missing 1 required positional argument: 'y'
>>> add(1,2)
3
默認(rèn)參數(shù)
在定義函數(shù)時(shí)剔难,某些形參有默認(rèn)值,在調(diào)用時(shí)可以不接收實(shí)參奥喻,這種情況就可以定義為默認(rèn)形參偶宫。
在函數(shù)名后()
中,以參數(shù)名=默認(rèn)值
的形式定義的形參就是必須參數(shù)环鲤。
注意:默認(rèn)參數(shù)必須定義在必須參數(shù)的后面
案例:
定義一個函數(shù)纯趋,它接收兩個參數(shù)content
和count
content
是函數(shù)要打印的內(nèi)容
count
是函數(shù)打印的次數(shù),如果不傳遞count
默認(rèn)打印1
次
>>> def my_print(content, count=1):
... for i in range(count):
... print(content)
# 調(diào)用
>>> my_print('好好學(xué)習(xí)冷离,天天向上吵冒!')
'好好學(xué)習(xí),天天向上西剥!'
>>> my_print('好好學(xué)習(xí)桦锄,天天向上!', 2)
'好好學(xué)習(xí)蔫耽,天天向上结耀!'
'好好學(xué)習(xí),天天向上匙铡!'
調(diào)用函數(shù)時(shí)傳遞實(shí)參給默認(rèn)形參會覆蓋默認(rèn)值图甜。
動態(tài)參數(shù)
在定義函數(shù)時(shí),不確定在調(diào)用時(shí)會傳遞多少個實(shí)參鳖眼,可以定義為動態(tài)形參黑毅。
動態(tài)形參根據(jù)實(shí)參的傳遞方式又分為兩種。
位置動態(tài)參數(shù)
在函數(shù)名后的()
中钦讳,在形參前加*
號矿瘦,這個形參就被定義為位置動態(tài)參數(shù),通常位置動態(tài)參數(shù)的參數(shù)名為args
愿卒。
它用來接收函數(shù)調(diào)用時(shí)缚去,以位置形式傳遞過來的超過形參數(shù)量的多余的實(shí)參。
注意:位置動態(tài)參數(shù)必須定義在默認(rèn)參數(shù)后面琼开。
位置動態(tài)參數(shù)會將所有多余的位置實(shí)參創(chuàng)建成一個元組易结。
>>> def func(a, *args):
... print(args, type(args))
>>> func(1,2,3,4)
(2, 3, 4) <class 'tuple'>
案例:
定義一個函數(shù),接受2個以上的數(shù),打印它們的和搞动。
>>> def add(x, y, *args):
... sum = x + y
... for i in args:
... sum += i
... print(sum)
>>> add(1, 2, 3, 4)
10
關(guān)鍵字動態(tài)參數(shù)
在函數(shù)名后的()
中躏精,在形參前加**
號,這個形參就被定義為關(guān)鍵字動態(tài)參數(shù)鹦肿,通常關(guān)鍵字動態(tài)參數(shù)的參數(shù)名為kwargs
矗烛。
它用來接收函數(shù)調(diào)用時(shí),以關(guān)鍵字形式傳遞過來的超過形參數(shù)量的多余的實(shí)參箩溃。
注意:關(guān)鍵字動態(tài)參數(shù)必須定義在位置動態(tài)參數(shù)的后面瞭吃。
關(guān)鍵字動態(tài)參數(shù)會將多余的關(guān)鍵字實(shí)參創(chuàng)建成一個字典
>>> def func(a, **kwargs):
... print(kwargs, type(kwargs))
>>> func(a=1,b=2,c=3,d=4)
{'b': 2, 'c': 3, 'd': 4} <class 'dict'>
實(shí)參
調(diào)用函數(shù)時(shí)傳遞實(shí)參有兩種方式:
- 位置傳遞
- 關(guān)鍵字傳遞
位置傳遞
調(diào)用函數(shù)時(shí),在小括號中以(實(shí)參1,實(shí)參2,...)
的形式傳遞的實(shí)參會按照位置與形參一一對應(yīng)碾篡,以這種方式傳遞的實(shí)參叫做位置實(shí)參虱而。
案例:
定義一個函數(shù)實(shí)現(xiàn)打印一個數(shù)的n
次冪。
>>> def my_power(x, n):
... print(x**n)
>>> my_power(3,2) # 3傳遞給x,2傳遞給n
9
>>> my_power(2,3) # 2傳遞給x,3傳遞給n
8
關(guān)鍵字傳遞
調(diào)用函數(shù)時(shí)开泽,在小括號中以(形參1=實(shí)參1,形參2=實(shí)參2,...)
的形式牡拇,顯式的指定形參與實(shí)參的對應(yīng)關(guān)系,以這種方式傳遞的實(shí)參叫做關(guān)鍵字實(shí)參穆律。
注意:關(guān)鍵字實(shí)參必須寫在位置實(shí)參的后面惠呼。
案例:
使用關(guān)鍵字的方式調(diào)用my_power
函數(shù)
>>> my_power(x=3,n=2)
9
>>> my_power(n=2,x=3)
9
>>> my_power(3,n=2)
9
參數(shù)解包
當(dāng)一個函數(shù)接收多個參數(shù)時(shí),如果參數(shù)存儲在一個列表或一個字典中時(shí)峦耘,調(diào)用起來非常不方便剔蹋。看下面的案例:
>>> def func(a, *args):
... print(args, type(args))
>>> ls = [1,2,3,4,5,6]
>>> fun(ls[0],ls[1],ls[2],ls[3],ls[4],ls[5])
1 2 (3, 4, 5, 6)
>>> def func(a, **kwargs):
... print(kwargs, type(kwargs))
>>> dc = {'a': 1, 'b': 2, 'c': 3, 'd': 4}
>>> fun(a=dc['a'], b=dc['b'], c=dc['c'], d=dc['d'])
1 2 {'c': 3, 'd': 4}
可以看到上面的案例調(diào)用時(shí)的不便辅髓,參數(shù)解包就是為了解決這些問題的泣崩。
*
解包
在傳遞實(shí)參時(shí),可以通過*
對可迭代對象進(jìn)行解包洛口。
>>> func(ls[0],ls[1],ls[2],ls[3],ls[4],ls[5])
1 2 (3, 4, 5, 6)
>>> func(*ls) # 與上面的寫法等價(jià)
1 2 (3, 4, 5, 6)
**
解包
在傳遞實(shí)參時(shí)矫付,可以通過**
對字典進(jìn)行解包。
>>> fun(a=dc['a'], b=dc['b'], c=dc['c'], d=dc['d'])
1 2 {'c': 3, 'd': 4}
>>> fun(**dc) # 與上面的寫法等價(jià)
1 2 {'c': 3, 'd': 4}