Python 动态参数(*args 和 **kwargs)

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)

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容