Python函式引數型別與預設引數

2021-10-04 22:45:11 字數 2543 閱讀 6880

目錄

可變引數

可變位置引數

可變關鍵字引數

混合使用

強制關鍵字引數

預設引數

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預設引數有坑?

最近有小夥伴在面試中遇到了 關於函式預設引數的坑 的題目,少數夥伴對此問題理得不是太清楚,今天匯智妹請到匯智動力高階教師鄧老師為大家詳細講解一下,幫助不太清楚的小夥伴清晰的梳理一遍。鄧老師本次主要從以下三點來講解 什麼是預設引數?函式預設引數的坑是什麼?函式預設引數為什麼會有坑?一 什麼是預設引數 ...