一、形參和實參
實參
在函數調用()中出現的參數(外界實際存在的值):實參。值可以爲常量、變量、表達式或三者的組合
形參
在函數定義()中出現的參數:形參。形參就是拷貝實參的值,隨着函數的調用才產生,隨着函數調用結束而銷燬。
在函數的外部不能直接使用函數的形參,因爲函數調用完畢後,形參被銷燬了。
二、實參分類
def fn1(a, b, c):
print(a, b, c)
位置實參
必須按照位置的順序,從左到右爲形參傳遞值
fn1(10, 20, 30) # 10 20 30
fn1(30, 20, 10) # 30 20 10
關鍵字實參
可以不按順序傳遞, 形參按名字取值
fn1(a=10, b=20, c=30) # 10 20 30
fn1(c=30, b=20, a=10) # 10 20 30
位置實參和關鍵字實參混用
- 關鍵字實參必須出現在位置實參後
- 多個位置實參還是按照位置傳參
- 關鍵字實參爲沒有從位置實參拿到值的形參傳值,可以不用按照指定順序
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)
三、形參分類
(一).位置形參的範疇
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(n)
fn(20, 30)
fn(a=200, b=300)
fn(100) # 就給a傳
fn(b=100) # 就給b傳
位置形參與默認形參同時存在
默認形參必須在後
def fn1(a,b,c=10,d=20):
print(a, b, c, d)
位置形參必須傳值,默認形參分情況傳值
fn1(100, 200, d=1000)
3.可變長形參
只能由位置實參來傳值
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) # ('a', 'b')
fn(*b) # (1, 2)
fn(*c) # (1, 2)
fn(*d) # (1, 2)
打散
def fn1(*args):
print(args)
ls = [1, 2, 3, 4, 5]
fn1(ls) # (ls, )
fn1(*ls) # 將ls打散爲1,2,3,4,5再進行傳值=>(1,2,3,4,5)
(二).關鍵字形參的範疇
1.關鍵字形參
def tt(a, b=10, *, c, d=10, e):
print(a, b, c, d, e)
*爲分割線,可以有變量名 *args, 也可以只用來做分隔
a:位置
b:默認
c,e:無值關鍵字形參
d:有值關鍵字形參
注:
a和b有先後順序
c,d, e無先後順序
關鍵字形參必須由關鍵字實參來傳值, 出現在*後的都是關鍵字形參
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)
2.可變長關鍵字形參
用來接收沒有被關鍵字形參接收完的關鍵字形參,也只能由關鍵字實參來傳值,用字典來存放數據。
def fn(*, a, b=20, c, **kwargs):
print(a, b)
print(kwargs)
fn(d=40, e=50, a=10, c=30) # 10 20
{'d': 40, 'e': 50}
整體賦值
dic = {'name': 'Owen', 'age': 18}
def fn1(**kwargs):
print(kwargs)
fn1(**dic) # {'name': 'Owen', 'age': 18}
dd = {
'k1': [1, 2, 3, 4, 5],
'k2': {"name":"Bob"}
}
fn1(**dd) # {'k1': [1, 2, 3, 4, 5], 'k2': {'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.所有關鍵字形參:只能 關鍵字實參 傳值