Pytho函数中args和*kwargs 郝伟 2021/03/18 [TOC]
1. 1 简介
在Python的函数定义中, 我们可以看到有类似 fun(v1, *args, **kwargs) 这样的内容,其中*args, **kwargs 到底指什么,本文将通过一个实例进行简介。
2. 2 问题
回答*args, **kwargs 到底指什么之前,我们先看这样一个问题:
假设有这样的一个函数:fun('test', id=1035, name="Jack", birthday='1992/03/12', sex='m', height='182', weight='75.2kg')。这个函数有很多的参数,而且参数的个数可能不固定,那么如果让你来设计这个函数,怎样设计函数 fun 最简单呢?
3. 3 分析
答案是使用 **kwargs 进行定义,函数可以定义为:
def fun(s, **kwargs):
print(s.center(40, '*'))
for key in kwargs:
print(key + ':', kwargs[key])
则调用后显示为:
******************test******************
id: 1035
name: Jack
birthday: 1992/03/12
sex: m
height: 182
weight: 75.2kg
可以看到传送的参数都被整合到了字典 **kwargs 中,而在函数体内,可以以字典的操作方式对args进行操作。
类似的,如果参数中不带变量名,比如:fun1('fun1', 1, 2),这时使用字典就因为缺少键值而无法接收,但是可以使用列表接收,方式是只写一个星号,即 fun1(s, *args),则 *args 中会按顺序接收未指定的参数,其数据类型为 list 类型。
另外,要特别指出一点,*args 和 **kwargs 的名称不是固定的,只要是使用了个星号就是列表,两个星号就是字典,比如列表可以定义为 *kvs, *arg_list,而 **kwargs 可以定义为 **kvs。关于默认的名称,args 是 arguments(参数)的缩写,而 kwargs 是 keyword arguments 的缩写。
4. 4 示例扩展
下面看一个完整的示例:
def fun1(s, *args_list): # 这里*args_list表示列表参数
print(s.center(40, '*'))
print('type(args_list): ', type(args_list))
print(args_list)
def fun2(s, **kwargs_dict): # 这里*args_dict表示字典参数
print(s.center(40, '*'))
print('type(args): ', type(args))
for key in args:
print(key + ':', args[key])
def fun3(s, *args_list, **kwargs_dict):
print(s.center(40, '*'))
print('type(args_list): ', type(args_list))
print('type(args_dict): ', type(args_dict))
print(args_list)
for key in args_dict:
print(key + ':', args_dict[key])
fun1('fun1', 1, 2)
fun2('fun2', id=1035, name="Jack", birthday='1992/03/12', sex='m', height='182', weight='75.2kg')
fun3('fun3', 1, 2, 'hello', id=1035, name="Jack", birthday='1992/03/12', sex='m', height='182', weight='75.2kg')
以上代码输出为
******************fun1******************
type(args_list): <class 'tuple'>
(1, 2)
******************fun2******************
type(args): <class 'dict'>
id: 1035
name: Jack
birthday: 1992/03/12
sex: m
height: 182
weight: 75.2kg
******************fun3******************
type(args_list): <class 'tuple'>
type(args_dict): <class 'dict'>
(1, 2, 'hello')
id: 1035
name: Jack
birthday: 1992/03/12
sex: m
height: 182
weight: 75.2kg
5. 5 小结
所以 *args 是用于接收多个不定长度的参数作为列表传入,而 **kwargs 则是将同时带有键和值的传入参数作为字典进行统一处理。