Python:函数:位置参数 --- 1、声明只能在默认参数之前,2、最好老老实实的位置对应

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

弃用默认参数,改用关键字参数含有默认值。申明函数function(position1, *args, keyName1 = “默认关键字参数”, **kwargs)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值