关于*arg ,**kwargs

关于*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是不定长传参数,所以没有出入参数也不会报错?这样理解对吗

正在回答 回答被采纳积分+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积分~

来为老师/同学的回答评分吧

0 星
1.Python零基础入门
  • 参与学习           人
  • 提交作业       2727    份
  • 解答问题       8160    个

想要进入Python Web、爬虫、人工智能等高薪领域,你需要掌握本阶段的Python基础知识,课程安排带你高效学习轻松入门,学完你也能听得懂Python工程师的行业梗。

了解课程
请稍等 ...
意见反馈 帮助中心 APP下载
官方微信

在线咨询

领取优惠

免费试听

领取大纲

扫描二维码,添加
你的专属老师