关于*arg ,**kwargs
def log(name=None): """ 记录函数执行的日志 """ def decorator(func): def wrapper(*args, **kwargs): print('{0}.start...'.format(name)) print(args) print(kwargs) rest = func(*args, **kwargs) print('{0}.end..'.format(name)) return rest return wrapper return decorator @log('from add') def add(a, b, *args, **kwargs): return a + b if __name__ == '__main__': rest = add(5, 6, k=5, v=6) print(rest)
这里的在传入5,6的时候,是传给add中的a=5,b=6吗?然后再5,6传给wrapper的*arg变成元组,k=5, v=6传给**kwargs,然后由于add中的*arg是不定长传参数,所以没有出入参数也不会报错?这样理解对吗
8
收起
正在回答 回答被采纳积分+1
2回答
好帮手乔木
2019-11-10 19:09:02
同学你好:
同学的理解是正确的。
当函数的参数不确定时,可以使用*args 和**kwargs。
*args:表示的就是将实参中按照位置传值,多出来的值都给args,且以元组的方式呈现。
**kwargs:表示的就是形参中按照关键字传值把多余的传值以字典的方式呈现。
例:
def func(name, *args, **kwargs): # 注意:*的不定长参数被当做元组处理,**的不定长参数被当做字典处理 print(name) # Tom print(args) # (1, 2, 3) print(kwargs) # {'a': 4, 'b': 5, 'c': 6} func("Tom",1,2,3, a=4, b=5, c=6)
如果我解决了同学的问题,请采纳!学习愉快^_^。
luluoverflow
2019-11-10 11:04:51
add(a, b, *args, **kwargs) 执行add(5, 6)时有a,b(a = 5, b = 6),而args和kwargs均为空;倘若执行add(5, 6, 7, 8, v=1) 则a = 5 b = 6 args = (7, 8) kwargs = ("v":1).
在我看来(*args, **kwargs)组合像是万能接收器,你传多少个值我都能收,不会报错,但是用不用这些值那就由我决定了。
1.Python零基础入门
- 参与学习 人
- 提交作业 2727 份
- 解答问题 8160 个
想要进入Python Web、爬虫、人工智能等高薪领域,你需要掌握本阶段的Python基础知识,课程安排带你高效学习轻松入门,学完你也能听得懂Python工程师的行业梗。
了解课程
恭喜解决一个难题,获得1积分~
来为老师/同学的回答评分吧
0 星