徹底掌握Python函數(shù)的5種參數(shù)

原文地址:5 Types of Arguments in Python Function Definition
原文作者:Indhumathy Chelliah
譯文出自:掘金翻譯計(jì)劃 本文永久鏈接:https://github.com/xitu/gold-miner/blob/master/article/2020/5-types-of-arguments-in-python-function-definition.md 譯者:Zhengjian-L
Python 函數(shù)定義:
關(guān)鍵字 def 引入一個(gè)函數(shù)定義。它后面必須跟著函數(shù)名稱(chēng)和帶括號(hào)的形式參數(shù)列表。構(gòu)成函數(shù)體的語(yǔ)句從下一行開(kāi)始,并且必須縮進(jìn)。

在定義的函數(shù)中需要提及形式參數(shù)。實(shí)際參數(shù)在函數(shù)調(diào)用時(shí)傳遞。
我們可以用各種參數(shù)來(lái)定義函數(shù)。
1. 缺省參數(shù)
缺省參數(shù)是在定義函數(shù)時(shí)提供的值。 賦值符號(hào) =用于聲明參數(shù)的默認(rèn)值。在調(diào)用函數(shù)時(shí),參數(shù)默認(rèn)值是可變更項(xiàng)。 如果在調(diào)用函數(shù)時(shí)提供缺省參數(shù)的值,這個(gè)值會(huì)替代默認(rèn)值。 一個(gè)函數(shù)可以有任意數(shù)量的缺省參數(shù)。 缺省參數(shù)要在非缺省參數(shù)之后。
例:b,c在下面的例子中,參數(shù)b,c指定了默認(rèn)值。
def add(a,b=5,c=10):
return (a+b+c)
這個(gè)函數(shù)有三種調(diào)用方式
(1)只給出必需參數(shù)
print(add(3))
#Output:18
(2)給出一個(gè)可選的參數(shù) 3 賦值給 a, 4 賦值給 b。
print(add(3,4))
#Output:14
(3)給出所有參數(shù)
print(add(2,3,4))
#Output:9
注意: 默認(rèn)值在函數(shù)定義處的定義過(guò)程中只會(huì)計(jì)算一次。因此,在把如列表、字典等可變對(duì)象作為默認(rèn)值時(shí)會(huì)有些許不同。
2. 關(guān)鍵字參數(shù)
也可以使用形如kwarg=value的關(guān)鍵字參數(shù)來(lái)調(diào)用函數(shù)。
在調(diào)用函數(shù)時(shí),參數(shù)值并不需要與函數(shù)定義中的參數(shù)順序相同。這可以通過(guò)關(guān)鍵字參數(shù)實(shí)現(xiàn)。但所有的關(guān)鍵字參數(shù)必須與函數(shù)定義中的參數(shù)一一對(duì)應(yīng)。
def add(a,b=5,c=10):
return (a+b+c)
調(diào)用函數(shù) function add 時(shí)提供關(guān)鍵字參數(shù)
(1)所有的參數(shù)都是關(guān)鍵字參數(shù),因此不需要固定順序。
print (add(b=10,c=15,a=20))
#Output:45
(2)調(diào)用函數(shù)時(shí),只給出必要參數(shù)作為關(guān)鍵字參數(shù),可選缺省參數(shù)就會(huì)跳過(guò)。
print (add(a=10))
#Output:25
3. 位置參數(shù)
調(diào)用函數(shù)時(shí),參數(shù)傳遞的值的順序和形式參數(shù)的順序需要對(duì)應(yīng)。這稱(chēng)之為位置參數(shù)。位置參數(shù)之后只能是關(guān)鍵字參數(shù)。
def add(a,b,c):
return (a+b+c)
上面的函數(shù)有兩種調(diào)用的方式:
(1)調(diào)用函數(shù)時(shí),參數(shù)均為位置參數(shù)。參數(shù)傳遞的值會(huì)通過(guò)位置傳遞到對(duì)應(yīng)參數(shù)。10 賦值給a,20賦值給b 和 30 賦值給 c。
print (add(10,20,30))
#Output:60
(2)在混合使用位置參數(shù)和關(guān)鍵字參數(shù)時(shí),關(guān)鍵字參數(shù)總是在位置參數(shù)之后。
print (add(10,c=30,b=20))
#Output:60
缺省參數(shù)、位置參數(shù) 、關(guān)鍵字參數(shù)三者對(duì)比:

