许多初学者或Python爱好者可能都遇到过用星号元组*args和双星号字典**kwargs作为实参来使用的困惑,这里本人举了几个小例子来阐述一下总结心得。
1. 星号元组*args传参,如
:
def fn(a,b,c,d):
print(a,b,c,d)
return
tup = (5,6,7,8)
fn(*tup)
输出结果:5 6 7 8
上述将变量tup,加上*作为实参传入函数中后,即依次对应着形参列表进行赋值,实质上是位置传参,如果形参数量与元组内元素数量不符,则会报数量不匹配的错误。
如果是下面方式定义函数的形参列表,则不会有上述的错误产生~想怎么传参就怎么传参!
def fn(*args):
print(args)
return
tup = (1,2,3,4,5,6,7)
fn(*tup,1,2,3,4,)
输出结果: (1, 2, 3, 4, 5, 6, 7,1,2,3,4)
# 1. 双星号字典kwargs传参,如**
def fn(a,b,c,d):
print(a,b,c,d)
return
dic = {
'a':5,
'b':6,
'c':7,
'd':8,
}
fn(**dic)
输出结果:5 6 7 8
上述将变量dic,加上**作为实参传入函数中后,即依次对应着形参列表进行赋值,实质上为关键字传参,如果形参数量与元组内元素数量不符,则会报数量不匹配的错误。
同理:如果是下面方式定义函数的形参列表,则不会有上述的错误产生~想怎么传参就怎么传参!
def fn(**kwargs):
print(kwargs)
return
dic = {
'a':5,
'b':6,
'c':7,
'd':8,
}
fn(**dic,e=1,f=2)
输出结果:{‘a’: 5, ‘b’: 6, ‘c’: 7, ‘d’: 8, ‘e’: 1, ‘f’: 2}
注意:实参若挨个传输,必须为关键字传参的形式,且关键字变量名不可重复,如fn(**dic,a=1),这样传参就会报错,因为出现了2个a变量。
结论:星号元组和双星号字典的传参方式,可以理解为在普通的元组或者字典变量名前加‘’*‘’或者“**”,并赋予了该变量名特殊的功能:
1.若该特殊变量出现在形参列表中,则会将传入的变量中符合条件的元素纳入到该特殊变量中。 2.若该特殊变量出现在实参列表中,则会将其中的元素拆分成对应元素,并可以被形参列表中的参数获取
以上仅为个人观点,若有疏漏,请各位指点!