May
1st,
2015
* 和 **
参数列表中 *args 和 **kwargs 表示可变长的参数,前者是一个元组,后者是一个词典
# 输出:
# <class 'tuple'>
# <class 'dict'>
def func(*args, **kwargs):
print(type(args))
print(type(kwargs))
if __name__ == '__main__':
func()
使用
就像使用元组和词典一样去使用
# 输出:
# foo
# 100
# ('age', '18')
# ('name', 'Tim')
def func(*args, **kwargs):
for item in args:
print(item)
for item in kwargs.items():
print(item)
if __name__ == '__main__':
func('foo', 100, name='Tim', age='18')
传参规则
- 定义参数时要遵循这种顺序:(normal, default=d, *args, **kwargs)
- 传递参数时:
- 在未指定名字的参数前,python从左到右匹配,覆盖默认值,多出来的值放在args中
- 一旦一个参数指定了名字,那么从这个参数之后的各个参数python不做顺序假设,因此它们都要加上名字——多出来的放在kwargs中,参数个数少了且没有默认值就发生调用错误
- 从第2个规则可知,args必须出现在有指定名字的参数前,但这又是矛盾的(指定名字的参数会发生多个值的错误),因此args和指定名字的参数是不容的
实际上把函数参数控制在2个以内(越少越好)是最好的编程习惯,规则主要为了理解别人写的函数