Python中有很多奇怪的函数参数传递形式,尤其是在读源码的时候。
函数形参有*args, **kwargs
def func1(*args, **kwargs):
print(args) # (1, 2, 3)
print(kwargs) # {'a': 1, 'b': 2}
if __name__ == '__main__':
func1(1, 2, 3, a=1, b=2)
args是一个元组,接收所有的位置参数,kwargs是一个字典,接收所有的关键字参数。
采用这种方式给函数传参,可以传任意多个参数。
函数形参有 /
def func1(a, b, c, /, d):
print(a, b, c, d)
if __name__ == '__main__':
func1(1, 2, 3, d=4)
/ 前面必须使用位置参数,不能使用关键字参数传参
def func1(a, b, c, /, d):
print(a, b, c, d)
if __name__ == '__main__':
func1(1, 2, c=3, d=4) # TypeError: func1() got some positional-only arguments passed as keyword arguments: 'c'
如果把位置参数c使用关键字传参会报语法错误
函数形参中有*
def func1(a, b, c, *, d):
print(a, b, c, d)
if __name__ == '__main__':
func1(1, 2, 3, d=4)
形参中的*后面必须使用关键字传参,否则会报错
def func1(a, b, c, *, d):
print(a, b, c, d)
if __name__ == '__main__':
func1(1, 2, 3, 4) # TypeError: func1() takes 3 positional arguments but 4 were given