可变参数*args 和 **kwargs
作为函数定义时:收集未匹配参数组成tuple或dict对象
*参数
也就是*args
收集所有未匹配的位置参数组成一个tuple对象,局部变量args指向此tuple对象
**参数
也就是**kwargs
收集所有未匹配的关键字参数组成一个dict对象,局部变量kwargs指向此dict对象
def temp(*args,**kwargs):
pass
作为函数调用时:解包功能
*参数
用于解包tuple对象的每个元素,作为一个一个的位置参数
传入到函数中
my_tuple = ("w","y","z")
temp(*my_tuple)
#---等同于---#
temp("w","y","z")
**参数
用于解包dict对象的每个元素,作为一个一个的关键字参数
传入到函数中
my_dict = {"name":"wangyuanwai","age":32}
temp(**my_dict)
#----等同于----#
temp(name="wangyuanwai",age=32)
定义函数时候,参数*args在前,**kwargs在后
,*args和**kwargs组合起来可以传入任意的参数。
Python函数 — 位置参数和关键字参数
*args例子
*args作为参数 定义函数 收集所有未匹配的参数,封存在一个list里
def print_str(first, *second):
print(first)
print(second)
# 定义一个函数,*second作为不定参数
此时我们只传入一个参数
print_str("hello")
输出会是
hello
()
传入的第一个字符串参数"hello"打印出来了,没有传入参数的*second则打印的是一个tuple对象的字符串表示形式
,即一个括号"()" 。 注意:()表示含有0个元素的tuple对象!
函数调用时的 *args 进行解包
调用print_str()函数时,直接传入一个 *参数会发生什么?
def print_str(first, *second):
print(first)
print(second)
numbers_strings = ("1","2","3","4","5")
print_str(*numbers_strings)
输出结果为:
1
('2', '3', '4', '5')
*numbers_strings
出现在函数调用时,称为解包(一个“*”字符后面紧挨着1个tuple对象),numbers_strings自身是一个tuple对象,所以也称为元组的解包,tuple中的元素解包成一个一个的位置参数传入到函数中,所以才有下面两个语句的相等性!
**kwargs例子
函数定义中,参数名称前有两个** 收集所有未匹配的参数,封存在一个字典里
定义一个函数,这里用到了*args 和 **kwargs
def printStr(first,second,*args,**kwargs):
print(first)
print(second)
print(args)
print(kwargs)
然后进行函数的调用,
printStr('first','second','third','fourth',fifth = '5')
输出结果为:
first
second
('third', 'fourth')
{'fifth': '5'}
kwargs字典收集了{‘fifth’: ‘5’}这个键值对。当然,在写函数的时候,如果需要取得这个’fifth’: ‘5’,使用字典的get()方法比较好。
函数调用时,传入的关键字参数有匹配的位置参数时,则位置参数优先使用(匹配)
这些关键字参数,剩余所有未使用(未匹配)
的关键字参数会在函数内组装进一个dict对象中,组装后dict对象会赋值给变量名anything,此时局部变量anything指向一个dict对象
注意:**参数只收集未匹配的关键字参数
函数调用时使用字典解包功能(dict对象前加**)
def printStr(first, **dict):
print(str(first) + "\n")
print(dict)
传入一个字典,用**进行解包
printDic = {"name": "tyson", "age":"99"}
printStr(100, **printDic)
相当于
printDic = {"name": "tyson", "age":"99"}
printStr(100, name = "tyson", age = "99")
又一个例子
my_dict = {"name":"wang","age":32}
temp(**my_dict)
#----等同于----#
temp(name="wang",age=32)