关于*arg ,**kwargs
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 | 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:表示的就是形参中按照关键字传值把多余的传值以字典的方式呈现。
例:
1 2 3 4 5 6 | 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积分~
来为老师/同学的回答评分吧