目錄
可變引數
可變位置引數
可變關鍵字引數
混合使用
強制關鍵字引數
預設引數
python函式的引數非常靈活:
不同型別的引數,定義時順序很重要(必須按以下順序給出不同型別引數):
def func(positional_args, keyword_args, *tuple_grp_args, **dict_kw_args):
# ...
定義引數時前面加乙個星號*
,表示這個引數是可變的,可以接受任意多個引數,這些引數構成乙個元組(只能通過位置引數傳遞)。
傳遞引數時,可迭代物件(元組、列表)可通過在前面加乙個星號*
,解構成位置引數(依次把元素傳遞給函式)。
def calcsum(*numbers):
sum = 0
for n in numbers:
sum += n
return sum
print(calcsum())
print(calcsum(1,2,3))
print(calcsum(*(1,2,3)))
print(calcsum(*[1,2,3]))
定義引數時前面加兩個星號**
,表示這個引數為可變關鍵字引數,可以接受任意多個引數,這些引數構成乙個字典,只能通過關鍵字引數傳遞。
傳遞引數時,字典物件(key必須為str型別)可通過在前面加兩個星號**
,解構為關鍵字引數。
def add(a,b):
return a+b
data =
print(add(**data)) #關鍵字引數解構
當可變位置引數和可變關鍵字引數一起使用時候,可變位置引數必須在前。
def fn(x,y,*args,**kwargs):
print(x) # 1
print(y) # 2
print(args) # (3,4,5)
print(kwargs) #
fn(1,2,3,4,5,a=6,b=7)
關鍵字引數能夠使函式呼叫意圖更加明確;對於容易混淆引數的函式,可以宣告只能以關鍵字形式給出的引數(特殊引數*
以後的引數,都是強制關鍵字引數)。
# key與value引數只能以關鍵字引數方式給出
def keyparam(one, *, key, value='v'):
print(one, key, value)
if __name__=="__main__":
keyparam(1, key='one')
keyparam(1, key='one', value='one-1')
引數的預設值,會在每個模組載入時(很多模組會在程式啟動時載入)求出;模組一旦載入,引數的預設值就固定不變了;而且所有使用預設引數的函式都共享此預設值,若預設值為動態值(如字典、列表等),會產生奇怪的行為(任何乙個函式對其的修改,都會影響其他函式)。
def logmsg(msg:str, when=datetime.datetime.now()):
print(when, msg)
def logmsg2(msg:str, when=none):
when = when if when else datetime.datetime.now()
print(when, msg)
if __name__=="__main__":
logmsg('one-befor')
logmsg2('two-befor')
print('wait one second')
time.sleep(1)
logmsg('one-after')
logmsg2('two-after')
# one-befor與one-after的時間是相同的,都是模組載入時的時間
注意:若引數預設型別是可變型別,一定用none作為預設值,然後在**中設定所需的預設值。如下所示,getcode呼叫會不斷累加預設值(作為預設值的列表,會不斷的追加內容):
def getcode(msg:str, code:list=):
print(code)
def getcode2(msg:str, code:list=none):
if code is none:
code =
print(code
if __name__=="__main__":
getcode('one') # ['one']
getcode2('one') # ['one']
getcode('two') # ['one', 'two']
getcode2('two') # ['two']
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 當...
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 預設引數 Python預設引數有坑?
最近有小夥伴在面試中遇到了 關於函式預設引數的坑 的題目,少數夥伴對此問題理得不是太清楚,今天匯智妹請到匯智動力高階教師鄧老師為大家詳細講解一下,幫助不太清楚的小夥伴清晰的梳理一遍。鄧老師本次主要從以下三點來講解 什麼是預設引數?函式預設引數的坑是什麼?函式預設引數為什麼會有坑?一 什麼是預設引數 ...