不定长参数*args在函数传参时十分有用,他能接收任意个参数,当把星号去掉时,相当于把它接收参数’打包‘,当加上星号时,相当于解包:
def func(*args):
print(*args)
print(args)
func(1,2,3,4,5)
分别会打印:1,2,3,4,5
和 (1,2,3,4,5)
由此可见args是吧元素打包成一个元组了,同理,如果传入**kwargs,然后打印kwargs,是把成对的元素打包成一个字典输出。
然后,当使用嵌套函数时,外层函数,内层函数,同时传入args,那么最后内层函数会使用哪一组args呢?请看:
最后求sum(*args)时,用的是哪一组呢,毫无疑问,用的是(3,4),最后打印出7.请牢记:就近原则,如果内层函数没有接收参数,则他可以用外层函数的参数:
这里,它最后返回3.
其实,外层函数的参数和内层函数的参数可以一起传给内层函数,最终返回一个由两者共同决定的值:
最后返回15.
还要注意*args后面的参数都会变成关键字参数,和只有一个 星号作用相同:
def func(*args,name,age):
print(args,name, age)
func(1,2,3,4,name='sd',age=19)
最终会打印出(1,2,3,4) sd 19
和:
def add(x,*,y,z):
print(x,y,z)
一样,调用的时候需要这样:
add(5,y=7,z=9)