Python:函数:参数列表 --- 1位置参数,2默认参数,3可变参数,4关键字参数,可变关键字参数(前后次序严格,不可存在交集)

Python:函数:参数列表 --- 1位置参数,2默认参数,3可变参数,4关键字参数,5可变关键字参数(前后次序严格,不可存在交集)

  • 简述
  • 一、 实例1:关键字参数不含默认值
    • 0、函数体:getValue(position1, default1 = "默认", *args, keyName1, **kwargs)
    • 1、(最多)包含所有类型的参数--必选参数、默认参数、可变参数、关键字参数、可变关键字参数
      • 调用函数(获得结果相同)
      • 报错:SyntaxError: positional argument follows keyword argument
      • 结果
      • 总结
    • 2、(最少)包含必选参数、关键字参数
      • 调用函数(获得结果相同)
      • 结果
      • 总结
    • 3、包含可变关键字参数----位置参数、关键字参数、可变关键字参数
      • 调用函数(获得结果相同)
      • 结果
      • 总结
  • 二、实例2:关键字参数含默认值
    • 0、函数体:getValue(position1, default1 = "默认", *args, keyName1 = "默认关键字参数", **kwargs)
    • 1、(最多)包含所有类型的参数--必选参数、默认参数、可变参数、关键字参数、可变关键字参数
      • 调用函数(获得结果相同)
      • 结果
      • 总结
    • 2、(最少)只包含位置参数
      • 调用函数(获得结果相同)
      • 结果
      • 总结
    • 3、(绕过默认值)包含位置参数、可变关键字参数----可变参数绕不过默认参数
      • 调用函数(获得结果相同)
      • 无法忽略默认参数,去设置可变参数
      • 结果
      • 总结
  • 相关感悟:位置参数要老老实实的?
    • 声明只能在默认参数之前;调用要老老实实使用位置对应,不用<变量名=值>
      • 特征
  • 相关感悟:何为一般关键字参数?
    • 在定义函数时,函数体形参列表中,可变参数(*args)后不带默认值的参数,为调用函数时必须赋值的关键字参数,即一般的关键字参数。
      • 特征
  • 相关感悟:怎么巧用关键字参数隐藏默认值?
    • 弃用默认参数,改用关键字参数含有默认值。申明函数function(position1, *args, keyName1 = "默认关键字参数", **kwargs)

简述

参数列表 — 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

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

你可能感兴趣的:(python)