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