文章目录一、*[参数名]调用合法调用普通调用特殊调用错误方法正确方法非法调用默认参数总结二、**[参数名]调用合法调用普通调用特殊调用非法调用默认参数总结
一、*[参数名]
调用
合法调用
普通调用
*参数名一般写成*args, 如:
def func(*args):
print(args)
可以试着调用func:
>>> func(1)
(1,)
>>> func()
()
>>> func(1, 2, 3)
(1, 2, 3)
>>> func(dict(), set(), str(), int())
({}, set(), '', 0)
所以,我们发现,这样的函数可以传任意个参数(包括0),*会把参数打包成一个tuple,如(1,) () (1, 2, 3) ({}, set(), '', 0)。
特殊调用
如果已经有一个tuple对象,想传进去作为args呢?
首先定义一个tuple对象:
>>> tuple_object = (1, 2, 3)
>>> print(tuple_object)
(1, 2, 3)
错误方法
一般想到的都是这样的方法:
>>> func(tuple_object)
((1, 2, 3),)
((1, 2, 3),)? 不应该是(1, 2, 3)吗?
因为系统把它识别为一个args中的参数,所以args就是“tuple中有tuple”,不对。OH NO!
正确方法
给tuple_object前面打个*,OK:
>>> func(*tuple_object)
(1, 2, 3)
这就是“解包”。
非法调用
如果调用func(a=1, b=2)呢?请看:
>>> func(a=1, b=2)
得到TypeError:
Traceback (most recent call last):
File "", line 1, in
func(a=1, b=2)
TypeError: func() got an unexpected keyword argument 'a'