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 则是将同时带有键和值的传入参数作为字典进行统一处理。

results matching ""

    No results matching ""