在python 文档 4.10. Mapping Types — dict提到的positional argument即为argument的位置参数。argument在这里的意思是实参(actual parameter)。python中有两种Argument,分别是【位置参数】与【关键字参数】
python函数参数根据使用情况的不同需要分为Parameter和Argument两部分进行讨论。
python中有两种argument,分别是【位置参数】和【关键字参数】
位置参数【positional argument】使用时直接给出参数值,可以是简单值或者是一个带有*前缀的可迭代的元素表示,以内置函数complex()的调用为例:
complex(3,5)
complex(*(3,5))
关键字参数【keyword argument】使用时需要用关键字指明(name=的形式),或是以一个带有**前缀的字典表示,以内置函数complex()的调用为例:
complex(real=3,imag=5)
complex(**{'real':3,'imag':5)
其中你只需要知道单*意味着可迭代的参数——元组,双*意味着关键字参数——字典
下面是对于Parameter的介绍,也即形式参数(formal parameter)。python中有五种parameter,分别是位置或关键字参数【positional or keyword】、仅位置参数【positional-only】、仅关键字参数【keyword-only】、可变位置参数【var-posional】、可变关键字参数【var-keyword】
位置或关键字参数【positional-or-keyword】
位置或关键字参数是python默认的参数类型,它在函数调用时可以以位置参数或关键字参数的形式提供。
def func(foo1,foo2=None):...
其中foo1也可成为非默认参数【no-default-parameter】;foo2可称为默认参数【default parameter】,默认参数带有默认值,可以简化函数调用。注意,在函数定义中默认参数必须在非默认参数之后,在仅关键字参数里面由于赋值需要以关键字为等号所以默认参数可以在仅关键字参数中的任意位置。
仅位置参数【positional-only】
python没有提供定义该参数的语法,它只在一些内置函数中存在,例如abs()。
仅关键字参数【keyword-only】
仅关键字参数定义时需要在其之前紧邻一个可变位置参数或增加一个分隔符*
def person(name,age,*args,city,job):
print(name,age,args,city,job)
定义了关键字参数后必须要把全部的关键字参数传入进去。
没有可变位置参数时,增加一个分隔符*,后面都是仅关键字参数。
def test_arg(city,name,*,age,job):
print(name,age,args,city,job)
仅关键字参数可以设置默认值,从而简化调用,调用时可不传入该关键字参数。
注:使用关键字参数时,必须要添加可变参数,如果缺少分隔符*Python解释器将无法识别positional-or-keyword 和keyword-only
可变位置参数【var-positional】
可变位置参数就是用*args来表示,例如:
def test_arg(*arg):...
*表示将多个参数打包成一个元组
你可以传入任意多个元素到参数中,在函数调用时会自动被认为是一个元组
可变关键字参数【var-keyword】
可变关键字参数在python中习惯用**kwargs表示,可以传入0到任意多个“关键字-值”,参数在函数内部被当作一个字典
def test_arg(**kwargs):...
def test_arg(city,**kwargs):...
**表示将多个关键字参数打包成一个字典
可以这样调用它
test_arg(name='John',job='hoker')
test_arg('beijin',name='john')
关键字参数可以用来后期扩充函数的功能,例如:先设定必要的参数,之后选择性的增加可选参数。
Parameter组合使用时的顺序
位置或关键字参数-非默认参数>位置或关键字参数-默认参数>可变位置参数>仅关键字参数>可变关键字参数