Python:函数:参数列表 --- 1位置参数,2默认参数,3可变参数,4关键字参数,5可变关键字参数(前后次序严格,不可存在交集)
简述
参数列表 — 1位置参数,2默认参数,3可变参数,4关键字参数,可变关键字参数;前后顺序必须这样,不能有丝毫交际。
一、 实例1:关键字参数不含默认值
0、函数体:getValue(position1, default1 = “默认”, *args, keyName1, **kwargs)
def getValue(position1, default1 = "默认", *args, keyName1, **kwargs):
print("postion1:\t" + position1)
print("default1:\t" + default1)
print("args:\t\t" + str(args))
print("keyName1:\t" + keyName1)
print("kwargs\t\t" + str(kwargs))
print()
1、(最多)包含所有类型的参数–必选参数、默认参数、可变参数、关键字参数、可变关键字参数
调用函数(获得结果相同)
#1
getValue("matchPostion1", "matchDefault1", "matchArgs1", "matchArgs2",
keyName1 = "matchKeyName1", kwargs1 = "matchKwargs1", kwargs2 = "matchKwargs2")
#2
getValue("matchPostion1", "matchDefault1", "matchArgs1", "matchArgs2",
kwargs1 = "matchKwargs1", keyName1 = "matchKeyName1", kwargs2 = "matchKwargs2")
#3
getValue("matchPostion1", "matchDefault1", "matchArgs1", "matchArgs2",
kwargs1 = "matchKwargs1", kwargs2 = "matchKwargs2", keyName1 = "matchKeyName1")
报错:SyntaxError: positional argument follows keyword argument
getValue("matchPostion1", "matchDefault1", keyName1 = "matchKeyName1", "matchArgs1",
"matchArgs2", kwargs1 = "matchKwargs1", kwargs2 = "matchKwargs2")
结果
postion1: matchPostion1
default1: matchDefault1
args: ('matchArgs1', 'matchArgs2')
keyName1: matchKeyName1
kwargs {'kwargs1': 'matchKwargs1', 'kwargs2': 'matchKwargs2'}
总结
关键字参数和可变关键字一样无法提前,只能相互之间、在内部交换
2、(最少)包含必选参数、关键字参数
调用函数(获得结果相同)
#1
getValue("matchPostion1", keyName1 = "matchKeyName1")
#2
getValue(position1 = "matchPostion1", keyName1 = "matchKeyName1")
#3
getValue(keyName1 = "matchKeyName1", position1 = "matchPostion1")
结果
postion1: matchPostion1
default1: 默认
args: ()
keyName1: matchKeyName1
kwargs {}
总结
位置参数,也可以通过形参变量名对应赋值,在这种情况下不受位置限制,与关键字参数任意排列。
3、包含可变关键字参数----位置参数、关键字参数、可变关键字参数
调用函数(获得结果相同)
#1
getValue("matchPostion1", keyName1 = "matchKeyName1", kwargs1 = "matchKwargs1")
getValue("matchPostion1", kwargs1 = "matchKwargs1", keyName1 = "matchKeyName1")
#2
getValue(position1 = "matchPostion1", keyName1 = "matchKeyName1", kwargs1 = "matchKwargs1")
getValue(position1 = "matchPostion1", kwargs1 = "matchKwargs1", keyName1 = "matchKeyName1")
#3
getValue(kwargs1 = "matchKwargs1", position1 = "matchPostion1", keyName1 = "matchKeyName1")
getValue(keyName1 = "matchKeyName1", position1 = "matchPostion1", kwargs1 = "matchKwargs1")
#4
getValue(kwargs1 = "matchKwargs1", keyName1 = "matchKeyName1", position1 = "matchPostion1")
getValue(keyName1 = "matchKeyName1", kwargs1 = "matchKwargs1", position1 = "matchPostion1")
结果
postion1: matchPostion1
default1: 默认
args: ()
keyName1: matchKeyName1
kwargs {}
总结
位置参数,也可以通过形参变量名对应赋值,在这种情况下不受位置限制,与关键字参数、可变关键字参数任意排列。
二、实例2:关键字参数含默认值
0、函数体:getValue(position1, default1 = “默认”, *args, keyName1 = “默认关键字参数”, **kwargs)
def getValue(position1, default1 = "默认", *args, keyName1 = "默认关键字参数", **kwargs):
print("postion1:\t" + position1)
print("default1:\t" + default1)
print("args:\t\t" + str(args))
print("keyName1:\t" + keyName1)
print("kwargs\t\t" + str(kwargs))
print()
1、(最多)包含所有类型的参数–必选参数、默认参数、可变参数、关键字参数、可变关键字参数
调用函数(获得结果相同)
#1
getValue("matchPostion1", "matchDefault1", "matchArgs1", "matchArgs2",
keyName1 = "matchKeyName1", kwargs1 = "matchKwargs1", kwargs2 = "matchKwargs2")
#2
getValue("matchPostion1", "matchDefault1", "matchArgs1", "matchArgs2",
kwargs1 = "matchKwargs1", keyName1 = "matchKeyName1", kwargs2 = "matchKwargs2")
#3
getValue("matchPostion1", "matchDefault1", "matchArgs1", "matchArgs2",
kwargs1 = "matchKwargs1", kwargs2 = "matchKwargs2", keyName1 = "matchKeyName1")
结果
postion1: matchPostion1
default1: matchDefault1
args: ('matchArgs1', 'matchArgs2')
keyName1: matchKeyName1
kwargs {'kwargs1': 'matchKwargs1', 'kwargs2': 'matchKwargs2'}
总结
这种情况与关键字参数不含默认值相同,因为默认值被覆盖。
同时关键字参数和可变关键字一样§无法提前,只能相互之间、在内部交换
2、(最少)只包含位置参数
调用函数(获得结果相同)
#1
getValue("matchPostion1")
#2
getValue(position1 = "matchPostion1")
结果
postion1: matchPostion1
default1: 默认
args: ()
keyName1: 默认关键字参数
kwargs {}
总结
在有可变参数*args的情况下,关键字参数有默认值,可以很好的隐藏该默认值。
位置参数,也可以通过形参变量名对应赋值。
3、(绕过默认值)包含位置参数、可变关键字参数----可变参数绕不过默认参数
调用函数(获得结果相同)
#1
getValue("matchPostion1", kwargs1 = "matchKwargs1", kwargs2 = "matchKwargs2")
#2
getValue(position1 = "matchPostion1", kwargs1 = "matchKwargs1", kwargs2 = "matchKwargs2")
#3
getValue(kwargs1 = "matchKwargs1", position1 = "matchPostion1", kwargs2 = "matchKwargs2")
#4
getValue(kwargs1 = "matchKwargs1", kwargs2 = "matchKwargs2", position1 = "matchPostion1")
无法忽略默认参数,去设置可变参数
getValue("matchPostion1", "matchDefault1", "matchArgs1", "matchArgs2",
kwargs1 = "matchKwargs1", kwargs2 = "matchKwargs2")
结果
postion1: matchPostion1
default1: matchDefault1
args: ('matchArgs1', 'matchArgs2')
keyName1: 默认关键字参数
kwargs {'kwargs1': 'matchKwargs1', 'kwargs2': 'matchKwargs2'}
默认值无法隐藏,灵活性差
结果
postion1: matchPostion1
default1: 默认
args: ()
keyName1: 默认关键字参数
kwargs {}
总结
在有可变参数*args的情况下,关键字参数有默认值,可以很好的隐藏该默认值。
位置参数,也可以通过形参变量名对应赋值。
相关感悟:位置参数要老老实实的?
参见
https://blog.csdn.net/weixin_43473435/article/details/83619287
声明只能在默认参数之前;调用要老老实实使用位置对应,不用<变量名=值>
特征
位置参数必须在默认参数前面。
调用最好老老实实与位置对应,不用<变量名=值>(避免不必要的麻烦),不然可能造成可变参数无法赋值。
相关感悟:何为一般关键字参数?
参见 https://blog.csdn.net/weixin_43473435/article/details/83419290
在定义函数时,函数体形参列表中,可变参数(*args)后不带默认值的参数,为调用函数时必须赋值的关键字参数,即一般的关键字参数。
特征
可变参数(*args)后
不带默认值
相关感悟:怎么巧用关键字参数隐藏默认值?
参见 https://blog.csdn.net/weixin_43473435/article/details/83419185