1. 动态参数
动态参数,表示没有明确定义参数数量,允许传递任意多个参数的函数
args 是 arguments 的缩写,kwargs 是 keyword arguments 的缩写
*args
表示任何多个无名参数,本质上是一个 tuple
**kwargs
表示关键字参数,本质上是一个 dict
1.2 形参 与 实参
函数定义中的参数被称为 形参(形式参数),
在函数调用时传递的值被称为 实参(实际参数)
2. 位置参数(*args)
位置参数必须按照定义的顺序传递
可变长参数(*args)可以接收任意数量的位置参数
示例1:
def func_args(*args):
print(type(args))
print(args)
func_args(1, 'python', [])
打印结果
<class 'tuple'>
(1, 'python', [])
示例2:
def func_args2(x, *args):
print(type(x), x)
print(type(args), args)
func_args2(1, 'python', [])
打印结果
<class 'int'> 1
<class 'tuple'> ('python', [])
示例3:
def func_args3(x, *args, sep='-'):
print(type(x), x)
print(type(args), args)
print(type(sep), sep)
func_args3(1, 'demo', sep='=')
此处 sep='-'
是关键字参数,位于 *args 之后
3. 关键字参数(**kwargs)
def func_kwargs(**kwargs):
print(type(kwargs))
print(kwargs)
func_kwargs(a=1, b='python')
打印结果
<class 'dict'>
{'a': 1, 'b': 'python'}
3.2 组合使用
位置参数和关键字参数可以结合使用,但位置参数必须先于关键字参数
def args_kwargs(x, *args, **kwargs):
print(type(x), x)
print(type(args),args)
print(type(kwargs),kwargs)
args_kwargs(1, 2, 3, a=1, b=2, c=3)
打印结果
<class 'int'> 1
<class 'tuple'> (2, 3)
<class 'dict'> {'a': 1, 'b': 2, 'c': 3}
可查看下 builtins.py
源代码
4. 分析
def text(x=8, y=9, *args):
print(f'x: {x}, y: {y}, args: {args}')
text(1, 2, 3, 4, 5)
打印结果:x: 1, y: 2, args: (3, 4, 5)
def text2(*args, x=8, y=9):
print(f'x: {x}, y: {y}, args: {args}')
text2(1, 2, 3, 4, 5)
打印结果:x: 8, y: 9, args: (1, 2, 3, 4, 5)
text2(1, 2, 3, 4, 5, x=1, y=2)
打印结果:x: 1, y: 2, args: (1, 2, 3, 4, 5)