*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在中间的情况了
总结
- *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参数是啥玩意')