函式的引數 (引數:配合函式運算的值)
引數:
(1)形參:形式引數,在函式的定義處
(2)實參:實際引數,在函式的呼叫處
形參: 普通形參(位置) , 預設形參 , 普通收集形參 , 命名關鍵字形參 , 關鍵字收集形參
實參: 普通實參,關鍵字實參
遵循原則:
形參和實參要一一對應
1.普通形參
# 1.普通形參 # 函式的定義處 """hang,lie是函式的普通形參""" def s_star(hang,lie): i = 0 while i < hang: j = 0 while j < lie: print("*",end="") j+=1 print() i+=1 # 函式的呼叫處 """10,10 是函式的實際引數""" s_star(10,10) s_star(3,8)
2.預設形參
# 2.預設形參 def s_star(hang=10,lie=10): i = 0 while i < hang: j = 0 while j < lie: print("*",end="") j+=1 print() i+=1 # 函式的呼叫處 """ 在函式呼叫時: 如果給予實參,那麼直接使用實際引數 如果沒有給予實參,那麼使用引數預設自帶的值 """ s_star() # 10行10列小星星 s_star(3,8) # 3行8列小星星 s_star(4) # 4行10列小星星
3.普通形參+預設形參
預設形參必須跟在普通形參的身後,順序是一定的
# 3.普通形參 + 預設形參 # 函式的定義處 """預設形參必須跟在普通形參的身後,順序是一定的""" def s_star(hang,lie=10): i = 0 while i < hang: j = 0 while j < lie: print("*",end="") j+=1 print() i+=1 # 函式的呼叫處 s_star(3,3) # 3行3列 s_star(3) # 3行10列 s_star() # error
4.關鍵字實參
關鍵字實參是對具體的某個引數賦值,具體的順序可以打亂
# 4.關鍵字實參 """關鍵字實參是對具體的某個引數賦值,具體的順序可以打亂""" # 函式的定義處 def s_star(hang,a,b,c,d,lie=10): i = 0 while i < hang: j = 0 while j < lie: print("*",end="") j+=1 print() i+=1 # 函式的呼叫處 s_star(hang=4,a=1,b=2,c=3,d=4,lie=5) s_star(c=3,d=4,lie=5,hang=4,a=1,b=2) # 關鍵字實參引數順序可以打亂
5.普通實參+關鍵字實參
關鍵字實參必須跟在普通實參的身後,順序是一定的
# 5.普通實參 + 關鍵字實參 def s_star(hang,a,b,c,d,lie=10): i = 0 while i < hang: j = 0 while j < lie: print("*",end="") j+=1 print() i+=1 # 函式的呼叫處 """關鍵字實參必須跟在普通實參的身後,順序是一定的""" s_star(5,6,99,c=7,d=8,lie=9) s_star(c=7,d=8,lie=9,5,6,99) # error 關鍵字實參必須跟在普通實參的後面 s_star(5,1,c=2,d=3,lie=10,b=5) # ok s_star(5,1,c=2,d=3,lie=10,a=5) # error 重複給a賦值,錯誤
6.要注意區分預設形參和關鍵字實參
預設引數和關鍵字實參 在寫法上一模一樣
預設形參是在函式的定義處
關鍵字實參是在函式的呼叫處
7.普通收集引數 *args
""" 1.普通收集引數: 專門用來收集多餘的沒人要的普通實參 def func(*args): code... *args => arguments(引數) 在args這個引數的前面加上一個*表達普通收集引數,形成一個元組 """ # 基本使用 def func(a,b,c,*args): print(a,b,c) # 1 2 3 print(args) # (4,5,6,7,8) func(1,2,3,4,5,6,7,8) # 計算任意個數的累加和 def func(*args): total = 0 for i in args: total += i print(total) func(1,2,3,4,6,10,11,100)
8.關鍵字收集引數 **kwargs
""" 2.關鍵字收集引數 : 專門用來收集多餘的沒人要的關鍵字實參 def func(**kwargs): code1... **kwargs => keyword arguments 在kwargs引數的前面加上2個**表達關鍵字收集引數,形成一個字典 """ # 基本使用 def func(a=1,b=2,c=3,**kwargs): print(a,b,c) print(kwargs) # {'f': 1, 'g': 2, 'j': 3} func(f=1,g=2,j=3,a=15,b=16,c=17) # 任意個數字符串的拼接 """ 班長:宋雲傑 班花:劉彩霞 班草:劉子濤 吃瓜群眾:牧樹人,晏國彰,劉聰 """ def func(**kwargs): print(kwargs) # 定義一個字典,存放每一位同學的身份 dic = {"monitor":"班長","class_flower":"班花","class_grass":"班草"} strvar1 = "" strvar2 = "" # 遍歷字典中的鍵值對 for k,v in kwargs.items(): print(k,v) # monitor 宋雲傑 class_flower 劉彩霞 class_grass 劉子濤 .... # 判斷鍵是否在字典當中,如果在,獲取對應的身份,拼裝成字串 if k in dic: strvar1 += dic[k] + ":" + v + "\n" # 班長 + ":" + 宋雲傑 + '\n' else: strvar2 += v + "," # 去掉右邊多餘的\n和,形成最後的效果 print(strvar1.strip()) print("吃瓜群眾:"+ strvar2.rstrip(",")) func(monitor="宋雲傑",class_flower="劉彩霞",class_grass="劉子濤",eatgua1="牧樹人",eatgua2="晏國彰",eatgua3="劉聰")
9.命名關鍵字引數
# 3.命名關鍵字引數 """ 定義命名關鍵字引數的兩種方式: (1)def func(a,b,*,c) c是命名關鍵字 (2)def func(*args,c,**kwargs) c是命名關鍵字引數 在函式呼叫時,必須使用命名關鍵字引數來進行賦值 """ # 定義方式一 def func(a,b,*,d,c): print(a,b) # 1 2 print(d) # 3 print(c) # 10 func(1,2,d = 3,c=10) # 定義方式二 def func(*args, c, **kwargs): print(args) # (1, 2, 3, 4, 5, 6) print(c) # 100 print(kwargs) # {'a': 1, 'b': 2, 'd': 6} func(1, 2, 3, 4, 5, 6, a=1, b=2, d=6, c=100)
10.關於* 和 ** 的使用方法
* 和 ** 在函式的定義處,用來做收集操作,打包
* 和 ** 在函式的呼叫處,用來做打散操作,解包
# * 解包列表 def func(a,b,*,c,d): print(a,b) print(c,d) lst = [1,2] # *把列表裡面的所有元素拿出來,當成引數一個一個賦值給func進行呼叫 func(*lst,c=3,d=4) # ** 解包字典 def func(a,b,*,c,d): print(a,b) print(c,d) dic = {"c":3,"d":4} # **把字典裡面的所有元素拿出來,拼裝成鍵=值的引數形式,賦值給func進行呼叫 func(1,2,**dic,) # func( c=3, d=4 ) # *和**的組合 func(*lst,**dic) strvar = "abc" print(*strvar)
11.形參定義的順序
當所有引數都在一起的時候,按照什麼順序定義呢?
引數定義的順序:普通引數 -> 預設引數 -> 普通收集引數 -> 命名關鍵字引數 -> 關鍵字收集引數
收集到所有的實參: def func(*args,**kwargs)
12.關於所有引數混合的練習題
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) # a=1,b=2,c=0,args=(),kw={} f1(1, 2, c=3) # a=1,b=2,c=3,args=(),kw={} f1(1, 2, 3, 'a', 'b') # a=1,b=2,c=3,args=(a,b),kw={} f1(1, 2, 3, 'a', 'b', x=99) # a=1,b=2,c=3,args=(a,b),kw={x:99} f2(1, 2, d=99, ext=None) # a=1,b=2,c=0,d=99,{ext:None} # 第二題 args = (1, 2, 3, 4) kw = {'d': 99, 'x': '#'} f1(*args, **kw) # a=1,b=2,c=3,args=(4,),kw={d:99,x:#} # 第三題 myargs = (1, 2, 3) mykw = {'d': 88, 'x': '#'} f2(*myargs, **mykw) #a=1,b=2,c=3,d=88,kw={x:#} # 第四題 def f1(a, b, c=0, *args,d,**kw): print('a =', a, 'b =', b, 'c =', c, 'args =', args, 'kw =', kw) print(d) f1(1,2,3, 'a', 'b',d=67, x=99,y=77) #a=1,b=2,c=3,args=(a,b),kw={x:99,y:77} d:67