本帖最后由 伊利亚 于 2019-10-29 23:54 编辑
位置参数,默认参数,*args,**kwargs
形参:放在所有参数之前 实参:放在所有参数之前 [Python] 纯文本查看 复制代码 def one(name,age,gender='男',*args,**kwargs):[/align] print(name,age,gender,args,kwargs)
one('elijah',18)
>>>: elijah 18 男 () {} 注意:实参,形参只需放在最前并按照顺序传递即可
默认参数: 形参(注意):放在位置参数之后,**kwargs之前 实参:根据形参的位置调整
情况一:(形参)在 位置参数之后,*args和**kwargs之前
实参传递方法之一:实参传递(建议,情况一可用) [Python] 纯文本查看 复制代码 def two(name,age,gender='女',*args,**kwargs):[/align] print(name,age,gender,args,kwargs)
two('elijah',18,'男')
>>>:elijah 18 男 () {}
实参传递方法之二:关键字传递(不建议,视情况而定,第二种情况可用) [Python] 纯文本查看 复制代码 def three(name,age,gender='女',*args,**kwargs):
print(name,age,gender,args,kwargs)
three('elijah',18,gender='男')
>>>:elijah 18 男 () {}
情况二:(形参)在 位置参数之后,**kwargs之前实参传递方法:关键字传递(必须如此) [Python] 纯文本查看 复制代码 def four(name,age,*args,gender='女',**kwargs):[/align] print(name,age,gender,args,kwargs)
four('elijah',18,gender='男')
>>>:elijah 18 男 () {} 注意:不可使用 情况一的方法一,那样会被 *args 收集到 [Python] 纯文本查看 复制代码 def five(name,age,*args,gender='女',**kwargs):[/align] print(name,age,gender,args,kwargs)
five('elijah',18,'男')
>>>:elijah 18 女 ('男',) {} 解析:1. elijah 18 两个实参,会按照顺序传递给 name,age, 2. '男'这个实参传递时,遇到的形参是 *args ,这时就会被 *args 收集,变成元祖的第一个元素 3. 这时 实参 已经传递完毕,形参还有一个默认参数 gender='女' 这造成了正常传递的不正确的结果
关键字参数: 错误:
[Python] 纯文本查看 复制代码 def sex(name, age, gender='女', *args, **kwargs):
print(name, age, gender, args, kwargs)
sex('elijah', 18, gender='男',45,name1='test') 正确:
[Python] 纯文本查看 复制代码 def seven(name, age, gender='女'):
print(name, age, gender)
seven(age=18,gender= '男',name='elijah') 注意:传递给 *args 的实参位置之前不可使用关键字参数
1.这就相当于**kwargs不可放在*args之前
2.但是放在 *args之后,并且存在 **kwargs 时,就会被 **kwargs 收集;**kwargs不存在,就会报错 3.所以关键字参数给位置参数或者默认参数传值是最好不要给不定长传参相配合
不定长传参: 位置:*args在前,**kwargs在后 它们分别接收多值并转换成元祖和字典,在这就不讲关于它们的操作,用元祖和字典的方法操作即可;在这只提及几个知识点。
我们知道*args和**kwargs会把收集的参数合成元祖和字典,知道了这个之后那,我们就可以直接给不定长参数传递元祖和字典,就不需要收集合成的步骤了。
*args: 元祖传入[Python] 纯文本查看 复制代码 card = ('handsome boy','brilliant')
def eight(a,b):
print(a,b)
eight(*card)
>>>:1 2 元祖传入时,如直接解包,形参需要和元祖的元素一一对应
*args: 多参数类型配合 [Python] 纯文本查看 复制代码 def eight(name, age, gender='女', *args, **kwargs):[/align] print(name, age, gender, args, kwargs)
eight('elijah', 18, '男',*('handsome boy','brilliant'))
>>>:elijah 18 男 ('brilliant', 'handsome boy') {}
注意:需要给传递的元祖前加 * 号,不然会把传递的元祖,再次收集合并成元祖的第一个元素 补充:list,set,tuple是可相互转换的,所以也可以当做 *args 的参数传递
**kwargs: 字典传入
[Python] 纯文本查看 复制代码 dic = {'hobby1':'guitar','hobby2':'sketch'}
def ten(hobby1,hobby2):
print(hobby1,hobby2)
ten(**dic)
>>>:guitar sketch 字典传入的时,如直接解包,形参需要和字典的 key 相同
**kwargs: 多参数类型配合 [Python] 纯文本查看 复制代码 def nine(name, age, gender='女', *args, **kwargs):[/align] print(name, age, gender, args, kwargs)
nine('elijah', 18, '男',*{'handsome boy','brilliant'},**{'hobby':['guitar','sketch']}) 注意:传递的字典需要加两个*号
|