函數的參數分爲形參和實參python
定義函數時括號內聲明的參數,本質是一個變量名,用來接收外部傳來的參數app
調用函數時括號內傳入的值,值能夠是常量、變量、表達式或三種的組合函數
def index(a): # 形參:至關於變量名 print(a) print(b) if a > b: print(a) else: print(b) b = 2 a = 1 index(a) # 實參:至關於變量值
調用函數時經過位置傳入的實參與形參一一對應code
def index(a,b): if a>b: return a else: return b index(1,3)# 按照位置順序向形參中傳參
一、調用函數時按照key=value形式指定實參能夠不按順序傳參it
二、關鍵字參數與位置參數混用時,位置參數必定要在前io
三、而且不能夠對同一個形參重複賦值class
def res(a,b,c,d): print(a,b,c,d) res(1,2,d=3,c=4)#混用關鍵字參數與位置參數,位置參數在前,關鍵字參數在後指定參數傳參
在定義函數時已經爲形參進行賦值,須要常常改變的參數定義成位置參數,不多改變的定義成默認參數容器
一、默認參數必須在位置參數以後基礎
二、默認參數僅在定義階段賦值一次變量
def res(a, b, c, d=5): print(a, b, c, d) d = 8# 在定義時已經被賦值一次,此處修改無效 res(1, 2, c=3)#默認參數能夠在實參中不寫直接調用 res(1, 2, c=3,d=8)# 若是修改默認參數在調用時修改
三、默認參數一般設爲不可變類型
若是設置成可變類型,則每次調用都是在上次調用的基礎上加值
def res(a, b, c, d=[]): d.append(c) print(a, b, c, d) res(1, 2, c=3) res(1, 2, c=3) res(1, 2, c=3) >>> 1 2 3 [3] 1 2 3 [3, 3] 1 2 3 [3, 3, 3]
能夠修改以下:
# 第一種解決方案 def res(a, b, c, d=None): if d == None:# 若是是None則定義一個空列表 d=[] d.append(c) print(a, b, c, d) res(1, 2, c=3) res(1, 2, c=4) res(1, 2, c=5) # 第二種解決方案 def res(a, b, c, d): d.append(c) print(a, b, c, d) res(1, 2, 3,d=[]) res(1, 2, 4,[]) res(1, 2, 5,[])
調用函數時,實參的個數不固定,而實參傳參有位置參數和關鍵字參數,全部有兩種解決方案
一、位置參數*args,在定義階段形參最後一個參數args前加個星號,能夠接受全部實參中的溢出的位置參數,默認以元組的形式保存下來
官方認證爲*args,可是隻要有星號後面是什麼參數都有可變長類型的效果
*是打散傳入的容器類型,若是不打星號就默認轉換溢出的參數造成元組
def res(a, b, c,*args): print(a, b, c,args) res(1, 2, 3,4,5,6,7,8) >>> 1 2 3 (4, 5, 6, 7, 8)
def res(a, b, c,*args): print(a, b, c,*args)# 將輸入的參數原本轉換成元組的,打散 res(1, 2, 3,4,5,6,7,8) >>> 1 2 3 4 5 6 7 8
二、關鍵字參數**kwargs,在定義階段最後一個形參用,將調用時全部溢出的關鍵字參數轉換爲字典{關鍵字:參數}賦值給形參
官方認證爲**kwargs,可是隻要有星號後面是什麼參數都有可變長類型的效果
def res(a, b, c, **kwargs):# 將調用時溢出的關鍵字參數轉換成字典 print(a, b, c, kwargs) res(1, 2, 3, d=1, f=4, e=7) >>> 1 2 3 {'d': 1, 'f': 4, 'e': 7}
def res(a, b, c, **kwargs): print(a, b, c, *kwargs)# 一個*是打散字典拿到key值,打散字典只能是一個* res(1, 2, 3, d=1, f=4, e=7) >>> 1 2 3 d f e
一、在位置可變長參數和關鍵字可變長參之間
二、在調用階段,必定要以關鍵字參數的形式傳值
三、關鍵字參數必定要在位置參數後面
def index(a,b,c=1,*args,d,**kwargs): print(a,b,c,args,d,kwargs) index(1,2,3,4,5,6,d=2,f=4,g=8) >>> # 1 2 3 (4, 5, 6) 2 {'f': 4, 'g': 8}
必須按照定義順序:位置參數,關鍵字參數,*args,命名關鍵字參數,**kwargs