Python中函數(shù)的各種類型參數(shù)解讀
Python中函數(shù)的參數(shù)類型非常豐富多彩。
Python的函數(shù)支持的參數(shù)類型包括:
- (1)位置參數(shù)
- (2)默認(rèn)參數(shù)
- (3) 可變參數(shù)
- (4)關(guān)鍵字參數(shù)
- (5)命名關(guān)鍵字參數(shù)
接下來,我們一一來學(xué)習(xí)一下:
1.位置參數(shù)
位置參數(shù),就是普通的參數(shù)。寫在函數(shù)名后的小括號中,
如下面例子:
def power(x): return x * x def power(x, n): s = 1 while n > 0: n = n - 1 s = s * x return s
2.默認(rèn)參數(shù)
默認(rèn)參數(shù)允許函數(shù)設(shè)置參數(shù)的默認(rèn)值。例如:
def power(x, n = 2):......
其中參數(shù)n的默認(rèn)值為2,調(diào)用函數(shù)時,可以省略這個參數(shù),如:power(5),這里的5會賦值給x。
注意事項:
1.必選參數(shù)在前,默認(rèn)參數(shù)在后。
Why?因為Python中函數(shù)的實際參數(shù)與形式參數(shù)的匹配順序是從左至右的。
2.如何設(shè)置默認(rèn)參數(shù)?
變化大的參數(shù)放前面,變化小的參數(shù)放后面當(dāng)默認(rèn)的參數(shù)。
降低函數(shù)調(diào)用的難度。
例如:在某校的學(xué)生信息管理系統(tǒng)中,可以把年齡和城市設(shè)為默認(rèn)參數(shù)(因為都在一個城市,同年級的年齡也大都相同)。
def enroll(name, gender, age=6, city='Beijing'): print('name:', name) print('gender:', gender) print('age:', age) print('city:', city)
3.可以不按順序提供部分默認(rèn)參數(shù)。
當(dāng)不按順序提供部分默認(rèn)參數(shù)時,需要把參數(shù)名寫上。
如:
enroll('Bob', 'M', 7) enroll('Adam', 'M', city='Tianjin')
4.一個默認(rèn)參數(shù)的大坑。
先定義一個函數(shù),傳入一個list,添加一個END再返回.
def add_end(L=[]): L.append('END') return L
試著用默認(rèn)參數(shù),連續(xù)執(zhí)行add_end?
你會發(fā)現(xiàn),似乎函數(shù)每次都“記住了”上次添加了’END’后的list。
原因是:
Python函數(shù)在定義的時候,默認(rèn)參數(shù)L的值就被計算出來了,即[],因為默認(rèn)參數(shù)L也是一個變量,它指向?qū)ο骩],每次調(diào)用該函數(shù),如果改變了L的內(nèi)容,則下次調(diào)用時,默認(rèn)參數(shù)的內(nèi)容就變了,不再是函數(shù)定義時的[]了。
默認(rèn)參數(shù)強(qiáng)烈建議指向不變對象!可以用None這個不變對象來實現(xiàn)。
def add_end(L=None): if L is None: L = [] L.append('END') return L
如果可以設(shè)計一個不變對象,那就盡量設(shè)計成不變對象。
3.可變參數(shù)
參數(shù)個數(shù)不確定,可以用list和tuple來充當(dāng)參數(shù),但是需要現(xiàn)行構(gòu)造。
形式:
在參數(shù)名字前加 “*”號。
調(diào)用時可傳入任意個(包括0個)參數(shù)。
可變參數(shù)在調(diào)用時自動組裝為一個tuple。
list參數(shù)和tuple參數(shù)前加“*”可作為可變參數(shù)使用。
接下來,我們用例子來學(xué)習(xí)一下可變參數(shù)的用法。
需求:計算
利用list或tuple為參數(shù),可實現(xiàn)如下代碼:
def calc(numbers): sum = 0 for n in numbers: sum = sum + n * n return sum >>> calc([1, 2, 3]) 14 >>> calc((1, 3, 5, 7)) 84
但是用戶在調(diào)用函數(shù)時,需要事先構(gòu)造好一個list或tuple的數(shù)據(jù)集。
如果是用可變參數(shù),用戶可以直接輸入數(shù)據(jù)集,用逗號隔開,并且數(shù)據(jù)個數(shù)無硬性限制。
def calc(*numbers): sum = 0 for n in numbers: sum = sum + n * n return sum >>> calc(1, 2) 5 >>> calc() 0
在調(diào)用具有可變參數(shù)的函數(shù)時,可以利用list或tuple前加星號的形式來充當(dāng)可變參數(shù)實參。
如:
>>> nums = [1, 2, 3] >>> calc(*nums) 14
4.關(guān)鍵字參數(shù)
關(guān)鍵字參數(shù)擴(kuò)展函數(shù)的功能。 允許你傳入0個或任意個含參數(shù)名的參數(shù),在函數(shù)內(nèi)部自動組裝為一個dict。
如:
def person(name, age, **kw): print('name:', name, 'age:', age, 'other:', kw) >>> person('Michael', 30) name: Michael age: 30 other: {} >>> person('Bob', 35, city='Beijing') name: Bob age: 35 other: {'city': 'Beijing'} >>> person('Adam', 45, gender='M', job='Engineer') name: Adam age: 45 other: {'gender': 'M', 'job': 'Engineer'}
一個dict參數(shù)可以當(dāng)成一個關(guān)鍵字參數(shù)
>>> extra = {'city': 'Beijing', 'job': 'Engineer'} >>> person('Jack', 24, **extra) name: Jack age: 24 other: {'city': 'Beijing', 'job': 'Engineer'}
注意:person函數(shù)內(nèi)部對extra的改變是改變的extra的副本,對extra這個dict本身并沒有做出改變。
試想你正在做一個用戶注冊的功能,除了用戶名和年齡是必填項外,其他都是可選項,利用關(guān)鍵字參數(shù)來定義這個函數(shù)就能滿足注冊的需求。
可變參數(shù)和關(guān)鍵字參數(shù)使用時機(jī)和形式
可變參數(shù):
- 定義函數(shù)時,形式參數(shù)+‘*’,表示可變參數(shù),使用時,直接輸入可變數(shù)量的參數(shù)
- 使用函數(shù)時,實際參數(shù)+‘*’,實際參數(shù)本身必須是一個list或者touple。
關(guān)鍵字參數(shù):
- 定義函數(shù)時,形式參數(shù)+‘**’,表示關(guān)鍵字參數(shù),使用時,直接以“鍵=‘值’”的形式輸入
- 使用函數(shù)時,實際參數(shù)+‘**’,實際參數(shù)本身必須是一個dict
5.命名關(guān)鍵字參數(shù)
命名關(guān)鍵字參數(shù):限制關(guān)鍵字參數(shù)的名字。例如:只接收city和job作為關(guān)鍵字參數(shù)。
def person(name, age, *, city, job): print(name, age, city, job)
一個特殊分隔符“*”,*后面的參數(shù)被視為命名關(guān)鍵字參數(shù)。
>>> person('Jack', 24, city='Beijing', job='Engineer') Jack 24 Beijing Engineer
如果函數(shù)定義中已經(jīng)有了一個可變參數(shù),后面跟著的命名關(guān)鍵字參數(shù)就不再需要一個特殊分隔符*了:
def person(name, age, *args, city, job): print(name, age, args, city, job)
命名關(guān)鍵字參數(shù)必須傳入?yún)?shù)名,否則報錯
命名關(guān)鍵字參數(shù)可以有缺省值
def person(name, age, *, city='Beijing', job): print(name, age, city, job) >>> person('Jack', 24, job='Engineer') Jack 24 Beijing Engineer
6.參數(shù)的組合
在Python中定義函數(shù),可以用必選參數(shù)、默認(rèn)參數(shù)、可變參數(shù)、關(guān)鍵字參數(shù)和命名關(guān)鍵字參數(shù),這5種參數(shù)都可以組合使用。
參數(shù)定義的順序必須是:必選參數(shù)、默認(rèn)參數(shù)、可變參數(shù)、命名關(guān)鍵字參數(shù)和關(guān)鍵字參數(shù)。
7.練習(xí)
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) f1(1,2) f1(1,2,3) f1(1,2,3,'a','b') f1(1,2,3,'a','b',x = 99) f2(1,2,3,d = 'aaa',ext = None) args = (1,2,3,4) kw = {'d':99,'x':'#'} f1(*args,**kw) args = (1,2,3) kw = {'d':99,'x':'#'} f2(*args,**kw)
答案:
a = 1 b = 2 c = 0 args = () kw = {} a = 1 b = 2 c = 3 args = () kw = {} a = 1 b = 2 c = 3 args = ('a', 'b') kw = {} a = 1 b = 2 c = 3 args = ('a', 'b') kw = {'x': 99} a = 1 b = 2 c = 3 d = aaa kw = {'ext': None} a = 1 b = 2 c = 3 args = (4,) kw = {'d': 99, 'x': '#'} a = 1 b = 2 c = 3 d = 99 kw = {'x': '#'}
8.參數(shù)組合
對于任意函數(shù),都可以通過類似func(*args, **kw)的形式調(diào)用它,無論它的參數(shù)是如何定義的。
不要同時使用太多的組合,否則函數(shù)接口的可理解性很差。
例如:
#以下函數(shù)允許計算兩個數(shù)的乘積,請稍加改造,變成可接收一個或多個數(shù)并計算乘積 def product(x, y): return x * y
測試程序如下:
print('product(5) =', product(5)) print('product(5, 6) =', product(5, 6)) print('product(5, 6, 7) =', product(5, 6, 7)) print('product(5, 6, 7, 9) =', product(5, 6, 7, 9)) if product(5) != 5: print('測試失敗!') elif product(5, 6) != 30: print('測試失敗!') elif product(5, 6, 7) != 210: print('測試失敗!') elif product(5, 6, 7, 9) != 1890: print('測試失敗!') else: try: product() print('測試失敗!') except TypeError: print('測試成功!')
答案:
def product(x, *num): for n in num: x = x * n return x
9.參數(shù)解包(拆包)
傳遞實參時,可以在序列類型的參數(shù)前添加星號,這樣他會自動將序列中的元素依次作為參數(shù)傳遞。
例如:
def fn1(a,b,c): print(a, b, c) x = (1,2,3) # 元組數(shù)據(jù) y = [4,5,6] # 列表數(shù)據(jù) z = {'a':7, 'b':8, 'c':9} # 字典數(shù)據(jù) fn1(*x) # 元組解包 * fn1(*y) # 列表解包 * fn1(**z) # 字典解包 通過 **對字典進(jìn)行解包 # 輸出為 1 2 3 4 5 6 7 8 9
總結(jié)
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
python使用requests?POST提交一個鍵多個值方式
這篇文章主要介紹了python使用requests?POST提交一個鍵多個值方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-02-02anaconda升級sklearn版本的實現(xiàn)方法
這篇文章主要介紹了anaconda升級sklearn版本的實現(xiàn)方法,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2021-02-02Python學(xué)習(xí)之.iloc與.loc的區(qū)別、聯(lián)系和用法
loc和iloc都是pandas工具中定位某一行的函數(shù),下面這篇文章主要給大家介紹了關(guān)于Python學(xué)習(xí)之.iloc與.loc的區(qū)別、聯(lián)系和用法的相關(guān)資料,文中通過實例代碼介紹的非常詳細(xì),需要的朋友可以參考下2022-05-05Python雙精度浮點數(shù)運(yùn)算并分行顯示操作示例
這篇文章主要介紹了Python雙精度浮點數(shù)運(yùn)算并分行顯示操作,涉及Python數(shù)學(xué)運(yùn)算及顯示相關(guān)操作技巧,注釋備有詳盡的說明,需要的朋友可以參考下2017-07-07Python數(shù)據(jù)結(jié)構(gòu)與算法之完全樹與最小堆實例
這篇文章主要介紹了Python數(shù)據(jù)結(jié)構(gòu)與算法之完全樹與最小堆,結(jié)合實例形式分析了Python完全樹定義及堆排序功能實現(xiàn)相關(guān)操作技巧,需要的朋友可以參考下2017-12-12解決Python 爬蟲URL中存在中文或特殊符號無法請求的問題
今天小編就為大家分享一篇解決Python 爬蟲URL中存在中文或特殊符號無法請求的問題。這種問題,初學(xué)者應(yīng)該都會遇到,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2018-05-05在Python中獲取兩數(shù)相除的商和余數(shù)方法
今天小編就為大家分享一篇在Python中獲取兩數(shù)相除的商和余數(shù)方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2018-11-11