【个人理解,防遗忘】python 中函数*args和**kwargs参数

python 中函数args和kwargs参数

*args

  • *args作为函数的最后一个参数来说的话, 他接受多个单独的值,然后把多个值编组成一个元组,然后在函数体内执行
*args作为参数,在函数的最后出现
def say_something(word, *args):
    print('word is: %s'%word)

    print(type(args)) #打印args的类型
    print(args) # 打印args的值

    for arg in args: # 说args是元组,我们获取元组的每一个值
        print(arg)


say_something('你好','I am', 'your father', 123, 456, 3.1415926) #这里传递的值很多,除去第一个给了word,剩下的都被args收编了.

  • 这里args,作为函数的第一个参数出现,那么在调用的时候,就需要把后面的参数,用关键字来指定才可以,否则
    这个args 回一股脑的把所有的参数都收编了,就会报错,说少了一个参数,所以需要单独指定!!!
*args在最前面
def say_something(*args, word ):
    print('word is: %s'%word)

    print(type(args)) #打印args的类型
    print(args) # 打印args的值

    for arg in args: # 说args是元组,我们获取元组的每一个值
        print(arg)


say_something('你好','I am', 'your father', 123, 456, 3.1415926, word='倒置需要写关键字指定')
  • 同理: 如果args 出现在中间位置,那么args之前的传入的值,会被一一获取并且给之前的参数,然后 如果调用的时候没有用给args后面的指定,就会报错,因为args来者不拒,如果传值的时候,后面用关键字指定了,那么就大家各获取各的
*args在中间
def say_something(hello, *args, word ):
    print('hello is: %s'%hello)

    print('word is: %s'%word)

    print(type(args)) #打印args的类型
    print(args) # 打印args的值

    for arg in args: # 说args是元组,我们获取元组的每一个值
        print(arg)


say_something('你好','I am', 'your father', 123, 456, 3.1415926, word='倒置需要写关键字指定')

**kwargs

**kwargs 大概意思是key-word args,是不是联想到了字典里面的Key-value,其实这个参数用来接收元组的,它可以收编那边传递过来的关键字参数,就是函数括号里面有哪个指定的关键字,把这个关键字作为字典的key
把那个关键字参数的值 作为字典的value

  • **kwargs作为最后一参数
def say_something(word, **kwargs):
    print('word is: %s'%word)


    print(type(kwargs)) #打印args的类型
    print(kwargs) # 打印args的值

    for arg in kwargs.items(): # 说**kwargs是列表,我们获取的每一个值
        print(arg)

say_something('你好', i='i am', your='your father' ,words='测试**kwargs参数是啥玩意')
  • kwargs作为第一个参数,不好意思,系统不允许。。。系统不支持kwargs后面还有参数,即使是*args都不行,如下图片:
    系统不支持**kwargs后面还有参数系统不支持**kwargs后面还有参数,即使是*args都不行所以就不存在**kwargs在中间的情况了

总结

  • *args,可以放在参数的任意位置,放在第一个的时候,后面的需要用关键字参数指定值。
    放在中间某个位置是时候,因为传递过来的值已经被前面的参数接收了,所以前面的不用考虑,只需要考虑后面的,只需要把后面的用关键字参数指定,否则照单全收。。。
    放到最后,前面的传入的值和参数一一对应之后,剩下的照单全收
    本质上是一个元祖,函数体内部无法更改接收的值,但是,但是,但是,但是如果接受的是一个列表啊,字典啊,我们虽然不能更改那个传值的值,但是我们可以修改他传入的那个值的引用,
    某种程度上讲,函数传参有点跟 浅复制一样只是复制了表面,深入的一层引用,还是可以修改的!!!
def say_something(hello, *args, word ):
    print('hello is: %s'%hello)

    print('word is: %s'%word)
    '''modify the list in args'''
    lst = args[0] #获取那个列表
    lst.append('modify') # 修改那个列表
    print(lst)

    print(type(args)) #打印args的类型
    print(args) # 打印args的值

    for arg in args: # 说args是元组,我们获取元组的每一个值
        print(arg)


say_something('你好',['I',' am'], 'your father', 123, 456, 3.1415926, word='倒置需要写关键字指定')
  • **kwargs, 只能放到最后一个位置,而且接收的也必须是关键字参数的那个,key=value的那种,有多少也是照单全收,组成一个字典,这个kwargs字典,完全自由,你可以在里面增删改查,咋办都行。。。
def say_something(*args, **kwargs):
    print(args) #输出args,应该是(,),一个空的元祖
    print(kwargs) #没修改前的

    '''modify the **kwargs'''
    modify_data = kwargs.update(your='你的爷爷')

    print(kwargs)#修改后的
        '''删除其中的words'''
    kwargs.pop('words') #可以删除
    '''新增'''
    kwargs.update(new='新增的字典1', new1='新增的字典2')
    print(kwargs)
say_something(i='i am', your='your father' ,words='测试**kwargs参数是啥玩意')
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值