關(guān)鍵要點(diǎn):
1. 缺省參數(shù)需要在非缺省參數(shù)之后
def add(a=5,b,c):
return (a+b+c)
#Output:SyntaxError: non-default argument follows default argument
2. 關(guān)鍵字參數(shù)需要在位置參數(shù)之后
def add(a,b,c):
return (a+b+c)
print (add(a=10,3,4))
#Output:SyntaxError: positional argument follows keyword argument
3. 所有傳遞的關(guān)鍵字參數(shù)必須有對(duì)應(yīng)參數(shù),并且順序不重要。
def add(a,b,c):
return (a+b+c)
print (add(a=10,b1=5,c=12))
#Output:TypeError: add() got an unexpected keyword argument 'b1'
4. 參數(shù)只能賦值一次
def add(a,b,c):
return (a+b+c)
print (add(a=10,b=5,b=10,c=12))
#Output:SyntaxError: keyword argument repeated
5. 缺省參數(shù)是可選參數(shù)
例 1: 只給必要參數(shù)
def add(a,b=5,c=10):
return (a+b+c)
print (add(2))
#Output:17
例 2: 給出所有參數(shù)(必要參數(shù)和可選參數(shù))
def add(a,b=5,c=10):
return (a+b+c)
print (add(2,3,4))
#Output:9
可變長(zhǎng)度參數(shù)
可變長(zhǎng)度參數(shù)也稱(chēng)為任意參數(shù)。如果我們事先不知道函數(shù)的參數(shù)數(shù)量,可以使用任意參數(shù)。
兩種任意參數(shù)
任意位置參數(shù) 任意關(guān)鍵字參數(shù)
4. 任意位置參數(shù)
對(duì)于任意位置參數(shù),函數(shù)定義的參數(shù)前會(huì)有一個(gè)星號(hào)(*),該參數(shù)可以包含非關(guān)鍵字可變長(zhǎng)度參數(shù)。這些參數(shù)將包含在一個(gè)元組中。在可變數(shù)量的參數(shù)之前,可能會(huì)出現(xiàn)零個(gè)或多個(gè)普通參數(shù)。
def add(*b):
result=0
for i in b:
result=result+i
return result
print (add(1,2,3,4,5))
#Output:15
print (add(10,20))
#Output:30
5.任意關(guān)鍵字參數(shù)
對(duì)于任意關(guān)鍵字參數(shù),函數(shù)定義的參數(shù)前會(huì)有雙星號(hào)(*),該參數(shù)可以包含非關(guān)鍵字可變長(zhǎng)度參數(shù)。
def fn(**a):
for i in a.items():
print (i)
fn(numbers=5,colors="blue",fruits="apple")
'''
Output:
('numbers', 5)
('colors', 'blue')
('fruits', 'apple')
'''
特殊參數(shù):
根據(jù) Python 手冊(cè)
默認(rèn)情況下,函數(shù)的參數(shù)傳遞形式可以是位置參數(shù)或是顯式的關(guān)鍵字參數(shù)。為了確保可讀性和運(yùn)行效率,限制允許的參數(shù)傳遞形式是有意義的,這樣開(kāi)發(fā)者只需查看函數(shù)定義即可確定參數(shù)項(xiàng)是僅按位置、按位置也按關(guān)鍵字,還是僅按關(guān)鍵字傳遞。
函數(shù)的定義看起來(lái)可以像是這樣:

在這里/ 和 * 是可選的。如果使用這些符號(hào)則表明可以通過(guò)何種形參將參數(shù)值傳遞給函數(shù):僅限位置、位置或關(guān)鍵字,以及僅限關(guān)鍵字。
位置或關(guān)鍵字參數(shù) 僅限位置參數(shù) 僅限關(guān)鍵字參數(shù)
(1) 位置或關(guān)鍵字參數(shù)
如果函數(shù)定義中未使用 / 和 *,則參數(shù)可以按位置或按關(guān)鍵字傳遞給函數(shù)。
def add(a,b,c):
return a+b+c
print (add(3,4,5))
#Output:12
print (add(3,c=1,b=2))
#Output:6
(2) 僅限位置參數(shù)
在定義的函數(shù)中,僅限位置參數(shù)要放在/(正斜杠)之前。這個(gè)/被用來(lái)從邏輯上分隔僅限位置形參和其他形參。在/之后的形參可以為位置或關(guān)鍵字或者僅限關(guān)鍵字。
def add(a,b,/,c,d):
return a+b+c+d
print (add(3,4,5,6))
#Output:18
print (add(3,4,c=1,d=2))
#Output:10
如果將關(guān)鍵字參數(shù)規(guī)定為僅限位置參數(shù),則會(huì)導(dǎo)致TypeError。
def add(a,b,/,c,d):
return a+b+c+d
print (add(3,b=4,c=1,d=2))
#Output:TypeError: add() got some positional-only arguments passed as keyword arguments: 'b'
(3)僅限關(guān)鍵字參數(shù)
要將形參標(biāo)記為僅限關(guān)鍵字,應(yīng)在參數(shù)列表的第一個(gè)僅限關(guān)鍵字形參前放置一個(gè) *。
def add(a,b,*,c,d):
return a+b+c+d
print (add(3,4,c=1,d=2))
#Output:10
如果將位置參數(shù)規(guī)定為僅限關(guān)鍵字參數(shù),則會(huì)導(dǎo)致TypeError。
def add(a,b,*,c,d):
return a+b+c+d
print (add(3,4,1,d=2))
#Output:TypeError: add() takes 2 positional arguments but 3 positional arguments (and 1 keyword-only argument) were given
在同一個(gè)函數(shù)中的擁有三種參數(shù)的調(diào)用規(guī)則
在下面的例子中,function add 擁有所有三種參數(shù)
a,b — 僅限位置參數(shù) c - 位置或關(guān)鍵字參數(shù) d - 僅限關(guān)鍵字參數(shù)
def add(a,b,/,c,*,d):
return a+b+c+d
print (add(3,4,1,d=2))
#Output:10
注意事項(xiàng):
當(dāng)你希望參數(shù)的名稱(chēng)對(duì)用戶(hù)不可用時(shí),則使用僅限位置。當(dāng)參數(shù)名稱(chēng)沒(méi)有實(shí)際意義時(shí),這很有用。 如果你想規(guī)定調(diào)用函數(shù)的參數(shù)數(shù)據(jù)時(shí),則使用僅限位置。 當(dāng)名稱(chēng)有意義且定義的函數(shù)通過(guò)名稱(chēng)變得更易于理解時(shí),則使用僅限關(guān)鍵字。 當(dāng)你想要避免用戶(hù)依賴(lài)傳遞的參數(shù)的位置時(shí),則使用僅限關(guān)鍵字。

近期熱門(mén)文章推薦:

