Python:函数:位置参数 --- 1、声明只能在默认参数之前,2、最好老老实实的位置对应
- 简述
- 一、 函数声明时,位置参数与默认参数不可穿插,必须要在默认参数前面。
- 二、函数调用时,位置参数通过<变量名=值>的方法赋值,可能会与位置对应赋值规范冲突
- 三、函数调用时,通过<变量名=值>的方法赋值,造成可变参数无法赋值
- 四、总结
- 相关感悟:何为一般关键字参数?
- 相关感悟:怎么巧用关键字参数隐藏默认值?
简述
1、声明只能在默认参数之前
函数声明时,位置参数与默认参数不可穿插。
更明确的说,位置参数必须在默认参数前面。
不然会报错,SyntaxError: non-default argument follows default argument
2、调用最好老老实实与位置对应,不用<变量名=值>(避免不必要的麻烦)
通过<变量名=值>的方法赋值,可能会与位置对应赋值冲突
通过<变量名=值>的方法赋值,造成可变参数无法赋值。详细说,要给可变参数赋值,位置参数和默认参数,只能用位置对应的方式赋值,不能用<变量名=值>。
3、常见异常
声明时:SyntaxError: non-default argument follows default argument
调用时:SyntaxError: positional argument follows keyword argument
调用时:TypeError: getValue() got multiple values for argument ‘position1’
一、 函数声明时,位置参数与默认参数不可穿插,必须要在默认参数前面。
1、不报错:位置参数在默认参数前面
(1)getValue(position1, position2, default1 = “默认”)
def getValue(position1, position2, default1 = "默认"):
print(position1, position2, default1)
2、报错:位置参数与默认参数穿插(SyntaxError: non-default argument follows default argument)
(1)getValue(default1 = “默认”, position1, position2)
def getValue(default1 = "默认", position1, position2):
print(position1, position2, default1)
(2)getValue(position1, default1 = “默认”, position2)
def getValue(position1, default1 = "默认", position2):
print(position1, position2, default1)
(3)总结
函数声明时,位置参数与默认参数不可穿插。
更明确的说,位置参数必须在默认参数前面。
不然会报错,SyntaxError: non-default argument follows default argument
二、函数调用时,位置参数通过<变量名=值>的方法赋值,可能会与位置对应赋值规范冲突
0、函数体 getValue(position1, position2, default1 = “默认”)
def getValue(position1, position2, default1 = "默认"):
print(position1, position2, default1)
1、不报错:位置对应或全用<变量名=值>
(1)位置一一对应
getValue("matchPosition1", "matchPosition2", "matchDefault")
getValue("matchPosition1", "matchPosition2", default1 = "matchDefault")
getValue("matchPosition1", position2 = "matchPosition2", default1 = "matchDefault")
getValue(position1 = "matchPosition1", position2 = "matchPosition2", default1 = "matchDefault")
(2)全用<变量名=值>的方式赋值(顺序随便打乱)
getValue(position1 = "matchPosition1", position2 = "matchPosition2", default1 = "matchDefault")
getValue(position1 = "matchPosition1", default1 = "matchDefault", position2 = "matchPosition2")
getValue(position2 = "matchPosition2", position1 = "matchPosition1", default1 = "matchDefault")
getValue(position2 = "matchPosition2", default1 = "matchDefault", position1 = "matchPosition1")
getValue(default1 = "matchDefault", position1 = "matchPosition1", position2 = "matchPosition2")
getValue(default1 = "matchDefault", position2 = "matchPosition2", position1 = "matchPosition1")
(3)结果一致
matchPosition1 matchPosition2 matchDefault
2、报错:SyntaxError: positional argument follows keyword argument
(1)getValue(position1 = “matchPosition2”, “matchPosition1”)
getValue(position1 = "matchPosition2", "matchPosition1")
3、报错:TypeError: getValue() got multiple values for argument ‘position1’
(1)getValue(“matchPosition1”, position1 = “matchPosition1”)
getValue("matchPosition1", position1 = "matchPosition1")
4、总结
位置参数通过<变量名=值>的方法赋值,可能会与位置对应赋值规范冲突,造成:
语法错误:SyntaxError: positional argument follows keyword argument
重复错误:TypeError: got multiple values for argument ‘position1’
三、函数调用时,通过<变量名=值>的方法赋值,造成可变参数无法赋值
0、函数体 getValue(position1, position2, default1 = “默认”, *args)
def getValue(position1, position2, default1 = "默认", *args):
print(position1, position2, default1, args)
1、不报错:位置对应 — getValue(“matchPosition1”, “matchPosition2”, “matchDefault”, “matchArgs1”, “matchArgs2”)
getValue("matchPosition1", "matchPosition2", "matchDefault", "matchArgs1", "matchArgs2")
注意,默认值也要对应打出来。这就很不方便。
解决办法参见:《Python:函数:关键字参数:巧用关键字参数----隐藏默认值 (解答:好多内置函数,修改默认值需要通过“形参变量名=值”的方式) 》
https://mp.youkuaiyun.com/mdeditor/83619287#
2、报错:SyntaxError: positional argument follows keyword argument
getValue("matchPosition1", "matchPosition2", default1 = "matchDefault",
"matchArgs1", "matchArgs2")
只要存在<变量名=值>赋值位置参数和默认值参数,就不能有可变参数。
3、总结
要给可变参数赋值,位置参数和默认参数,只能用位置对应的方式赋值,不能用<变量名=值>。
四、总结
声明时候,严格按照顺序;调用时候,位置参数与默认值参数类似,都最好通过位置对应的方式赋值,不用<变量名=值>,拓展性强,避免不必要的错误。
相关感悟:何为一般关键字参数?
参见 https://blog.youkuaiyun.com/weixin_43473435/article/details/83419290
在定义函数时,函数体形参列表中,可变参数(*args)后不带默认值的参数,为调用函数时必须赋值的关键字参数,即一般的关键字参数。
特征
可变参数(*args)后
不带默认值
相关感悟:怎么巧用关键字参数隐藏默认值?
参见 https://blog.youkuaiyun.com/weixin_43473435/article/details/83419185