荐 浅谈Python函数的参数
1. 函数参数的分类
函数参数分为形参(parameter)和实参(argument),这两种参数的区别就是:形参用于函数定义,实参用于函数调用。
函数参数还可以分为位置参数和关键字参数。把这句话换一种说法就是:函数参数分为关键字参数和非关键字参数,也可以分成位置参数和非位置参数。位置参数很好理解,函数定义时确定了参数的位置,函数调用时,输入的具体数值会赋值给相应的位置参数。那关键字参数如何理解呢?实际上,关键字(keyword)的中的key就是key-value值的key,强调的是当函数调用时,特定的取值对应特定的参数。
那么位置参数和关键字参数有什么关系呢?举个例子,假如100对新人举办婚礼,入场时要按顺序排成两排,男士一排,女士一排,如果其中2个男士的顺序颠倒了,而女士的顺序没有改变,入场时就会产生麻烦,这就是位置参数的缺点,调用函数时,输入值的顺序必须与位置参数的顺序一致。如果入场之前互相检查一下就可以避免麻烦了,这就意味着男士和女士之间是有对应关系的,关键字参数就强调了变量与取值的对应关系。所以,比起位置参数,关键字参数更加精确。
2. 参数分类之间的关系
想了很久,画了下面这个图,表示形参、实参、位置参数和关键字参数之间的关系。
当函数定义为 def func(arg) 时,函数调用可以使用位置参数,也可以使用关键字参数,示例如下:
def func(arg1,arg2):
print(arg1+" "+arg2+"!")
#下面3条语句输出结果相同
func("Hello",arg2="world")
func(*("Hello","world"))
func(**{"arg2":"world","arg1":"Hello"})
“仅允许使用位置参数”这个性质是python3.8新增的,意思是 / 符号前面的参数只能是位置参数,不能是关键字参数,示例如下:
def func(arg1, arg2, /, arg3):
print(arg1+" "+arg2+","+arg3)
#下面2条语句输出结果相同
func("Hello","world",arg3="zsx0728")
func(*("Hello","world","zsx0728"))
“仅允许使用关键字参数”的意识是,* 符号后面的参数只能是关键字参数,不能是位置参数,示例如下:
def func(*, arg1, arg2):
print(arg1+" "+arg2+"!")
#下面2条语句输出结果相同
func(arg1="Hello",arg2="world")
func(**{"arg1":"Hello","arg2":"world"})
理解了上面的内容就非常好理解可变参数 *arg 和 **kwargs 了。kwargs就是 keyword arguments, **kwargs表示函数调用时只能输入关键字参数,参数作为字典传递,这些参数在函数内部构成一个字典,参数可以是一个或多个; *args表示函数调用时只能输入位置参数,参数以元组形式传递,参数可以是一个或多个。
def func(*args, **kwargs):
for arg in args:
print(arg)
for key, value in kwargs.items():
print("{} : {}".format(key, value))
func(
"caption : Luffy",
*("mate : Zoro","navigator : Nami"),
sniper="Usop",
**{"cook":"Sanj","doctor":"Choppe"}
)
输出值为:
caption : Luffy
mate : Zoro
navigator : Nami
sniper : Usop
cook : Sanj
doctor : Choppe
3. 使用注意事项
函数定义和函数调用时,参数都按先位置参数,后关键字参数的顺序进行定义或输入。
#函数定义时,默认参数(关键字参数)在位置参数前会报错
def complex(kwarg="Hello",arg):
SyntaxError: non-default argument follows default argument
#函数调用时,关键字参数在位置参数前会报错
complex(keyword="Hello",arg)
SyntaxError: positional argument follows keyword argument
参考文献
[1]www.programiz.com.Python Function Arguments[EB/OL].https://www.programiz.com/python-programming/function-argument,2020-01-01.
[2]www.programiz.com.Python *args and **kwargs[EB/OL].https://www.programiz.com/python-programming/args-and-kwargs,2020-01-01.
[3]www.geeksforgeeks.org.*args and **kwargs in Python[EB/OL].https://www.geeksforgeeks.org/args-kwargs-python/,2020-01-01.
[4]Python Software Foundation.术语对照表[EB/OL].https://docs.python.org/zh-cn/3.6/glossary.html#term-argument,2020-06-29.
[5]Python Software Foundation.术语对照表[EB/OL].https://docs.python.org/zh-cn/3.6/glossary.html#term-parameter,2020-06-29.
[6]Python Software Foundation.表达式[EB/OL].https://docs.python.org/zh-cn/3.6/reference/expressions.html#calls,2020-06-29.
本文地址:https://blog.csdn.net/zsx0728/article/details/107089382