一、*[参数名]
调用
合法调用
普通调用
*参数名
一般写成*args
, 如:
|
|
可以试着调用func
:
|
|
所以,我们发现,这样的函数可以传任意个参数(包括0),*
会把参数打包成一个tuple
,如(1,)
()
(1, 2, 3)
({}, set(), '', 0)
。
特殊调用
如果已经有一个tuple
对象,想传进去作为args
呢?
首先定义一个tuple
对象:
|
|
错误方法
一般想到的都是这样的方法:
|
|
((1, 2, 3),)? 不应该是(1, 2, 3)吗?
因为系统把它识别为一个args
中的参数,所以args
就是“tuple
中有tuple
”,不对。OH NO!
正确方法
给tuple_object
前面打个*,OK:
|
|
这就是“解包”。
非法调用
如果调用func(a=1, b=2)
呢?请看:
|
|
得到TypeError
:
|
|
错误中,keyword argument
是什么?
keyword argument
是像a=1
b=2
c='Hi'
这样的传参形式。- 简单地说,
keyword argument
就是name=value
形式的传参。
所以,应该用value
形式的传参(英文是positional argument
),而不应该使用name=value
的传参。
默认参数
*[参数名]
的参数不能有默认参数:
如上图,尝试设置默认参数会报SyntaxError
,如果真要设置默认参数,应该用一种类似“手动设置默认值”的办法:
|
|
这样,就有默认值了:
|
|
总结
*[参数名]
表示应使用value
形式传参,参数个数不限,传入后会打包成tuple
,供函数体使用。- 特殊传参方法:
*[tuple object]
- 这种方法不能设置默认值,只能用“手动设置默认值”。
二、**[参数名]
调用
合法调用
普通调用
**参数名
一般写成**kwargs
, 如:
|
|
然后调用func
,但是这个跟上一个相反,必须是name=value
式传参 (这也是为什么它叫kwargs (keyword arguments)
):
|
|
这样的函数可以传任意个keyword argument
(包括0),这里也与上一个相反,会把参数打包成一个dict
,如{'a': 1, 'b': 2, 'c': 3, 'd': 4}
{'_tuple_obj': (), '_set_obj': set(), '_dict_obj': {}}
{}
。
特殊调用
如果已经有一个dict
对象,想传进去作为kwargs
呢?
首先定义一个这样的对象:
|
|
然后,跟上次相似:
|
|
非法调用
如果传递positional argument
呢?请看:
|
|
得到TypeError
:
|
|
所以,这里应该用key=value
形式的传参(英文是keyword argument
),而不应该使用value
的传参方法。
默认参数
与*args
的方法类似,应该用手动设置默认值”的方法:
|
|
这样,就有默认值了:
|
|
总结
**[参数名]
表示应使用key=value
形式传参,参数个数不限,传入后会打包成dict
。- 特殊传参方法:
**[dict object]
- 这种方法不能设置默认值,也只能用“手动设置默认值”。