10 函数的参数
函數的參數
?
實參:調用函數,在括號內傳入的實際值,值可以為常量、變量、表達式或三者的組合-------傳值
形參:定義函數,在括號內聲明的變量名,用來接受外界傳來的值--------接收值
形參隨著函數的調用而產生,隨著調用結束而銷毀
?
實參
為形參傳值;兩種類型都存在:位置實參在前,關鍵字實參在后
分為兩類:
? 位置實參:不用明確形參名的傳參方式,按照位置給形參傳值??????一一對應
關鍵字實參:必須明確形參名字與值為形參傳值,可以不用按照位置?? 按名取值
注:混用
1.關鍵字實參必須出現在位置實參后
2.多個位置實參還是按照位置傳參
3.關鍵字實參為沒有從位置實參拿到值的形參傳值,可以不用按照指定順序
形參與實參:
# ***** 在函數定義()中出現的參數:形參 # ***** 形參就是拷貝實參的值,隨著函數的調用才產生,隨著函數調用結束而銷毀 def fn(a, b, c):# a,b,c必須要從外界獲取值,采用意義print(a)print(b)print(c)# 外部提前產生了的變量,內部可以使用print(x)print(y)print(z)# x,y,z是實際存在的值 x = 10 y = 20 z = 30 # ***** 在函數調用()中出現的參數(外界實際存在的值):實參 # fn(10, 20, 30) #fn(x, y, z) 執行結果: 10 20 30 10 20 30 fn(x + 10, y * 2, z / 5) 執行結果: 20 40 6.0 10 20 30 # ***** 調用函數,實參可以由 常量、變量、表達式或三種的組合# 在函數的外部不能直接使用函數的形參,原因:函數調用完畢后,形參被銷毀了 # print(a) # print(b) # print(c) 執行結果: NameError: name 'a' is not defined實參的混用
def fn1(a, b, c):print(a, b, c)#兩者混用: 關鍵字實參 必須出現在位置實參之后 fn1(10, c=20, a=30) # 10按位置傳參給a,a=30給a傳參,c可以拿到20,但b沒人傳參 TypeError:fn1() got multiple values for argument 'a' a被多次傳值# 合法傳參 ***** fn1(10, c=30, b=20) fn1(10, b=30, c=20)def fn2(a, b, c, d, e, f):print(a, b, c, d, e, f)fn2(10, 20, 30, e=100, f=500, d=200)執行結果:
10
20
30
200
100
500
形參
分為六類:
?? ?? ?位置形參:位置實參與關鍵字實參都可以對其傳參
? ??? ?默認形參:位置實參與關鍵字實參都可以對其傳參,也可以不被傳參
? 可變長位置形參:接收位置形參、默認形參沒有接收完的所有位置實參
有初值關鍵字形參:只能由關鍵字實參傳值,也可以不被傳值
無初值關鍵字形參:只能由關鍵字實參傳值
可變長關鍵字形參:接收兩種關鍵字形參沒有接收完的所有關鍵字實參
def fn(a, b, c=10, *args, d, e=20, f, **kwargs):pass # 位置形參:a、b # 默認形參:c # 可變長位置形參:args # 無初值關鍵字形參:d、f # 有初值關鍵字形參:e # 可變長關鍵字參數:kwargs
1、位置形參positional argument
def fn(a, b, c):print(a, b, c)# 位置形參可以由 位置實參 與 關鍵字實參 來傳值 fn(10, 20, 30) fn(a=10, b=20, c=30)2、默認形參
# 默認形參具有默認值,用=進行復制 def fn(a=10,b=20):print(a, b)# 默認形參可以由 位置實參 與 關鍵字實參 來傳值,還可以不用傳值(采用自身默認值) fn(20, 30) #20,30 fn(a=200, b=300) #200,300 fn(100) #100,20 傳值給a fn(b=100) #10,100傳值給b# 位置形參與默認形參同時存在,默認形參必須在后 def fn1(a,b,c=10,d=20):print(a, b, c, d)# 位置形參必須傳值,默認形參分情況傳值 fn1(100, 200, d=1000) #100,200,10,10003、可變長位置形參
# 可變長形參只能由 位置實參 來傳值 def fn(a, b=10, *args):print(a, b)print(args)# 可變長形參會以元組形式接受 位置形參與默認形參未接受完的 所有傳入的位置實參# 小細節:可變長形參只能接受位置實參的值,位置實參還必須在關鍵字實參前, # 導致默認形參只能由位置實參來傳值 fn(1, 20, 100, 200) 執行結果: 1 20 (100, 200)fn(100) 執行結果: 100 10 ()可變長位置形參的整體賦值
def fn(*args):print(args)fn(1, 2, 3, 4, 5) # (1, 2, 3, 4, 5) a = 'ab' b = [1, 2] c = (1, 2) d = {1, 2} fn(a) # ('ab', ) fn(b) # ([1, 2], ) fn(c) # ((1, 2), ) fn(d) # ({1, 2}, )# 問:就拿a,b,c,d進行傳值,如何得到 ('a', 'b') (1, 2) # *單列集合(保護字符串)將該變量進行 打散 傳值 (本質傳遞的是地址) fn(*a) fn(*b) fn(*c) fn(*d)# 打散 def fn1(*args):print(args) ls = [1, 2, 3, 4, 5] fn1(ls) # (ls, )===>([1, 2, 3, 4, 5],) fn1(*ls) # 將ls打散為1,2,3,4,5再進行傳值=>(1,2,3,4,5)4、關鍵字形參
?? "*"為分割線,可以有變量名 *args, 也可以只用來做分隔
# 前提:出現在 * 之后的形參 def fn(a, b=10, *, c, d=20, e):pass # c,d,e都是出現在*之后,都是關鍵字形參,由于必須由 關鍵字實參 來傳值,沒有順序的強行要求# 可變長關鍵字形參:用來接收沒有被關鍵字形參接收完的關鍵字形參,也只能由關鍵字實參來傳值 # 用字典來存放數據 def fn(**kwargs):print(kwargs) fn(a=10,b=20) # {'a': 10, 'b': 20} dic = {'x': 100, 'y': 200} fn(**dic) # {'x': 100, 'y': 200}?
a:位置 b:默認 c,e:無值關鍵字形參 d:有值關鍵字形參注: a和b有先后順序 c,d, e無先后順序# *****關鍵字形參必須由 關鍵字實參 來傳值, 出現在*后的都是關鍵字形參 def tt(a, b=10, *, c, d=10, e):print(a, b, c, d, e)# keyword-only arguments def fn(*, a, b=10, c):print(a, b, c) # fn(10, 20, 30) # 錯誤:TypeError: fn() takes 0 positional arguments but 3 were given fn(b=300, c=100, a=200)5、可變長關鍵字形參
用來接收沒有被關鍵字形參接收完的關鍵字形參,也只能由關鍵字實參來傳值
用字典來存放數據 def fn(*, a, b=20, c, **kwargs):print(a, b)print(kwargs)fn(d=40, e=50, a=10, c=30)# 整體賦值 dic = {'name': 'Owen', 'age': 18} def fn1(**kwargs):print(kwargs)fn1(**dic)dd = {'k1': [1, 2, 3, 4, 5],'k2': {"name":"Bob"} } fn1(**dd)def fn2(*args):print(args) ll = [1, [1, 2], {"name":"Bob"}] fn2(*ll) # (1, [1, 2], {"name":"Bob"})參數總結
?
def fn(a, b=10, *args, d, f=20, **kwargs):print(a)print(b)print(args)print(d)print(f)print(kwargs)# 由位置實參傳值: args和kwargs如果都能接收到值: # b必須傳值且只能用位置實參傳值,f可以不用傳值 fn(1,2,3,4,d=5,g=6,k=7) 執行結果: 1 2 (3, 4) 5 20 {'g': 6, 'k': 7}# 全部用關鍵字實參傳值 fn(x=100,y=200,d=300,b=400,a=500) 執行結果: 500 400 () 300 20 {'x': 100, 'y': 200}1.位置形參與默認形參: 能用 位置實參 關鍵字實參 傳值
2.可變長位置形參:只能 位置實參 傳值
3.所有關鍵字形參:只能 關鍵字實參 傳值
注:各種形參出現的先后
位置形參 - 默認形參 - 可變長位置形參 - 無|有初值關鍵字形參 - 可變長關鍵字參數
轉載于:https://www.cnblogs.com/zhouyongv5/p/10622266.html
總結
- 上一篇: 大数据和人工智能的关系,超全解析
- 下一篇: Istio 1.1.1 发布,修复漏洞并